Mercurial > emacs
changeset 83474:d08a7ef0cb8a
Merged from emacs@sv.gnu.org
Patches applied:
* emacs@sv.gnu.org/emacs--devo--0--patch-91
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-92
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-93
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-94
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-95
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-96
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-97
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-98
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-99
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-100
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-101
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-102
Merge from erc--emacs--0
* emacs@sv.gnu.org/emacs--devo--0--patch-103
Update from CVS: src/regex.c (extend_range_table_work_area): Fix typo.
* emacs@sv.gnu.org/emacs--devo--0--patch-104
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-30
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-31
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-32
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-33
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-34
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-35
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-36
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-514
author | Karoly Lorentey <lorentey@elte.hu> |
---|---|
date | Mon, 20 Feb 2006 16:30:15 +0000 |
parents | 428d132b4028 (current diff) cc68ef6b0d93 (diff) |
children | 88cd30b5064d |
files | admin/FOR-RELEASE lisp/ChangeLog lisp/allout.el lisp/emulation/viper-init.el lisp/emulation/viper-util.el lisp/files.el lisp/help-fns.el lisp/mh-e/ChangeLog lisp/net/rcirc.el lisp/progmodes/gdb-ui.el lispref/ChangeLog man/ChangeLog man/emacs.texi src/alloc.c src/window.c src/xdisp.c src/xmenu.c src/xterm.c |
diffstat | 77 files changed, 3748 insertions(+), 2699 deletions(-) [+] |
line wrap: on
line diff
--- a/admin/FOR-RELEASE Thu Feb 16 16:18:54 2006 +0000 +++ b/admin/FOR-RELEASE Mon Feb 20 16:30:15 2006 +0000 @@ -43,6 +43,12 @@ * BUGS +** Reiner Steib's 23 Jan 2006 bug report that tool bar icons don't update. + +** Ralf Angeli's 4 Jul 2005 bug report about scroll-preserve-screen-position. + +** Martin Rudalics' 30 Jan 2006 bug report about overlays at end of buffer. + ** TCP server processes do not work on Windows. TCP/IP server processes created with `make-network-process' consume
--- a/etc/ChangeLog Thu Feb 16 16:18:54 2006 +0000 +++ b/etc/ChangeLog Mon Feb 20 16:30:15 2006 +0000 @@ -1,3 +1,17 @@ +2006-02-18 Bill Wohler <wohler@newt.com> + + Release MH-E version 7.92. + + * NEWS, MH-E-NEWS: Update for MH-E release 7.92. + +2006-02-17 Kenichi Handa <handa@m17n.org> + + * TUTORIAL.translators (TUTORIAL.cn): Update the maintainer. + +2006-02-17 Sun Yijiang <sunyijiang@gmail.com> + + * TUTORIAL.cn: Reworked. + 2006-02-14 Chong Yidong <cyd@stupidchicken.com> * NEWS: Changes in handling of file local variables.
--- a/etc/ERC-NEWS Thu Feb 16 16:18:54 2006 +0000 +++ b/etc/ERC-NEWS Mon Feb 20 16:30:15 2006 +0000 @@ -1,6 +1,8 @@ ERC NEWS -*- outline -*- -* Changes in ERC 5.1.2 (unreleased) +* Changes in ERC 5.2 (unreleased) + +* Changes in ERC 5.1.2 ** Fix compiler errors in erc-autojoin.el and erc-dcc.el.
--- a/etc/MH-E-NEWS Thu Feb 16 16:18:54 2006 +0000 +++ b/etc/MH-E-NEWS Mon Feb 20 16:30:15 2006 +0000 @@ -6,6 +6,14 @@ are permitted in any medium without royalty provided the copyright notice and this notice are preserved. +* Changes in MH-E 7.92 + +Version 7.92, the third 8.0 beta release, removes the "sed -i" in the +Makefile (SF #1432060), tunes the setting of `mh-image-load-path', +works around systems that do not have face inheritance, fixes several +issues with searching on XEmacs, and creates the correct MIME type +when including OpenOffice documents. + * Changes in MH-E 7.91 Version 7.91 is the second 8.0 beta release and fixes several bugs
--- a/etc/NEWS Thu Feb 16 16:18:54 2006 +0000 +++ b/etc/NEWS Mon Feb 20 16:30:15 2006 +0000 @@ -1870,24 +1870,32 @@ *** Topic cryptography added, enabling easy gpg topic encryption and decryption. Per-topic basis enables interspersing encrypted-text and -clear-text within a single file to your hearts content, using symmetric +clear-text within a single file to your heart's content, using symmetric and/or public key modes. Time-limited key caching, user-provided symmetric key hinting and consistency verification, auto-encryption of pending topics on save, and more, make it easy to use encryption in powerful ways. -*** many substantial fixes and refinements, including: +*** Default command prefix changed to "\C-c " (control-c space), to avoid +intruding on user's keybinding space. Customize the +`allout-command-prefix' variable to your preference. + +*** Allout now uses text overlay's `invisible' property (and others) for +concealed text, instead of selective-display. This simplifies the code, in +particularly avoiding the need for kludges for isearch dynamic-display, +discretionary handling of edits of concealed text, undo concerns, etc. + +*** Many substantial fixes and refinements, including: - repaired inhibition of inadvertent edits to concealed text - repaired retention of topic body hanging indent upon topic depth shifts - - prevent "containment discontinuities" where a topic is shifted deeper - than the offspring-depth of its container - - easy to adopt the distinctive bullet of a topic in a topic created - relative to it, or select a new one, or use the common topic bullet - - plain bullets, by default, now alternate between only two characters - ('.' and ','), yielding less cluttered outlines - - many internal fixes - - version number incremented to 2.1 + - refuse to create "containment discontinuities", where a + topic is shifted deeper than the offspring-depth of its' container + - bulleting variation is simpler and more accommodating, both in the + default behavior and in ability to vary when creating new topics + - many internal fixes and refinements + - many module and function docstring clarifications + - version number incremented to 2.2 ** The variable `woman-topic-at-point' was renamed to `woman-use-topic-at-point' and behaves differently: if this @@ -2999,7 +3007,7 @@ --- ** MH-E changes. -Upgraded to MH-E version 7.91. There have been major changes since +Upgraded to MH-E version 7.92. There have been major changes since version 5.0.2; see MH-E-NEWS for details. ** Calendar changes:
--- a/etc/TUTORIAL.cn Thu Feb 16 16:18:54 2006 +0000 +++ b/etc/TUTORIAL.cn Mon Feb 20 16:30:15 2006 +0000 @@ -1,150 +1,136 @@ -Emacs ¿ìËÙÖ¸ÄÏ. +Emacs ¿ìËÙÖ¸ÄÏ£¨²é¿´°æȨÉùÃ÷ÇëÖÁ±¾ÎÄĩ⣩ + +¡¾×¢Ò⣺λÓÚ¡¾¡¿Ö®¼äµÄÄÚÈÝÊÇÒë×¢£¬±ÈÈç±¾ÐУ¬ÏÂͬ¡£¡¿ -Emacs Ö¸Áîͨ³£°üº¬ÓÐ CONTROL ¼ü£¨ÓÐʱºòÒÔ CTRL »ò CTL À´±êʾ£©»òÊÇ -META ¼ü£¨ÓÐʱºòÒÔ EDIT »ò ALT À´±êʾ£©¡£ÎªÁ˱ÜÃâÿһ´Î¶¼ÒªÐ´³öÆäÈ«Ãû£¬ -ÎÒÃǽ«»áʹÓÃÏÂÊöµÄËõд£º +Emacs ¼üÅÌÃüÁîͨ³£°üº¬ CONTROL ¼ü£¨ÓÐʱºòÒÔ CTRL »ò CTL À´±êʾ£©ºÍ +META ¼ü£¨ÓÐʱºòÓà EDIT »ò ALT À´±êʾ£©¡£ÎªÁ˱ÜÃâÿ´Î¶¼ÒªÐ´³öÈ«Ãû£¬ÎÒÃÇ +Ô¼¶¨Ê¹ÓÃÏÂÊöËõд£º - C-<chr> ±íʾµ±¼üÈë×ÖÔª <chr> ʱ °´×¡ CONTROL ¼ü¡£ - Òò´Ë£¬C-f ¾ÍÊÇ£º°´×¡ CONTROL ¼üÔÙ¼üÈë f ¡£ - M-<chr> ±íʾµ±¼üÈë×ÖÔª <chr> ʱ °´×¡ META »ò EDIT »ò ALT ¼ü¡£ - Èç¹ûûÓÐ META ¡¢ EDIT »ò ALT ¼üʱ£¬Ôò¿ÉÒÔÓà - ¡¸°´Ò»Ï ESC ¼üÈ»ºó·Å¿ª£¬ÔÙ¼üÈë <chr> µÄ²½Ö衹 - À´×÷ΪÌæ´ú¡£ÎÒÃÇÒÔ <ESC> À´±íʾ ESC ¼ü¡£ + C-<chr> ±íʾµ±ÊäÈë×Ö·û <chr> ʱ°´×¡ CONTROL ¼ü¡£ + Òò´Ë C-f ¾Í±íʾ£º°´×¡ CONTROL ¼üÔÙÊäÈë f¡£ -ÖØÒª±¸Íü¼£ºÒªÀ뿪 Emacs ²Ù×÷½×¶Î£¨ session £©£¬¼üÈë C-x C-c £¨Á½¸ö×Ö -Ôª£©¡£Î»ÔÚ×ó²à±ß½çµÄ¡¸>>¡¹×ÖÔªÊÇÈÃÄú¿ÉÒÔÊÔÖøʹÓõÄÖ¸ÁîµÄÌáʾ¡£¾ÙÀýÀ´Ëµ£º + M-<chr> ±íʾµ±ÊäÈë×Ö·û <chr> ʱ°´×¡ META£¨»ò EDIT »ò ALT£©¼ü¡£ + Èç¹ûÄãµÄ¼üÅÌÉÏûÓÐ META ¡¢EDIT »ò ALT ¼ü£¬ÓÃÏÂÊö·½·¨Ò²µÈЧ£º + ÏÈ°´Ò»Ï ESC ¼üÈ»ºó·Å¿ª£¬ÔÙÊäÈë <chr>¡£ÎÒÃÇÓà <ESC> À´±íʾ + ESC ¼ü¡£ + +ÖØÒªÌáʾ£ºÒªÍ˳ö Emacs£¬ÇëÓà C-x C-c£¨Á½¸öÁ¬ÐøµÄ×éºÏ¼ü£©¡£ÏÂÎÄÖÐ×ó±ß¶¥ +Ðеġ°>>¡±×ÖÑùÓÃÀ´ÌáʾÄã³¢ÊÔ¼üÅÌÃüÁî¡£±ÈÈ磺 <<Blank lines inserted around following line by help-with-tutorial>> -[Middle of page left blank for didactic purposes. Text continues below] ->> ÏÖÔÚ¼üÈë C-v £¨ View next screen £©ÒÔÒƵ½Ï¸öÓ©Ä»¡£ - £¨ÊÔÊÔ¿´£¬¼üÈë×ÖÔª v ʱ£¬°´×¡ CONTROL ¼ü£© - ´ÓÏÖÔÚ¿ªÊ¼£¬ÄúÓ¦¸ÃÔÚÿ´ÎÔĶÁÍêÄ¿Ç°µÄөĻʱ×öÒ»´ÎÕâ¸ö¶¯×÷¡£ - -ҪעÒâµÄÊÇ£¬µ±Äú´ÓÒ»¸öÓ©Ä»ÒƵ½ÁíÒ»¸öʱ£¬Öмä»áÓÐÁ½ÐÐÖظ´£»ÕâÑù×öÊÇΪÁË -ÌṩһЩÁ¬ÐøÐÔ£¬ÈÃÄú¿ÉÒÔ½ÓÐøµØÔĶÁÎÄ×Ö¡£ +[±¾Ò³µ±ÖÐÌØÒâÁô³öһЩ¿Õ°×ÊdzöÓÚ½ÌѧĿµÄ£¬Çë¼ÌÐøÍùºó¿´] +>> ÏÖÔÚÊäÈë C-v £¨²é¿´ÏÂÒ»ÆÁÎÄ×Ö£©Òƶ¯µ½ÏÂÒ»ÆÁ¡£ + £¨±ð½ôÕÅ£¬ÔÚÊäÈë×Ö·û v µÄͬʱעÒâÒª°´×¡ CONTROL ¼ü£© + ´ÓÏÖÔÚ¿ªÊ¼£¬Ã¿¶ÁÍ굱ǰһÆÁÄ㶼ÐèÒªÕâÑù×öÒ»´Î¡£ -ÄúÐèÒªÖªµÀµÄµÚÒ»¼þÊÂÊÇÈçºÎÔÚÎÄ×ÖÖÐÒƶ¯¡£ÄúÒѾ֪µÀÁË¿ÉÒÔ C-v À´ÏòÇ°ÒÆ -¶¯Ò»¸öÓ©Ä»¡£ÒªÏòºóÒƶ¯Ò»¸öÓ©Ä»£¬Ôò¼üÈë M-v £¨°´×¡ META ¼ü£¬È»ºó¼üÈë v -£¬»òÊÇÈç¹ûÄúûÓÐ META ¡¢ EDIT »ò ALT ¼üʱ¼üÈë <ESC>v £©¡£ +ÖµµÃ×¢ÒâµÄÊÇ£¬µ±Äã´ÓÉÏÒ»ÆÁ¹öµ½ÏÂÒ»ÆÁʱ£¬Öмä»áÓÐÁ½ÐеÄÖظ´£»ÕâÑù×öÊÇΪ +ÁËά³Ö¹öÆÁµÄÁ¬ÐøÐÔ£¬·½±ãÄã˳³©¡¢Á¬ÐøµØÔĶÁ¡£ ->> ÊÔÖø¼üÈë M-v È»ºó C-v £¬Á¬Ðø¸ö¼¸´Î¡£ +Óñà¼Æ÷£¬¿ªÃŵÚÒ»¼þʾÍÊÇѧ»áÔÚÎÄ×ÖÖÐÒƶ¯¡£ÄãÒѾ֪µÀÁË C-v ¿ÉÒÔÏòÏÂÒÆ +¶¯Ò»ÆÁ£¬ÒªÍùÉÏÒÆ£¬ÇëÓà M-v £¨Ò²¾ÍÊÇ°´×¡ META ¼ü£¬È»ºóÊäÈëv£¬Èç¹ûÄãûÓÐ +META¡¢EDIT »ò ALT ¼üÄÇô¾ÍÏÈ°´ <ESC> ÔÙ°´ v£©¡£ -¡¾ÏÖÔÚÄú¿ÉÒÔ C-v Ö¸ÁîÒƵ½ºóÃ桸·Ò롹һ½Ú£¬ÒÔÈ¡µÃ¹Ø춱¾ÎĵķÒëÏà¹ØÊ -ÏȻºóÒÔ M-v Ö¸Áî»Øµ½ÕâÀï¡£¡¿ +>> ÊÔÊÔ M-v£¬È»ºóÔÙÊÔÊÔ C-v£¬À´»ØåÞ¼¸´Î¡£ -* ÕªÒª£¨ SUMMARY £© -------------------- +* С½á£¨SUMMARY£© +----------------- -ÒÔϵÄÖ¸ÁîÔÚ¼ìÔÄөĻʱÏ൱ÓÐÓ㺡¾ÎÒÃÇÏÖÔÚÒÔ¡¸Ó©Ä»¡¹À´±íʾ¡¸ÏÔʾµµ°¸ÄÚ -ÈݵÄÇøÓò¡¹£¬ÒòΪĿǰÊÇ´¦ÔÚ Emacs Öеĵ¥´°¸ñ£¨ window £©ÏÔʾ״̬£¬Èç¹û -ÊÇÔڶര¸ñµÄ״̬Ï£¬ÕâÀïËù½éÉܵÄÖ¸ÁîÔò×÷ÓÃÔÚ¡¸¹¤×÷ÖеĴ°¸ñ¡¹¡£ÓйØ춴° -¸ñµÄ½éÉÜ£¬Çë¼û´°¸ñ£¨ windows £©Ò»½Ú¡£¡¿ +ÒÔÏÂÃüÁîÔÚ·Ò³ä¯ÀÀʱÏ൱ÓÐÓ㺠- C-v ÏòÇ°Òƶ¯Ò»¸öÓ©Ä»£¯´°¸ñ - M-v ÏòºóÒƶ¯Ò»¸öÓ©Ä»£¯´°¸ñ - C-l Çå³ýÓ©Ä»£¯´°¸ñ£¬ÔÙÖØÐÂÏÔʾËùÓÐÎÄ×Ö£¬ - ÓαêËùÔÚλÖûáÏÔʾì¶Ó©Ä»£¯´°¸ñµÄÖÐÑë¡£ - £¨ÊÇ CONTROL-L ¶ø²»ÊÇ CONTROL-1 £© + C-v ÏòÇ°Òƶ¯Ò»ÆÁ + M-v ÏòºóÒƶ¯Ò»ÆÁ + C-l ÖØ»æÆÁÄ»£¬²¢½«¹â±êËùÔÚÐÐÖÃÓÚÆÁÄ»µÄÖÐÑë + £¨×¢ÒâÊÇ CONTROL-L£¬²»ÊÇ CONTROL-1£© ->> ÕÒ³öÓαêµÄλÖ㬲¢×¢ÒâÆ丽½üµÄÎÄ×ÖΪºÎ¡£È»ºó¼üÈë C-l ¡£ - ÔÙ´ÎÕÒ³öÓαêµÄλÖã¬È·ÈÏÒ»ÏÂÏàͬµÄÎÄ×ÖÏÖÔÚҲλÔÚÆ丽½ü¡£ +>> ÕÒµ½¹â±ê£¬ÁôÒâÆ丽½üµÄÎÄ×Ö£¬È»ºóÊäÈë C-l¡£ + ÕÒÕÒ¹â±êÔÚÄÄÀÄã»á·¢ÏÖÆ丽½üµÄÎÄ×Ö²¢Ã»Óб仯¡£ -Èç¹ûÄúµÄÖն˻úÓÐ PageUp Óë PageDn ¼üµÄ»°£¬ÄúÒ²¿ÉÒÔʹÓÃËüÃÇÀ´ÒÔөĻΪµ¥ -λµØÒƶ¯£¬µ«ÊÇʹÓà C-v ºÍ M-v »á±È½ÏÓÐЧÂÊ¡£ +Èç¹ûÄãµÄ¼üÅÌÉÏÓÐ PageUp ºÍ PageDn£¬Ò²¿ÉÒÔÓÃÕâÁ½¸ö¼üÀ´¹öÆÁ¡£²»¹ýʹÓà +C-v ºÍ M-v µÄЧÂÊÒª¸ü¸ßһЩ¡£ -* »ù±¾µÄÓαê¿ØÖÆ£¨ BASIC CURSOR CONTROL £© ------------------------------------------- +* »ù±¾µÄ¹â±ê¿ØÖÆ£¨BASIC CURSOR CONTROL£© +---------------------------------------- -Ó©Ä»µ½Ó©Ä»µÄÒƶ¯ÊǺÜÓÐÓ㬵«ÊÇÄúÈçºÎÒƶ¯µ½Î»ì¶Ó©Ä»ÄÚÎÄ×ÖÖеÄÌض¨Î»ÖÃÄØ£¿ +ÕûÆÁµÄÒƶ¯ºÜÓÐÓ㬵«ÊÇÈçºÎÔÚÎÄ×ÖÖо«È·¶¨Î»ÄØ£¿ -Óм¸ÖÖ·½Ê½¿ÉÒÔ½øÐС£Äú¿ÉÒÔʹÓ÷½Ïò¼ü£¬µ«Êǽ«ÄúµÄÊÖ·ÅÔÚ±ê×¼µÄ¡²¼üÅÌ¡³Î» -Ö㬲¢ÇÒʹÓÃÖ¸Áî C-p ¡¢ C-b ¡¢ C-f ºÍ C-n ½«±È½ÏÓÐЧÂÊ¡£ÕâЩ×ÖÔªºÍËĸö -·½Ïò¼ü¡²µÄ¹¦ÄÜ¡³ÊÇͬµÈµÄ£¬ÈçÏÂËùʾ£º +Óм¸ÖÖ·½Ê½¿ÉÒÔÑ¡Ôñ¡£Ó÷½Ïò¼üµ±È»¿ÉÒÔ£¬²»¹ý¸üÓÐЧÂʵķ½·¨ÊDZ£³ÖË«ÊÖλÓÚ +Ö÷¼üÅÌÇø£¬È»ºóʹÓà C-p ¡¢ C-b ¡¢ C-f ºÍ C-n ÕâËĸöÃüÁî¡£ËüÃǵŦÄܺͷ½ +Ïò¼üÊÇÒ»ÑùµÄ£¬ÈçÏÂͼËùʾ£º - Ç°Ò»ÐÐ C-p + ÉÏÒ»ÐÐ C-p : : - ÏòºóÒÆ C-b .... Ä¿Ç°ÓαêλÖà .... ÏòÇ°ÒÆ C-f + Ïò×óÒÆ C-b .... Ä¿Ç°¹â±êλÖà .... ÏòÓÒÒÆ C-f : : - ºóÒ»ÐÐ C-n + ÏÂÒ»ÐÐ C-n ->> ÒÔ C-n »ò C-p ½«ÓαêÒƵ½Í¼ÐεÄÖÐÑë¡£ - ¼üÈë C-l »á¿´µ½Õû¸öͼÐÎÏÔʾÔÚÓ©Ä»µÄÖÐÑë¡£ - -Äú»á·¢ÏÖÓÃ×ÖĸËù´ú±íµÄÒâÒåÀ´¼ÇÒäËüÃǺÜÈÝÒ×£ºP ±íʾ previous ¡¢ N ±íʾ -next ¡¢ B ±íʾ backward ¡¢¶ø F Ôò±íʾ forward ¡£Äú½«¡¸×ÜÊÇ¡¹Óõ½ÕâЩÓÎ -±êÒƶ¯Ö¸Áî¡£ +>> Óà C-n »ò C-p ½«¹â±êÒƵ½ÉÏͼµÄÖÐÑë¡£ + °´ C-l£¬Õû·ùͼ»á±»ÏÔʾÔÚÆÁÄ»µÄÖÐÑë¡£ ->> °´¼¸´Î C-n °ÑÓαêÍùÏÂÒƶ¯µ½ÕâÐС£ +¡°P N B F¡±Ëĸö×Öĸ·Ö±ð´ú±íÁËËĸö´Ê£¬ÓÃÕâËĸö´Ê¼ÇÒäÕâЩ×éºÏ¼ü»á¸üÈÝÒ×£º +P ´ú±í previous£¨ÉÏÒ»ÐУ©£¬N ´ú±í next£¨ÏÂÒ»ÐУ©£¬B ´ú±í backward£¨»Ø +ÍË£©£¬¶ø F Ôò´ú±í forward£¨Ç°½ø£©¡£ÕâЩ×éºÏ¼ü½ñºó½«ÓëÄãÐÎÓ°²»Àë¡£ ->> °´¼¸´Î C-f ÍùÇ°ÒƵ½ÕâÐУ¬È»ºóÔÙÒÔ C-p ÍùºóÒƶ¯¡£ - ¿´¿´µ±ÓαêÔÚ±¾ÐÐÖÐÑëʱ£¬C-p µÄ¶¯×÷ÊÇÔõÑù¡£ +>> °´¼¸´Î C-n °Ñ¹â±êÍùÏÂŲµ½ÕâÀï¡£ -ÿһ¸öÎÄ×ÖÐж¼ÒÔÒ»¸ö Newline ×ÖÔª×÷Ϊ½áÊø£¬ËüÊÇÓÃÀ´ÓëÏÂÒ»ÐÐ×÷Ϊ·Ö±ð¡£ -ÔÚÄúµµ°¸ÖеÄ×îºóÒ»ÐÐÓ¦¸ÃÒªÓÐÒ»¸ö Newline À´×÷Ϊ½áÊø£¨µ«ÊÇ Emacs ²¢²»Ò» -¶¨ÐèÒªËüÀ´±à¼µµ°¸£©¡£ +>> Óà C-f °Ñ¹â±êÒƶ¯µ½ÕâÒ»ÐУ¬È»ºóÔÙÓà C-p ÍùÉÏŲ¡£ + ×¢Òâ¹Û²ìµ±¹â±êÔÚÒ»ÐеÄÖÐÑëʱ C-p ÃüÁîµÄÐÐΪ¡£ ->> ÊÔÖøÔÚÒ»ÐпªÊ¼µÄµØ·½¼üÈë C-b ¡£½á¹ûÓ¦¸Ã»áÒƶ¯µ½Ç°Ò»ÐеÄ×îºóÃæ¡£ - ÕâÊÇÒòΪËüÍùºóÒƶ¯Ê±Ô½¹ýÁË Newline ×ÖÔª¡£ +ÿÐÐÎÄ×Ö¶¼ÒÔÒ»¸ö¡°»»Ðзû¡±½áÊø£¬¡°»»Ðзû¡±°ÑÐÐÓëÐÐÇø·Ö¿ªÀ´¡£ÎļþµÄ×îºó +Ò»ÐÐÒ²Ó¦¸ÃÒ²ÓÐÒ»¸ö»»Ðзû£¨²»¹ý Emacs ²¢²»Ç¿ÖÆÒªÇóÕâÒ»µã£©¡£ -C-f Ò²¿ÉÒÔºÍ C-b Ò»ÑùµØÔ½¹ý Newline ×ÖÔª¡£¡¾Newline ×ÖÔªÊÇ¡¸²»¿É¼û -£¨ invisible £©×ÖÔª¡¹£¬ÔÚ±à¼Æ÷ÖÐÒ»°ã¿´²»µ½Ëü£¬ÕâÀïÖ»ÊǸæËßÄú£ºÔÚÐÐÊ× -ÔÙÍùÇ°×ߣ¬ÄÇôÓαê»áÅܵ½Ç°Ò»ÐУ¨Èç¹ûÓÐÇ°Ò»ÐеĻ°£©£»ÔÚÐÐβÔÙÍùºó×ߣ¬ÄÇ -ôÓαê»áÅܵ½ºóÒ»ÐУ¨Èç¹ûÓкóÒ»ÐеĻ°£©¡£¡¸Ô½¹ý Newline ×ÖÔª¡¹»áÈÃÓαê -Åܵ½ÁíÍâÒ»ÐС£¡¿ +>> ÔÚÒ»ÐеÄÐÐÍ·ÊäÈë C-b¡£ + ¹â±êÓ¦¸Ã»áÒƶ¯µ½Ç°Ò»ÐеÄÐÐ⣬ÒòΪ¹â±êÔÚ»ØÍ˹ý³ÌÖÐÔ½¹ýÁË»»Ðзû¡£ + +ͬÑù C-f Ò²¿ÉÒÔÏñ C-b Ò»ÑùÔ½¹ý»»Ðзû¡£ ->> ¶à°´¼¸´Î C-b£¬×Ô¼º¸Ð¾õÒ»ÏÂÓαêÔÚÄÄ¡£ - È»ºó°´¼¸´Î C-f »Øµ½ÕâÐеÄβ°Í¡£ - ÔÙ°´Ò»´Î C-f ¾Í¿ÉÒÔÒƵ½ÏÂÒ»ÐÐÁË¡£ +>> Á¬°´¼¸´Î C-b£¬¸ÐÊÜһϹâ±êµÄÒƶ¯¡£ + È»ºó°´¼¸´Î C-f »Øµ½±¾ÐеÄÐÐβ¡£ + ÔÙ°´Ò»´Î C-f£¬¹â±ê»áÒƶ¯µ½ÏÂÒ»ÐС£ -µ±ÄúÒƶ¯Óα괩ԽөĻµÄÉÏ·½»òÏ·½Ê±£¬Ôڱ߽çÍâµÄÎÄ×Ö»áÒÆλ½øÈëÓ©Ä»ÄÚ¡£Õâ -³ÆΪ¡¸¾í¶¯¡¹¡£ËüÈà Emacs ¿ÉÒÔ½«ÓαêÒƶ¯µ½ÎÄ×ÖÖеÄÈÎÒâÌض¨Î»Öã¬Í¬Ê± -£¨Óα꣩²»»áÅܳöÓ©Ä»Íâ¡£ +µ±ÄãÒƶ¯¹â±ê´©Ô½ÆÁÄ»µÄÉÏϱ߽çʱ£¬Ôڱ߽çÍâµÄÎÄ×Ö»áÒƶ¯µ½ÆÁÄ»ÄÚ£¬Õâ³ÆΪ +¡°¹ö¶¯¡±£¨scrolling£©¡£¹ö¶¯Ê¹µÃ¹â±ê¿ÉÒÔ±»Òƶ¯µ½ÎÄ×ÖÖеÄÈκÎλÖ㬲¢ÇÒ»¹ +²»»áÈùâ±êÅܵ½ÆÁÄ»Íâ±ßÈ¥¡£ ->> ÊÔÖøÒÔ C-n ½«ÓαêÔ½¹ýөĻϷ½£¬È»ºó¿´¿´·¢ÉúÁËʲôÊ¡£ +>> Óà C-n ½«¹â±êÏÂÒÆ£¬Ò»Ö±Ô½¹ýÆÁÄ»±ß½ç£¬Í¬Ê±¹Û²ì·¢ÉúÁËʲô±ä»¯¡£ -Èç¹ûÒ»¸ö×ÖÔªÒ»¸ö×ÖÔªµØÒƶ¯Ì«ÂýµÄ»°£¬Äú¿ÉÒÔÒ»¸ö×ÖÒ»¸ö×ÖµØÒƶ¯¡£M-f -(META-f) ÍùÇ°Òƶ¯Ò»¸ö×Ö£¬M-b ÔòÍùºóÒƶ¯Ò»¸ö×Ö¡£¡¾¶ÔÖÐÎÄÀ´Ëµ£¬ÔòÊÇÒƶ¯ -µ½ÏÂÒ»¸ö»òÏÂÒ»¸ö±êµã·ûºÅµÄËùÔÚ¡£¡¿ +Èç¹ûÄãÏÓÒ»¸ö×Ö·ûÒ»¸ö×Ö·ûµØŲ¹â±êÌ«Âý£¬Ä㻹¿ÉÒÔÒ»¸ö´ÊÒ»¸ö´ÊµØÌø¡£M-f +(META-f) ¿ÉÒÔ½«¹â±êÍùÇ°Òƶ¯Ò»¸ö´Ê£¬¶ø M-b ÔòÊÇÍùºóÒÆ¡£¡¾ÕâÀïµÄ¡°´Ê¡±Ö¸ +Ó¢Îĵ¥´Ê£¬¶ÔÖÐÎÄÀ´Ëµ£¬ÔòÊÇÖ¸Òƶ¯µ½ÏÂÒ»¸ö±êµã·ûºÅ¡£¡¿ ->> ¼üÈëһЩ M-f ºÍ M-b¡£ - -µ±ÄúÔÚÒ»¸ö×ÖµÄÖмäʱ£¬M-f »áÒƶ¯µ½Õâ¸ö×ÖµÄβ°Í¡£µ±ÄúÔÚ×ÖÓë×Ö¼äµÄ¿Õ°×ʱ£¬ -M-f »áÒƶ¯µ½ÏÂÒ»¸ö×ÖµÄβ°Í¡£M-b µÄЧ¹ûÏàËÆ£¬Ö»ÊÇ·½Ïò²»Í¬¡£ +>> ÊÔÊÔ M-f ºÍ M-b¡£ ->> °´¼¸´Î M-f ºÍ M-b£¬Öмä¼ÐÔÓһЩ C-f ºÍ C-b£¬ - ÕâÑù×ÓÄú¾Í¿ÉÒÔ¹Û²ì M-f ºÍ M-b ÔÚ¸÷ÖÖ¡¸Î»ÔÚ×Ö¼ä»ò×ÖÔª¼ä¡¹ - µÄ²»Í¬Î»Öã¬Ëù±íÏÖ³öÀ´µÄÐÐΪ¡£ +Èç¹û¹â±êÍ£ÔÚÒ»¸ö´ÊµÄÖм䣬M-f »áÒƶ¯µ½Õâ¸ö´ÊµÄĩβ¡£Èç¹û¹â±ê´¦ÓÚ´ÊÓë´Ê +Ö®¼äµÄ¿Õ°×´¦£¬M-f »áÒƶ¯µ½ÏÂÒ»¸ö´ÊµÄĩβ¡£M-b µÄ¹¦ÄÜÀàËÆ£¬Ö»ÊÇ·½ÏòÏà·´¡£ -Çë×¢Òâ C-f ¡¢ C-b ºÍ M-f ¡¢ M-b Á½¶ÔÖ®¼äµÄÏàËÆÐÔ¡£¡¸¾³£¡¹µÄ×´¿öÊÇ£º -META ×ÖÔªÊÇÓÃÀ´×÷ΪÓ롸ÒÔÓïÑÔ¶¨Òå³öµÄµ¥Î»£¨×Ö¡¢¾ä×Ó¡¢¶ÎÂ䣩¡¹ÓйصIJ٠-×÷£¬¶ø CONTROL ×ÖÔªÔòÊÇ×÷ÓÃÔÚ¡¸ÓëÄúËù±à¼Î޹صġº»ù±¾¡»µ¥Î»£¨×ÖÔª»òÐÐ -µÈ£©¡¹ÉÏ¡£ +>> °´¼¸´Î M-f ºÍ M-b£¬Öмä¼ÐÔÓһЩ C-f ºÍ C-b¡£ + Äã¿ÉÒԹ۲쵽 M-f ºÍ M-b ÔÚ²»Í¬Î»ÖÃÉÏËù±íÏÖ³öÀ´µÄ²»Í¬ÐÐΪ¡£ + +Çë×¢Òâ C-f ¡¢C-b ºÍ M-f ¡¢M-b Á½¶ÔÖ®¼äµÄÀà±È¹Øϵ¡£Í¨³£µÄ¹ßÀýÊÇ£ºMETA ϵ +ÁÐ×éºÏ¼üÓÃÀ´²Ù×÷¡°ÓÉÓïÑÔ¶¨ÒåµÄµ¥Î»£¨±ÈÈç´Ê¡¢¾ä×Ó¡¢¶ÎÂ䣩¡±£¬¶ø CONTROL +ϵÁÐ×éºÏ¼üÓÃÀ´²Ù×÷¡°ÓëÓïÑÔÎ޹صĻù±¾µ¥Î»£¨±ÈÈç×Ö·û¡¢Ðеȵȣ©¡±¡£ -Õâ¸öÏàËÆÐÔÔÚ¡¸ÐÐÓë¾ä×Ó¡¹Ö®¼äҲͬÑùÊÊÓãºC-a ºÍ C-e »á½«ÓαêÒƶ¯µ½¡¸Ò» -ÐС¹µÄ ¿ªÊ¼ºÍ½áβ´¦£¬¶øM-a ºÍ M-e Ôò½«ÓαêÒƶ¯µ½¡¸Ò»¾ä¡¹µÄ ¿ªÊ¼ºÍ½áβ -´¦¡£ +ÀàËƵĹßÀýÔÚ¡°ÐС±Óë¡°¾ä×Ó¡±Ö®¼äҲͬÑùÊÊÓãºC-a ºÍ C-e ¿ÉÒÔ½«¹â±êÒƶ¯µ½ +¡°Ò»ÐС±µÄÍ·²¿ºÍβ²¿£»¶ø M-a ºÍ M-e Ôò½«¹â±êÒƶ¯µ½¡°Ò»¾ä¡±µÄÍ·²¿ºÍβ²¿¡£ ->> ÊÔÖø°´Á½´Î C-a£¬ÔÙ°´Á½´Î C-e¡£ - ÊÔÖø°´Á½´Î M-a£¬ÔÙ°´Á½´Î M-e¡£ +>> °´Á½´Î C-a£¬ÔÙ°´Á½´Î C-e¡£ + °´Á½´Î M-a£¬ÔÙ°´Á½´Î M-e¡£ -¿´Ò»ÏÂΪʲôÖظ´µÄ C-a Ö¸Áî»áûÓÐ×÷Ó㬶øÖظ´µÄ M-a Ö¸ÁîÔò¼ÌÐøÒƶ¯µ½Ï -Ò»¸ö¾ä×Ó¡£ËäÈ»Õâ²¢²»ÄÜ˵ÊÇÍêÈ«Àà±È£¬µ«ÊÇÆäÖÐÿ¸öÖ¸ÁîµÄÐÐΪ¿´ÆðÀ´¶¼Ê®·Ö -×ÔÈ»¡£ +ÏëÒ»ÏëΪʲôÖظ´µÄ C-a ÃüÁî»áûÓÐ×÷Ó㬶øÖظ´µÄ M-a ÃüÁîÔò»áÈùâ±ê²»¶Ï +µØ»ØÍ˵½ÉÏÒ»¸ö¾ä×Ó¡£ËäÈ»Õâ¸öÀà±È¹æÂɲ¢²»Ñϸñ£¬µ«ÊǺÜ×ÔÈ»¡£ -ÓαêÔÚÎÄ×ÖÖеÄλÖÃÒ²¿ÉÒÔ³Æ×÷¡¸µã루 point £©¡¹¡£¼òµ¥À´Ëµ¾ÍÊÇ£ºÓαê±í -ÏÖ³öÓ©Ä»ÖС¸µãλ¡¹ËùÔÚµÄÎÄ×ÖλÖᣠ+¹â±êÍ£ÁôµÄλÖÃÒ²¿ÉÒÔ³Æ×÷¡°µãλ¡±£¨point£©¡£»òÕ߸ɴà˵£¬¹â±êָʾ³öÁËÆÁÄ» +ÉÏ¡°µãλ¡±ÔÚÎı¾ÖеÄλÖᣠ-ÕâÀïÊÇһЩ¼òµ¥¡¸ÓαêÒƶ¯£¨ cursor-moving £©²Ù×÷¡¹µÄÕûÀí£¬ÆäÖÐÒ²°üÀ¨ÁË -¡¸×ֺ;䡹µÄÒƶ¯Ö¸Á +ÕâÀï¶Ô¼òµ¥µÄ¹â±êÒƶ¯ÃüÁî×öÒ»¸ö×ܽᣬÆäÖÐÒ²°üÀ¨ÁËÕû´ÊºÍÕû¾äµÄÒƶ¯£º - C-f ÍùÇ°Òƶ¯Ò»¸ö×ÖÔª - C-b Íù»ØÒƶ¯Ò»¸ö×ÖÔª + C-f ÏòÓÒÒƶ¯Ò»¸ö×Ö·û + C-b Ïò×óÒƶ¯Ò»¸ö×Ö·û - M-f ÍùÇ°Òƶ¯Ò»¸ö×Ö¡¾ÖÐÎÄÊÇÒƶ¯µ½ÏÂÒ»¸ö±êµã·ûºÅ¡¿ - M-b Íù»ØÒƶ¯Ò»¸ö×Ö¡¾ÖÐÎÄÊÇÒƶ¯µ½ÉÏÒ»¸ö±êµã·ûºÅ¡¿ + M-f ÏòÓÒÒƶ¯Ò»¸ö´Ê¡¾ÖÐÎÄÊÇÒƶ¯µ½ÏÂÒ»¸ö±êµã·ûºÅ¡¿ + M-b Ïò×óÒƶ¯Ò»¸ö´Ê¡¾ÖÐÎÄÊÇÒƶ¯µ½ÉÏÒ»¸ö±êµã·ûºÅ¡¿ C-n Òƶ¯µ½ÏÂÒ»ÐÐ C-p Òƶ¯µ½ÉÏÒ»ÐÐ @@ -152,906 +138,852 @@ C-a Òƶ¯µ½ÐÐÊ× C-e Òƶ¯µ½ÐÐβ - M-a ÒƻؾäÊ× - M-e ÒƵ½¾äβ + M-a Òƶ¯µ½¾äÊ× + M-e Òƶ¯µ½¾äβ ->> Á·Ï°¼¸´ÎÕâЩָÁî¡£ÕâЩ¶¼ÊÇ×ʹÓõ½µÄÖ¸Áî¡£ +>> °ÑÉÏÃæËùÓеÄÃüÁÁ·Ï°¼¸´Î£¬ÕâЩ¿É¶¼ÊÇ×î³£ÓõÄÃüÁî¡£ -»¹ÓÐÁ½¸öÖØÒªµÄÓα궯×÷£¨ cursor-motion £©Ö¸ÁM-<£¨ META Less-than £©£¬ -Òƶ¯µ½ÎÄ×ÖµÄ×ʼ£¬ÒÔ¼°M->£¨ META Greater-than £©£¬Òƶ¯µ½ÎÄ×ÖµÄ×îºó¡£ +ÕâÀﻹҪ½éÉÜÁ½¸öÖØÒªµÄ¹â±êÒƶ¯ÃüÁM-< £¨META СÓںţ©¿ÉÒÔ½«¹â±êÒƶ¯µ½ +ËùÓÐÎÄ×ÖµÄ×ͷ£»M-> £¨META ´óÓںţ©¿ÉÒÔ½«¹â±êÒƶ¯µ½ËùÓÐÎÄ×ÖµÄ×îĩβ¡£ -Ôڴ󲿷ݵÄÖն˻ú£¬¡¸<¡¹ÊÇÔÚ comma ÉÏ·½£¬ËùÒÔÄú±ØÐëҪʹÓà shift ¼üÀ´¼ü -Èë¡£ÔÚÕâЩÖն˻úÉÏ£¬Äú±ØÐëʹÓà shift ¼üÀ´¼üÈë M-<£»Ã»ÓÐʹÓà shift ¼ü£¬ -Äú¾Í±ä³É¼üÈë M-comma ÁË¡£ +×¢Ò⣬Ôڴ󲿷ּüÅÌÉÏ£¬Ð¡Óںţ¨<£©ÐèÒªÓÃÉϵµ¼ü£¨Shift£©À´ÊäÈ룬ËùÒÔÔÚÕâ +Щ¼üÅÌÉÏÄãÓ¦¸ÃÓà Shift ¼üÀ´ÊäÈë M-<£¬Èç¹û²»°´ Shift ¼ü£¬ÄãÊäÈëµÄ»áÊÇ +M-comma£¨META ¶ººÅ£©¡£ ->> ÏÖÔÚÊÔһϠM-< £¬ÒƵ½±¾¿ìËÙÖ¸ÄϵÄ×ʼ¡£ - È»ºóÔÙÖظ´µØʹÓà C-v »Øµ½ÕâÀï¡£ +>> ÊÔÒ»ÊÔ M-< £¬ÒƵ½±¾¿ìËÙÖ¸ÄϵÄ×ʼ¡£ + È»ºóÔÙ°´¼¸´Î C-v »Øµ½ÕâÀï¡£ ->> ÏÖÔÚÊÔһϠM-> £¬ÒƵ½±¾¿ìËÙÖ¸ÄϵÄ×îºó¡£ - È»ºóÔÙÖظ´µØʹÓà M-v »Øµ½ÕâÀï¡£ +>> ÊÔÒ»ÊÔ M-> £¬ÒƵ½±¾¿ìËÙÖ¸ÄϵÄ×îĩβ¡£ + È»ºóÔÙ°´¼¸´Î M-v »Øµ½ÕâÀï¡£ -Èç¹ûÄúµÄÖն˻úÓз½Ïò¼üµÄ»°£¬ÄúÒ²¿ÉÒÔÓ÷½Ïò¼üÒƶ¯ÓαꡣÎÒÃÇÓÐÈý¸öÀíÓɽ¨ -ÒéÄúѧϰ C-b ¡¢ C-f ¡¢ C-n ¡¢ ºÍ C-p £º(1) ÈκεÄÖն˻ú¶¼ÄÜʹÓá£(2) -Ò»µ©ÄúʹÓà Emacs Ï൱ÊìÁ·ÁË£¬Äú»á·¢ÏÖ¼üÈëÕâЩ CONTROL ×ÖÔª£¬±ÈÆðʹÓ÷½ -Ïò¼ü¿ì¶àÁË£¨ÒòΪÄú²»ÐèÒª½«ÊÖÒÆ¿ª´ò×ÖÇø£©¡£(3) Ò»µ©ÄúʹÓÃÕâЩ CONTROL -×ÖÔªÖ¸Áî³ÉΪϰ¹ß£¬ÄúÒ²¿ÉÒÔºÜÈÝÒ×µØѧ»áÆäËû½ø½×µÄÓα궯×÷Ö¸Áî¡£ +Èç¹ûÄãµÄ¼üÅÌÉÏÓз½Ïò¼üµÄ»°£¬Ò²¿ÉÒÔÓÃËüÃÇÀ´Òƶ¯¹â±ê¡£²»¹ýÎÒÃÇÓÐÈý¸öÀíÓÉ +ÍƼöÄãѧϰ C-b ¡¢C-f ¡¢C-n ¡¢ºÍ C-p£º£¨1£©ËüÃÇÔÚÈκμüÅÌÉ϶¼ÄÜÓᣣ¨2£© +µ±ÄãÊìÁ·Ê¹Óà Emacs Ö®ºó£¬Äã»á·¢ÏÖÓÃÕâЩ×éºÏ¼ü±ÈÓ÷½Ïò¼üÒª¿ìµÃ¶à£¬ÒòΪÄã +µÄÊÖ²»ÐèÒªÀ뿪´ò×ÖÇø¡££¨3£©Ò»µ©ÄãÏ°¹ßÁËʹÓÃÕâЩ×éºÏ¼ü£¬ÄãÒ²¿ÉÒÔºÜÈÝÒ×µØ +ÊÊÓ¦ÆäËü¸ü¸ß¼¶µÄ¹â±êÒƶ¯ÃüÁî¡£ -´ó²¿·ÝµÄ Emacs Ö¸Áî½ÓÊÜÊý×Ö²ÎÊý£»¶Ô´ó²¿·ÝµÄÖ¸Áî¶øÑÔ£¬ËüµÄ×÷ÓÃÊÇÖ¸¶¨ÖØ -¸´´ÎÊý¡£ÄúÒªÖ¸¶¨Ò»¸öÖ¸ÁîµÄÖظ´´ÎÊýµÄ×÷·¨ÊÇ£ºÏȼüÈë C-u£¬È»ºóÔÚÄú¼üÈëÖ¸ -ÁîÇ°£¬¼üÈë´ú±íÖظ´´ÎÊýµÄÊýλ¡£Èç¹ûÄúÓÐÒ»¸ö META£¨»ò EDIT »ò ALT £©¼ü£¬ -ÄÇôÄú»¹ÓÐÁíÍâÒ»¸öÌæ´ú×÷·¨À´ÊäÈëÊý×Ö²ÎÊý£º°´×¡ META ¼üʱ´òÈëÕâÊý×Ö¡£ÎÒ -Ãǽ¨ÒéÄúѧϰ C-u µÄ·½·¨£¬ÒòΪËüÔÚÈκÎÖն˻ú¶¼¿ÉÒÔʹÓᣴËÒ»Êý×Ö²ÎÊýÒ² -³Æ×÷Ϊ¡¸×ÖÊײÎÊý¡¹£¬ÒòΪÄúÔÚÕâ²ÎÊýËù×÷Óõ½µÄÖ¸ÁîÇ°¼üÈëËü¡£ +´ó²¿·ÖµÄ Emacs ÃüÁî½ÓÊÜÊý×Ö²ÎÊý£¬²¢ÇÒ¶ÔÓÚ¶àÊýÃüÁî¶øÑÔ£¬ÕâЩÊý×Ö²ÎÊýµÄ×÷ +ÓÃÊÇÖ¸¶¨ÃüÁîµÄÖظ´´ÎÊý¡£ÎªÒ»¸öÃüÁîÖ¸¶¨Êý×Ö²ÎÊý£¨Ò²¾ÍÊÇÖظ´´ÎÊý£©µÄ·½·¨ +ÊÇ£ºÏÈÊäÈë C-u£¬È»ºóÊäÈëÊý×Ö×÷Ϊ²ÎÊý£¬×îºóÔÙÊäÈëÃüÁî¡£Èç¹ûÄãÓÐMETA £¨»ò +EDIT »ò ALT£©¼ü£¬ÄÇô»¹ÓÐÁíÒ»ÖÖ°ì·¨£º°´×¡ META ¼ü²»¶¯£¬È»ºóÊäÈëÊý×Ö¡£²» +¹ýÎÒÃÇ»¹Êǽ¨ÒéÄãÓà C-u£¬ÒòΪËüÔÚÈκÎÖն˻úÉ϶¼ÄÜÓá£ÕâÖÖÊý×Ö²ÎÊýÒ²³ÆΪ +¡°Ç°×º²ÎÊý¡±£¬Òâ˼ÊÇ˵Õâ¸ö²ÎÊýÊÇÏÈÓÚʹÓÃËüµÄÃüÁî¶øÊäÈëµÄ¡£ -¾ÙÀýÀ´Ëµ£¬ C-u 8 C-f ÏòÇ°Òƶ¯ 8 ¸ö×ÖÔª¡£ +¾ÙÀýÀ´Ëµ£¬ C-u 8 C-f »áÏòÇ°Òƶ¯ 8 ¸ö×Ö·û¡£ ->> ÊÔÖøÒÔÒ»¸öÊý×Ö²ÎÊýÀ´Ê¹Óà C-n »ò C-p£¬ - Ö»Ò»¸öÖ¸Áî¾Í½«ÓαêÒƶ¯µ½ÕâÐеĸ½½ü¡£ +>> Ϊ C-n »òÕß C-p Ö¸¶¨Ò»¸öÊý×Ö²ÎÊý£¬ÕâÑùÄã¿ÉÒÔÖ»ÓÃÒ»¸öÃüÁî¾Í°Ñ¹â±êÒƶ¯ + µ½±¾Ðеĸ½½ü¡£ -´ó²¿·ÝµÄÖ¸ÁîʹÓÃÊý×Ö²ÎÊýÀ´×÷ΪÆäÖظ´´ÎÊý£¬µ«ÊÇÆäÖÐÓÐЩָÁîÔòÊÇ×÷ΪÆäËû -ÓÃ;¡£Óм¸¸öÖ¸ÁĿǰÄúÉÐδѧµ½£©½«Ëü×÷ΪÆì±ê -- ÒÔÒ»¸ö×ÖÊײÎÊýµÄÐÍ̬ -³öÏÖ£¬¶ø²»¹ÜÆäֵΪºÎ£¬ËüÃÇÈÃÕâÖ¸Áî×öЩ²»Ò»ÑùµÄÊ¡£ +ËäÈ»´ó²¿·ÖÃüÁîÓÃÊý×Ö²ÎÊýÀ´×÷ΪÆäÖظ´´ÎÊý£¬µ«ÊÇÒ²ÓÐЩÃüÁîÀýÍ⣬ËüÃǽ«Êý +×Ö²ÎÊýÁí×öËüÓᣱÈÈçÓÐЩÃüÁĿǰ»¹Ã»Ñ§µ½£©½ö½ö½«Ç°×º²ÎÊý×÷Ϊһ¸ö±ê +Ö¾¡ª¡ªÖ»ÒªÓÐÒ»¸öǰ׺²ÎÊý³öÏÖ£¬²»¹ÜÆäֵΪºÎ£¬ÃüÁîµÄ¹¦Äܶ¼»á¸Ä±ä¡£ -C-v ºÍ M-v ÔòÊÇÁíÒ»ÀàµÄÀýÍâ¡£µ±¸ø¶¨Ò»¸ö²ÎÊýʱ£¬ËüÃÇ¾í¶¯¡¸ËùÖ¸¶¨µÄÊýÁ¿ -µÄÐУ¨ÒÔÐÐΪµ¥Î»£©¡¹£¬¶ø²»ÊÇÒÔ¡¸Ó©Ä»¡¹Îªµ¥Î»¾í¶¯¡£¾ÙÀýÀ´Ëµ£¬C-u 8 C-v -½«ÏÔʾөĻ¾í¶¯ 8 ÐС£ +¶ø C-v ºÍ M-v ÔòÊôÓÚÁíÒ»ÖÖÀàÐ͵ÄÀýÍâ¡£µ±¸ø¶¨Ò»¸ö²ÎÊýʱ£¬ËüÃǽ«¹ö¶¯ÄãÖ¸ +¶¨µÄ¡°ÐÐÊý¡±£¬¶ø²»ÊÇ¡°ÆÁÊý¡±¡£¾ÙÀýÀ´Ëµ£¬C-u 8 C-v ½«ÆÁÄ»ÏòϹö¶¯ 8 ÐУ¬ +¶ø²»ÊÇ 8 ÆÁ¡£ ->> ÏÖÔÚÊÔÖø¼üÈë C-u 8 C-v¡£ +>> ÏÖÔÚÊÔÊÔ¿´£¬ÊäÈë C-u 8 C-v¡£ -ÕâÖ¸ÁîÓ¦¸ÃÒѾ½«Ó©Ä»ÏòÉÏÒÆÁË 8 ÐС£ÈôÄúÏ뽫ËüÔٴεØÏòÏÂ¾í¶¯£¬Äú¿ÉÒÔÔÚ -Ö´ÐÐ M-v ʱ¸ø¶¨Ò»¸ö²ÎÊý¡£ +Õâ¸öÃüÁîÓ¦¸ÃÒѾ½«ÎÄ×ÖÏòÉϹö¶¯ÁË 8 ÐС£Èç¹ûÄãÏ뽫ËüÔٴεØÏòϹö¶¯£¬Äã¿É +ÒÔ¸ø¶¨Ò»¸ö²ÎÊýÈ»ºóÖ´ÐÐ M-v¡£ -Èç¹ûÄúÕýÔÚʹÓà X ´°¿Úϵͳ£¬ÔÚ Emacs ´°¿Ú×óÊÖ²àÓ¦¸ÃÓÐÒ»¸ö³ÆΪ¡¸¾í¶¯Ö᡹ -µÄ³¤·½ÐÍÇøÓò¡£Äú¿ÉÒÔÓû¬ÊóÔÚ¾í¶¯Öá°´Ò»ÏÂÀ´¾í¶¯ÎÄ×Ö¡£ +Èç¹ûÄãÕýÔÚʹÓÃÒ»¸ö´°¿Úϵͳ£¬±ÈÈç X11 »òÕß΢ÈíµÄ Windows£¬ÄÇôÔÚ Emacs +´°¿ÚµÄ×ó±ß»òÕßÓÒ±ßÓ¦¸ÃÓÐÒ»¸ö³¤·½ÐεÄÇøÓò½Ð¡°¹ö¶¯Ìõ¡±£¬Äã¿ÉÒÔÓÃÊó±ê²Ù×Ý +¹ö¶¯ÌõÀ´¹ö¶¯ÎÄ×Ö¡£ ->> ÊÔÖøÔÚ¡¸¾í¶¯ÖáÄÚ·´°×ÇøÓòÉÏ¡¹Ñ¹Ò»ÏÂÖмäÅ¥¡£ÕâÓ¦¸Ã»á½«ÎÄ×Ö¾í¶¯µ½ - ¡¸ÓÉÄúËù°´Ò»Ï»¬ÊóµÄµØ·½¡¹Ëù¾ö¶¨µÄλÖᣠ+>> ÊÔ×ÅÔÚ¡°¹ö¶¯ÌõÄڵķ´°×ÇøÓò¡±ÉÏ°´Ò»ÏÂÊó±êÖмü¡£ + ÎÄ×ÖÓ¦¸Ã»á¹ö¶¯µ½Êó±êËùָʾµÄλÖᣠ->> µ±°´×¡Öмäʱ£¬ÊÔÖø½«»¬ÊóÉÏÏÂÒƶ¯¡£ - Äú»á¿´µ½ÎÄ×ÖËæÖøÄúÒƶ¯»¬Êó¶øÉÏÏÂÒƶ¯¡£ +>> µ±°´×¡Öмüʱ£¬ÊÔ׎«Êó±êÉÏÏÂÒƶ¯¡£ + Äã»á¿´µ½ÎÄ×ÖËæ×ÅÊó±êµÄÒƶ¯¶øÉÏϹö¶¯¡£ + ¡¾Windows °æ±¾·ûºÏ Windows ³ÌÐòµÄ´«Í³²Ù×÷Ï°¹ß£¬ÉÏÊö²Ù×÷²»ÊÊÓᣡ¿ -* µ± EMACS ·¢´ôʱ£¨ WHEN EMACS IS HUNG £© ------------------------------------------ +* ÔÚ EMACS ʧȥÏìÓ¦µÄʱºò£¨WHEN EMACS IS HUNG£© +----------------------------------------------- -Èç¹û Emacs Í£Ö¹»ØÓ¦ÄúµÄÖ¸ÁÄú¿ÉÒÔ¼üÈë C-g À´°²È«µØÍ£Ö¹Ëü¡£ÄúÒ²¿ÉÒÔʹ -Óà C-g À´Í£Ö¹Ö´Ðйý¾ÃµÄÖ¸Áî¡£ +Èç¹û Emacs ¶ÔÄãµÄÃüÁîʧȥÏìÓ¦£¬Äã¿ÉÒԺܰ²È«µØÓà C-g À´ÖÕÖ¹Õâ¸öÃüÁî¡£ +C-g Ò²¿ÉÒÔ±»ÓÃÀ´ÖÕÖ¹Ò»¸öÖ´Ðйý¾ÃµÄÃüÁî¡£ -ÄúÒ²¿ÉÒÔʹÓà C-g À´È¡ÏûÊý×Ö²ÎÊý»òÄú²»ÏëÒªÍê³ÉµÄÖ¸Áî¡£ +C-g »¹¿ÉÒÔ±»À´È¡ÏûÊý×Ö²ÎÊýºÍÄÇЩÊäÈëµ½Ò»°ëµÄÃüÁî¡£ ->> ¼üÈë C-u 100 ÒÔÉ趨һ¸ö 100 µÄÊý×Ö²ÎÊý£¬È»ºó¼üÈë C-g¡£ - ÏÖÔÚ¼üÈë C-f¡£ËüÓ¦¸ÃÖ»»áÒƶ¯Ò»¸ö×ÖÔª£¬ÒòΪÄúÒѾÒÔ C-g - È¡ÏûÁ˲ÎÊý¡£ +>> ÊäÈë C-u 100 É趨һ¸öֵΪ 100 µÄÊý×Ö²ÎÊý£¬È»ºó°´ C-g¡£ + ÏÖÔÚÔÙ°´ C-f£¬¹â±êÓ¦¸ÃÖ»»áÒƶ¯Ò»¸ö×Ö·û£¬ÒòΪÄãÒѾÓà C-g È¡ÏûÁ˲ÎÊý¡£ -Èç¹ûÄúÒѾ²»Ð¡ÐĵؼüÈëÒ»¸ö <ESC>£¬Äú¿ÉÒÔ C-g À´È¡ÏûËü¡£ +Èç¹ûÄ㲻СÐÄ°´ÁËһϠ<ESC>£¬ÄãÒ²¿ÉÒÔÓà C-g À´È¡ÏûËü¡£ +¡¾Õâ¸ö˵·¨ËƺõÓÐÎÊÌ⣬ÒòΪ°´ÕÕÕâ¸ö°´¼ü˳ÐòÊäÈëµÄÓ¦¸ÃÊÇ C-M-g¡£ + È¡Ïû<ESC> µÄÕýÈ·×ö·¨ÊÇÔÙÁ¬°´Á½´Î <ESC>¡£¡¿ -* ÎÞЧ»¯µÄÖ¸Á DISABLED COMMANDS £© -------------------------------------- +* ±»½ûÓõÄÃüÁDISABLED COMMANDS£© +----------------------------------- -ÓÐһЩ Emacs Ö¸Áî±»¡¸ÎÞЧ»¯¡¹ÁË£¬Òò´Ë³õѧÕß²»»áÒâÍâµØʹÓõ½ËüÃÇ¡£ +ÓÐһЩ Emacs ÃüÁî±»¡°½ûÓá±ÁË£¬ÒÔ±ÜÃâ³õѧÕßÔÚ²»Á˽âÆäÈ·Çй¦ÄܵÄÇé¿öÏÂÎó +ÓÃÕâЩÃüÁÔì³ÉÂé·³¡£ -Èç¹ûÄú¼üÈëÁËijһ¸öÎÞЧ»¯µÄÖ¸ÁEmacs »áÏÔʾһ¸öѶϢ£¬ËµÃ÷Õâ¸öÖ¸ÁîÊÇʲ -ô£¬²¢ÇÒѯÎÊÄúÊÇ·ñÏëÒª¼ÌÐø£¬È»ºóÖ´ÐÐÕâÖ¸Áî¡£ +Èç¹ûÄãÓõ½ÁËÒ»¸ö±»½ûÓõÄÃüÁEmacs »áÏÔʾһ¸öÌáʾÏûÏ¢£¬¸æËßÄãÕâ¸öÃüÁî +µ½µ×ÊǸÉʲôµÄ£¬Ñ¯ÎÊÄãÊÇ·ñÒª¼ÌÐø£¬²¢Ôڵõ½ÄãµÄ¿Ï¶¨Ö®ºóÔÙÖ´ÐÐÕâÃüÁî¡£ -Èç¹ûÄúÕæµÄÏëÒªÊÔÒ»ÏÂÕâ¸öÖ¸ÁÄÇôÔÚµ± Emacs ѯÎÊÄúʱ£¬Çë¼üÈë¿Õ°×¡£Ò» -°ãÀ´Ëµ£¬Èç¹ûÄú²»ÏëÒªÖ´ÐÐÕâ¸öÎÞЧ»¯µÄÖ¸ÁÇëÒÔ¡ºn¡»À´»Ø´ðËü¡£ +ÄãÒªÊÇÕæµÄÏëÖ´Ðб»½ûÓõÄÃüÁÄÇôÔÚ Emacs ѯÎÊÄãµÄʱºòÓ¦¸Ã°´¿Õ¸ñ¡£Ò»°ã +À´Ëµ£¬Èç¹ûÄã²»ÏëÖ´ÐУ¬°´¡°n¡±¾ÍÐÐÁË¡£ ->> ¼üÈë C-x C-l £¨ÕâÊǸöÎÞЧ»¯µÄÖ¸Á - È»ºó¼üÈë n À´»Ø´ðÎÊÌâ¡£ +>> ÊÔÊÔ C-x C-l £¨ÕâÊÇÒ»¸ö±»½ûÓõÄÃüÁ + È»ºóÓà n À´»Ø´ðÎÊÌâ¡£ -* ´°¸ñ£¨ WINDOWS £© -------------------- +* ´°¸ñ£¨WINDOWS£© +----------------- -Emacs ¿ÉÒÔÓÐÊý¸ö´°¸ñ£¬Ã¿Ò»¸öÏÔʾËü×Ô¼ºµÄÎÄ×Ö¡£ÎÒÃÇÔÚÉÔºó»á½âÊÍÈçºÎʹÓà -¶àÖØ´°¸ñ¡£ÏÖÔÚÎÒÃÇÏëÒª½âÊÍÈçºÎ³ýÈ¥¶àÓàµÄ´°¸ñ£¬È»ºó»Øµ½»ù±¾µÄµ¥´°¸ñ±à¼¡£ -ËüºÜ¼òµ¥£º +Emacs ¿ÉÒÔÓжà¸ö´°¸ñ£¬Ã¿¸ö´°¸ñ¶¼ÏÔʾ²»Í¬µÄÎÄ×Ö¡£ÎÒÃǺóÃæÔÙ½éÉÜÔõô¶Ô¸¶ +¶à¸ö´°¸ñ£¬ÏÖÔÚÏÈÈÃÎÒÃÇÏȸãÃ÷°×ÈçºÎ¹Øµô¶àÓàµÄ´°¸ñ¡£ÆäʵҲºÜ¼òµ¥£º - C-x 1 One window £¨¼´£¬³ýÈ¥ÆäËûËùÓеĴ°¸ñ£©¡£ + C-x 1 Ö»±£ÁôÒ»¸ö´°¸ñ£¨Ò²¾ÍÊǹصôÆäËûËùÓеĴ°¸ñ£©¡£ -ÄÇÊǸö CONTROL-x ºóÃæ¸úÖøÊý×Ö 1 ¡£C-x 1 ½«º¬ÓÐÓαêµÄ´°¸ñÀ©´óµ½Õû¸öÓ©Ä»¡£ -Ëü½«ËùÓÐÆäËûµÄ´°¸ñ³ýÈ¥¡£ +Ò²¾ÍÊÇÏÈ°´ CONTROL-x È»ºóÔÙ°´ 1¡£C-x 1 »á±£Áô¹â±êËùÔڵĴ°¸ñ£¬²¢½«ÆäÀ©´ó +µ½Õû¸öÆÁÄ»£¬Í¬Ê±¹ØµôËùÓÐÆäËüµÄ´°¸ñ¡£ ->> Òƶ¯Óα굽±¾Ðв¢ÇÒ¼üÈë C-u 0 C-l¡£ ->> ¼üÈë CONTROL-h k CONTROL-f¡£ - ¿´¿´Õâ¸ö´°¸ñÔÚµ±Ò»¸öеĴ°¸ñ³öÏÖ - £¨ÒÔÏÔʾÓÐ¹Ø CONTROL-f Ö¸ÁîµÄÎĵµÊ±£©£¬ËüÊÇÈçºÎËõСµÄ¡£ +>> °Ñ¹â±êÒƵ½±¾ÐÐÈ»ºóÊäÈë C-u 0 C-l¡£ + +>> ÊäÈë CONTROL-h k CONTROL-f¡£¹Û²ìµ±Ò»¸öд°¸ñ³öÏÖʱµ±Ç°´°¸ñ£¨ÓÃÀ´ÏÔʾ + CONTROL-f ÃüÁîµÄÎĵµ£©ÊÇÈçºÎËõСµÄ¡£ ->> ¼üÈë C-x 1 ÒÔʹÎĵµÁÐ±í´°¸ñÏûʧ¡£ +>> ÊäÈë C-x 1 ¹ØµôÎĵµ´°¸ñ¡£ -Õâ¸öÖ¸Áî²¢²»ÏñÄúÏÈÇ°Ëùѧ¹ýµÄÖ¸ÁîÄǰ㣬Ëü°üÀ¨ÁËÁ½¸ö×ÖÔª¡£ËüÊÇÒÔ×ÖÔª -CONTROL-x ×÷Ϊ¿ªÊ¼¡£ÓÐÒ»Õû¸öϵÁеÄÖ¸ÁîÊÇÒÔ CONTROL-x ×÷Ϊ¿ªÊ¼£»ËüÃÇÖ® -ÖÐÓÐÐí¶àÊÇÓ롸´°¸ñ¡¢µµ°¸¡¢ÔÝ´æÇøÒÔ¼°Ïà¹ØÊÂÎÓйصġ£ÕâЩָÁîÓÐ 2 ¡¢ -3 »ò 4 ¸ö×ÖÔª³¤¡£ +Õâ¸öÃüÁî¸úÏÈǰѧµ½µÄÃüÁ̫һÑù£¬ÒòΪËü°üº¬ÁËÁ½¸ö×Ö·û£¬ÒÔ CONTROL-x ¿ª +ʼ¡£ÓÐһϵÁÐÃüÁÊÇÒÔ CONTROL-x ¿ªÊ¼µÄ£¬ÕâЩÃüÁîÐí¶à¶¼¸ú¡°´°¸ñ¡¢Îļþ¡¢ +»º³åÇø¡¾»º³åÇø£¨buffer£©»áÔÚºóÎÄÏêϸ½éÉÜ¡¿¡±µÈµÈÖîÈç´ËÀàµÄ¶«Î÷Óйأ¬Æä +ÖÐÓÐЩÃüÁî¿ÉÄÜÓÐ 2 ¸ö¡¢3 ¸ö»òÕß 4 ¸ö×Ö·û³¤¡£ -* ²åÈëÓëɾ³ý£¨ INSERTING AND DELETING £© ----------------------------------------- +* ²åÈëÓëɾ³ý£¨INSERTING AND DELETING£© +-------------------------------------- + +²åÈëÎÄ×ֺܼòµ¥£¬ÇüüÅ̾ÍÐÐÁË¡£ÄãÄÜ¿´µ½µÄ×Ö·û£¬±ÈÈç A¡¢7¡¢* µÈµÈ£¬¶¼±» +Emacs ÊÓΪÎÄ×Ö²¢ÇÒ¿ÉÒÔÖ±½Ó²åÈë¡£Çà <Return>£¨»Ø³µ¼ü£©»á²åÈëÒ»¸ö»»Ðзû¡£ -Èç¹ûÄúÏëÒª²åÈëÎÄ×Ö£¬°ÑËü¼üÈë¾ÍÊÇÁË¡£Äú¿ÉÒÔ¿´µ½µÄ×ÖÔª£¬ÏñÊÇ A ¡¢ 7 ¡¢ * -µÈ£¬±» Emacs ÊÓΪÎÄ×Ö²¢ÇÒ¿ÉÒÔÖ±½Ó²åÈë¡£¼üÈë <Return> -£¨ carriage-return ¼ü£©ÒÔ²åÈëÒ»¸ö Newline ×ÖÔª¡£ +Äã¿ÉÒÔÓà <Delback> À´É¾³ý×îºóÊäÈëµÄµÄÒ»¸ö×Ö·û£¬Õâ¸ö¸úÄãÔÚ Emacs Ö®ÍâµÄ +Ó÷¨Ó¦¸ÃÒ»Ñù¡£Ò»°ãÀ´Ëµ <Delback> ¾ÍÊÇλÓÚ <Return> ¼üÉÏ·½Ä³´¦µÄÒ»¸ö´óºÅ +¼ü£¬Í¨³£±»±êʾΪ¡°Delete¡±¡¢¡°Del¡±»òÕß¡°Backspace¡±¡£ -Äú¿ÉÒÔ¼üÈë <Delback> ÒÔɾ³ýÄú×îºó¼üÈëµÄ×ÖÔª¡£<Delback> ÊÇÒ»¸öµÄ¼üÅ̼ü --- ¾ÍÊÇÄúͨ³£ÔÚ Emacs Í⣬ʹÓÃÀ´¡¸É¾³ýÄú×îºó¼üÈë×ÖÔª¡¹µÄͬһ¸ö¡£Ò»°ãÀ´ -˵ÊǸöÔÚ <Return> ÉÏ·½ÊýÐеĴó¼ü£¬Í¨³£±êʾΪ¡ºDelete¡»¡¢¡ºDel¡»»ò -¡ºBackspace¡»¡£ +Èç¹ûÄãÕÒµ½Á˱ê×Å¡°Backspace¡±µÄ¼ü£¬ÄÇôËüÓ¦¸Ã¾ÍÊÇ <Delback>£»¼´±ãÄãÓÖÔÚ +¼üÅÌÆäËüµØ·½ÕÒµ½ÁËÒ»¸ö±êʾΪ¡°Del¡±µÄ¼ü£¬ÄÇôËüÒ²Ó¦¸Ã²»ÊÇ <Delback>¡£ + +Ò»ÖÖ¸üͨÓõÄ˵·¨ÊÇ£¬<Delback> ½«Î»ÓÚ¹â±êÇ°µÄÒ»¸ö×Ö·ûɾ³ý¡£ -Èç¹ûÔÚÄÇÀïÓиö±êʾΪ¡ºBackspace¡»µÄ´ó¼ü£¬ÄÇôÄÇÒ»¸ö¾ÍÊÇÄúʹÓÃÀ´×÷Ϊ -<Delback> µÄ¼üÁË¡£Ä³¸öµØ·½¿ÉÄÜÒ²»áÓÐÁíÒ»¸ö±êʾΪ¡ºDelete¡»µÄ¼ü£¬µ«ÄǸö -²¢²»ÊÇ <Delback> ¡£ +>> ÏÖÔÚ¾ÍÊÔÊÔ¡ª¡ªÇõã×Ö£¬È»ºó°´¼¸Ï <Delback> ɾ³ýËüÃÇ¡£ + ²»Óõ£ÐÄÄã»áÐÞ¸ÄÎļþ£¬Äã¸Éʲô¶¼Ã»¹Øϵ£¬ÕâÀï¾ÍÊÇר¸øÄãÁ·Ï°Óõġ£ -¸üÒ»°ãµØ˵£¬ <Delback> ½«Î»ì¶Ä¿Ç°ÓαêλÖÃÇ°Ò»¸ö×ÖÔª¼ÓÒÔɾ³ý¡£ +Èç¹ûÒ»ÐÐÎÄ×ֺܳ¤¡¢³¬³öÁË´°¸ñµÄ¿í¶È£¬ÏÔʾ²»ÏµIJ¿·Ö»áÔÚ½ôÁÚµÄÏÂÒ»ÐмÌÐø +ÏÔʾ¡£Õâʱ»áÓÐÒ»¸ö·´Ð±Ïߣ¨¿ØÖÆ̨ÏÂÊÇ·´Ð±Ïߣ¬Èç¹ûÄãÓÃͼÐδ°¿Úϵͳ£¬ÔòÓ¦ +¸ÃÊÇÒ»¸öССµÄתÍä¼ýÍ·£©ÏÔʾÔÚÓÒ±ßÑØ£¬±íÃ÷ÕâÊÇijһÐеĽÓÐøÏÔʾ¡£ ->> ÏÖÔÚ×ö -- ¼üÈëһЩ×ÖÔª£¬È»ºó¼üÈ뼸´Î <Delback> À´É¾³ýËüÃÇ¡£ - ²»Òªµ£ÐÄÕâ¸öµµ°¸»á±»¸ü¶¯£»Äú²»»áÓ°Ïìµ½ÔÀ´µÄ¿ìËÙÖ¸ÄÏ¡£ - £¨ÄúÏÖÔÚ¿´µ½µÄ£©ÕâÒ»¸öÊÇÄúµÄ¸öÈË¿½±´¡£ +>> ÊäÈëÎÄ×Ö£¬Ò»Ö±µ½ÆÁÄ»µÄÓұ߽磬Ȼºó¼ÌÐø£¬Äã»á¿´µ½Ò»¸ö½ÓÐøÐгöÏÖ¡£ + +>> Óà <Delback> ɾµôһЩÎÄ×Ö£¬Ö±µ½´ËÐ㤶ÈСÓÚ´°¸ñ¿í¶È£¬½ÓÐøÐоÍÏûʧÁË¡£ -µ±Ò»ÐÐÎÄ×Ö±äµÃ±È¡¸ÔÚ´°¸ñÖеÄÒ»ÐС¹³¤Ê±£¬ÕâÒ»ÐÐÎÄ×ֻᡸ½ÓÐø¡¹µ½µÚ¶þÐд° -¸ñÐС£Õâʱһ¸ö·´Ð±Ïß¡¸\¡¹£¨»òÈç¹ûÄúʹÓô°¿Ú»¯µÄÏÔʾ£¬ÔòÊÇÒ»¸öССÍäÍä -µÄ¼ýÍ·£©»áλÔÚÆäÓұ߽çÒÔÖ¸³ö´ËÐнÓÐøÖø¡£ - ->> ²åÈëÎÄ×Ö£¬Ò»Ö±µ½Äú´ïµ½Óұ߽磬ȻºóÔÙ¼ÌÐø²åÈë¡£ - Äú»á¿´µ½Ò»¸ö½ÓÐøÐгöÏÖ¡£ +Äã¿ÉÒÔÏñɾ³ýÆäËû×Ö·ûÒ»Ñùɾ³ý»»Ðзû¡£É¾³ýÁ½ÐÐÖмäµÄ»»Ðзû»á½«Á½Ðкϲ¢³É +Ò»ÐС£Èç¹ûºÏ²¢µÄ½á¹ûʹÕâÒ»ÐÐÌ«³¤£¬³¬³öÁË´°¸ñµÄ¿í¶È£¬Ëü¾Í»áÒÔÒ»¸ö½ÓÐøÐÐ +À´ÏÔʾ¡£ ->> ʹÓà <Delback> ɾ³ýһЩÎÄ×Ö£¬Ö±µ½´ËÐÐÔٴγÉΪһ¸ö´°¸ñÐС£ - ½ÓÐøÐÐÏûʧÁË¡£ +>> Òƶ¯¹â±êµ½±¾ÐеĿªÍ·²¢ÊäÈë <Delback>¡£ + Õâʱ±¾ÐÐÓëÆäÇ°Ò»Ðн«±»ºÏ²¢ÎªÒ»ÐС£ -Äú¿ÉÒÔÏñɾ³ýÆäËû×ÖÔªÒ»ÑùµØɾ³ý Newline ×ÖÔª¡£½«Î»ÔÚÁ½ÐÐÖÐµÄ Newline ×Ö -Ԫɾ³ý»áÈÃËüÃǺϲ¢³ÉΪһÐС£Èç¹ûºÏ²¢µÄ½á¹ûʹÕâÒ»ÐÐÌ«³¤£¬ÒÔÖÂÎÞ·¨·ûºÏ´° -¸ñµÄ¿í¶È£¬Ëü»áÒÔÒ»¸ö½ÓÐøÐÐÀ´ÏÔʾ¡£ +>> ÊäÈë <Return> ÖØвåÈëÄã¸Õ²Åɾ³ýµÄ»»Ðзû¡£ ->> Òƶ¯Óα굽±¾ÐеĿªÍ·²¢¼üÈë <Delback>¡£ - Õâ»á½«±¾ÐÐÓëÆäÇ°Ò»ÐнáºÏΪһÐС£ - ->> ¼üÈë <Return> ÒÔÖØвåÈëÄú¸Õ²Åɾ³ýµÄ Newline ×ÖÔª¡£ +Ç°Ãæ˵¹ý£¬´ó²¿·ÖµÄ Emacs ÃüÁ¿ÉÒÔÖ¸¶¨Öظ´´ÎÊý£¬ÕâÆäÖÐÒ²°üÀ¨ÊäÈë×Ö·ûµÄ +ÃüÁî¡£Öظ´Ö´ÐÐÊäÈë×Ö·ûµÄÃüÁîʵ¼ÊÉϾÍÊÇÊäÈë¶à¸öÒ»ÑùµÄ×Ö·û¡£ -¼ÇµÃ´ó²¿·ÝµÄ Emacs Ö¸Á¿ÉÒÔ¸øÓèÒ»¸öÖظ´¼ÆÊý£¨ repeat count £©£»ÕâÒ² -°üÀ¨ÁËÎÄ×Ö×ÖÔª¡£Öظ´Ò»¸öÎÄ×Ö×ÖÔª»á½«Ëü²åÈëÊý´Î¡£ +>> ÊÔÊÔ C-u 8 *£¬Õ⽫»á²åÈë ********¡£ ->> ÏÖÔÚ¾ÍÊÔһϠ-- ¼üÈë C-u 8 * ÒÔ²åÈë ********¡£ +ºÃ£¬ÏÖÔÚÄãÓ¦¸ÃÒѾÕÆÎÕÁË×î»ù±¾µÄµÄÎı¾²åÈëºÍÐ޸ŦÄÜ£¬Æäʵɾ³ý»¹¿ÉÒÔ +¡°ÒÔ´ÊΪµ¥Î»¡±½øÐУ¬ÏÂÃæÊÇÒ»¸ö¹ØÓÚ¡°É¾³ý¡±²Ù×÷µÄС½á£º -ÄúÏÖÔÚÒѾѧµ½ÁË¡¸¼üÈë¸öʲô¶«Î÷½ø Emacs ÒÔ¼°ÐÞÕý´íÎ󡹵Ĵ󲿷ݻù±¾·½ -·¨¡£ÄúÒ²¿ÉÒÔ¡¸ÒÔ×Ö»òÐÐΪµ¥Î»¡¹µØɾ³ý¡£ÕâÀïÓзݹØ춡¸É¾³ý²Ù×÷¡¹µÄÕªÒª£º + <Delback> ɾ³ý¹â±êÇ°µÄÒ»¸ö×Ö·û + C-d ɾ³ý¹â±êºóµÄÒ»¸ö×Ö·û - <Delback> ɾ³ýÓαêËùÔÚµÄ Ç°Ò»¸ö×ÖÔª - C-d ɾ³ýÓαêËùÔÚµÄ ºóÒ»¸ö×ÖÔª + M-<Delback> ÒƳý¹â±êÇ°µÄÒ»¸ö´Ê + M-d ÒƳý¹â±êºóµÄÒ»¸ö´Ê - M-<Delback> ɾ³ýÓαêËùÔÚµÄ Ç°Ò»¸ö×Ö - M-d ɾ³ýÓαêËùÔÚµÄ ºóÒ»¸ö×Ö + C-k ÒƳý´Ó¹â±êµ½¡°ÐÐβ¡±¼äµÄ×Ö·û + M-k ÒƳý´Ó¹â±êµ½¡°¾äβ¡±¼äµÄ×Ö·û - C-k ɾ³ý´ÓÓαêËùÔÚµ½¡¸ÐÐβ¡¹¼äµÄ×ÖÔª - M-k ɾ³ý´ÓÓαêËùÔÚµ½¡¸¾äβ¡¹¼äµÄ×ÖÔª +¡¾¿ÉÄÜÄãÒѾעÒâµ½ÁË¡°É¾³ý£¨delete£©¡±ºÍ¡°ÒƳý£¨kill£©¡±µÄÓôÊÇø±ð£¬ºó +ÎÄ»áÓÐÏêϸ˵Ã÷¡£¡¿ -×¢Ò⡸<Delback> ºÍ C-d¡¹»¹ÓС¸M-<Delback> ºÍ M-d¡¹ÊÇƽÐеØ×Ô C-f ºÍ -M-f À©³ä³öÀ´µÄ£¨àÅ£¬<Delback> ²¢²»ÊÇ¿ØÖÆ×ÖÔª£¬µ«ÊÇûʲôºÃµ£Ðĵģ©¡£ -C-k ºÍ M-k ÔÚijÖ̶ֳÈÉÏÓë C-e ºÍ M-e Ò»Ñù£¬Èç¹û°Ñ¡¸Ò»ÐС¹ºÍ¡¸Ò»¾ä¡¹×÷ -ΪÀà±ÈµÄ»°¡£ +×¢Òâ¡°<Delback> ºÍ C-d¡±»¹ÓС°M-<Delback> ºÍ M-d¡±ÊǸù¾ÝÇ°Êö¹ßÀý´Ó C-f +ºÍ M-f ÑÜÉú³öÀ´µÄ£¨Æäʵ<Delback>²»ÊÇ¿ØÖÆ×Ö·û£¬ÎÒÃÇÏȺöÂÔÕâÒ»µã£©¡£C-k +ºÍ M-k µÄ¹ØϵÔÚijÖ̶ֳÈÉÏÓë C-e ºÍ M-e Ò»Ñù¡ª¡ªÈç¹û°Ñ¡°Ò»ÐС±ºÍ¡°Ò»¾ä¡± +×÷Ò»¸öÀà±ÈµÄ»°¡£ -ÄúÒ²¿ÉÒÔÖ»ÒÔÒ»ÖÖ·½·¨À´É¾³ý»º³åÇøÄÚµÄÈκβ¿·Ý£¬ÏÈÒƶ¯µ½ÄúÏëҪɾ³ýµÄ²¿·Ý -µÄÒ»¶Ë£¬È»ºó¼üÈë C-@ »ò C-SPC £¨ÈÎÒ»¸ö¼´¿É£©¡££¨ SPC Ö¸µÄÊÇ Space Bar -£©ÔÙÒƵ½ÄDz¿·ÝµÄÁíÒ»¶Ë£¬½ÓÖø¼üÈë C-w ¡£ÕâÑù¾Í»á°Ñ½éì¶ÕâÁ½¸öλÖüäµÄËù -ÓÐÎÄ×Öɾ³ý¡£ +ÄãÒ²¿ÉÒÔÓÃÒ»ÖÖͳһµÄ°ì·¨À´ÒƳý»º³åÇøÀïµÄÈκÎÒ»²¿·Ö£ºÊ×ÏȰѹâ±êÒƶ¯µ½Äã +ÏëÒªÒƳýµÄÇøÓòµÄÒ»¶Ë£¬È»ºó°´ C-@ »ò C-SPC£¨ÈÎÒ»¼´¿É£¬SPCÖ¸¿Õ¸ñ£©¡¾×¢Ò⣬ +C-SPC ÍùÍù±»ÖÐÎÄÓû§É趨³ÉÊäÈë·¨Èȼü£¬Èç¹ûÕâÑù£¬C-SPC ¾Í±»ÏµÍ³À¹½Ø¶øÎÞ +·¨ÊäÈë¸ø Emacs ÁË£¬Òò´ËÕâÀﻹÊÇÍƼöʹÓÃC-@¡£¡¿£¬È»ºóÔÙÒƶ¯µ½ÁíÒ»¶Ë£¬ÔÙ +°´ C-w ¾Í¿ÉÒÔ°ÑλÓÚÕâÁ½µãÖ®¼äµÄËùÓÐÎÄ×ÖÒƳýÁË¡£ ->> Òƶ¯Óα굽ÉÏÒ»¶Î¿ªÍ·µÄ¡¸Äú¡¹×Ö¡£ ->> ¼üÈë C-SPC ¡£ Emacs Ó¦¸Ã»áÔÚÓ©Ä»µÄÏ·½ÏÔʾһ¸ö¡¸Mark set¡¹Ñ¶Ï¢¡£ ->> Òƶ¯Óα굽µÚ¶þÐÐÖеġ¸¶Ë¡¹×Ö¡£ ->> ¼üÈë C-w ¡£ÕâÑù»á°Ñ´Ó¡¸Äú¡¹¿ªÊ¼µ½¸ÕºÃ¡¸¶Ë¡¹Ö®Ç°µÄÎÄ×Öɾ³ý¡£ +>> Òƶ¯¹â±êµ½ÉÏÒ»¶Î¿ªÍ·µÄ¡°Ä㡱×Ö¡£ +>> ÊäÈë C-@ ¡£Emacs Ó¦¸Ã»áÔÚÆÁÄ»µÄÏ·½ÏÔʾһ¸ö¡°Mark set¡±µÄÏûÏ¢¡£ +>> Òƶ¯¹â±êµ½µÚ¶þÐÐÖеġ°¶Ë¡±×Ö¡£ +>> ÊäÈë C-w£¬¾Í»á°Ñ´Ó¡°Ä㡱¿ªÊ¼µ½¡°¶Ë¡±Ö®Ç°µÄÎÄ×ÖÈ«²¿ÒƳý¡£ -ҪעÒâµÄÊÇ¡¸É±µô£¨ killing £©¡¹ºÍ¡¸É¾³ý£¨ deleting £©¡¹µÄ²»Í¬ÔÚ춱»É± -µôµÄ¿ÉÒÔÀ»Ø£¬¶ø±»É¾³ýµÄÔò²»ÄÜ¡£¡¾ÓеãÄÑÒÔÀí½â£¬Äú¿ÉÒÔÕâôÏ룺(1)¡¸±» -ɱµôµÄ¡¹Éдæʬ¹Ç£¬¶ø¡¸±»É¾³ýµÄ¡¹Ôòʬ¹ÇÎÞ´æÁË£¡¿É¼ûµÃ¶ÔµçÄÔ×ÊÁÏÀ´Ëµ£¬ -¡¸É¾³ý¡¹±È¡¸É±µô¡¹ÑÏÖضàÁË¡£(2)ʵ¼ÊÉÏ£¬¾ÍË㱻ɾ³ýÁË£¬ÎÒÃÇ»¹ÊÇÓм¼Êõ¿É -ÒÔ°ÑËü¾È»ØÀ´£¬ÓÈÆäÊÇÎÄ×Ö×ÊÁÏ£¬Ç°ÌáÊÇɾ³ýºó²»ÄܽøÐÐʵÌå¼ÇÒäÌåµÄ¸ñʽ»¯¶¯ -×÷¡£µ«Õâ¶Ôì¶Ò»°ãʹÓÃÕ߶øÑÔÊDz»¿ÉÄܵģ¬Òò´Ë¾Í²»¿¼ÂÇÕâÇéÐÎÁË¡£¡¿ÖØвåÈë -±»É±µôµÄÎÄ×Ö³ÆΪ¡¸À»Ø£¨ yanking £©¡¹¡£Ò»°ã¶øÑÔ£¬¿ÉÒÔÒƳýµôºÜ¶àÎÄ×ÖµÄ -Ö¸Áî»á°ÑÄÇЩÎÄ×Ö´¢´æÆðÀ´£¨ËüÃÇÉ趨³ÉÄú¿ÉÒÔ½«ÎÄ×ÖÀ»Ø£©£¬¶øÄÇЩֻÊÇɾ³ý -Ò»¸ö×ÖÔª»òÕßÖ»ÊdzýÈ¥¿Õ°×Ðлò¿Õ°×µÄÖ¸ÁÔò²»»á´¢´æÕâЩ±»É¾³ýµÄÎÄ×Ö£¨Òò -´ËÄú²»Äܽ«ÄÇÎÄ×ÖÀ»Ø£©¡£ +×¢Òâ,¡°ÒƳý£¨kill£©¡±ºÍ¡°É¾³ý£¨delete£©¡±µÄ²»Í¬ÔÚÓÚ±»ÒƳýµÄ¶«Î÷¿ÉÒÔÕÒ»Ø +À´£¬¶ø±»É¾³ýµÄ¾Í²»ÐÐÁË¡£¡¾Êµ¼ÊÉÏ£¬ÒƳýµôµÄ¶«Î÷ËäÈ»¿´ÆðÀ´¡°Ïûʧ¡±ÁË£¬µ« +ʵ¼ÊÉϱ» Emacs ¼Ç¼ÁËÏÂÀ´£¬Òò´Ë»¹¿ÉÒÔÕÒ»ØÀ´£»¶øɾ³ýµôµÄ¶«Î÷ËäȻҲ¿ÉÄÜ»¹ +ÔÚÄÚ´æÀµ«ÊÇÒѾ±»Emacs¡°Å×Æú¡±ÁË£¬ËùÒÔ¾ÍÕÒ²»»ØÀ´ÁË¡£¡¿ÖØвåÈë±»ÒƳý +µÄÎÄ×Ö³ÆΪ¡°Õٻأ¨yank£©¡±¡£Ò»°ã¶øÑÔ£¬ÄÇЩ»áÈ¥³ýºÜ¶àÎÄ×ÖµÄÃüÁî»á°ÑÈ¥³ý +µôµÄÎÄ×Ö´¢´æÆðÀ´£¨ËüÃDZ»É趨³ÉÁË¡°¿ÉÕٻء±£©£¬¶øÄÇЩֻÊÇÈ¥³ýÒ»¸ö×Ö·û»ò +ÕßÖ»ÊÇÈ¥³ý¿Õ°×µÄÃüÁî¾Í²»»á´¢´æÄÇЩ±»È¥³ýµôµÄ¶«Î÷£¨Òò´ËÄã¾ÍÎÞ·¨Õٻأ©¡£ ->> Òƶ¯Óα굽һ·Ç¿Õ°×ÐеĿªÊ¼¡£ - È»ºó¼üÈë C-k ɱµôÔÚÄÇÒ»ÐÐÉϵÄÎÄ×Ö¡£ ->> µÚ¶þ´Î¼üÈë C-k¡£Äú½«»á¿´µ½Ëüɱµô¸úÔÚÄÇÒ»ÐкóÃæµÄ Newline ×ÖÔª¡£ +>> Òƶ¯¹â±êµ½Ò»·Ç¿Õ°×ÐеÄÐÐÍ·£¬È»ºóÊäÈë C-k ÒƳýÄÇÒ»ÐÐÉϵÄÎÄ×Ö¡£ + +>> ÔÙ´Î C-k£¬Äã¿ÉÒÔ¿´µ½ËüÒƳýÁ˸úÔÚÄÇÒ»ÐкóÃæµÄ»»Ðзû¡£ -Çë×¢Òâµ¥¶ÀµÄ C-k »á°ÑÒ»ÐеÄÄÚÈÝɱµô£¬¶øµÚ¶þ¸ö C-k Ôò»áɱµôÄÇÒ»Ðб¾Éí£¬ -²¢ÇÒʹµÃËùÓÐÆäËûµÄÐÐÏòÉÏÒƶ¯¡£C-k ÒÔºÜÌرðµÄ·½Ê½À´´¦ÀíÊý×Ö²ÎÊý£¬Ëü»áɱ -µôºÜ¶àÐÐÒÔ¼°ËüÃǵÄÄÚÈÝ£¬Õâ²»½ö½öÊÇÖظ´¶øÒÑ£¬C-u 2 C-k »á°ÑÁ½ÐÐÒÔ¼°ËüÃÇ -µÄ Newline ×ÖԪɱµô£»Èç¹ûÖ»ÊǼüÈë C-k Á½´Î²¢²»»áÕâÑù¡£ +×¢Ò⣬µ¥¶ÀµÄ C-k »á°ÑÒ»ÐеÄÄÚÈÝÒƳý£¬¶øµÚ¶þ¸ö C-k Ôò»áÒƳý»»Ðзû£¬²¢Ê¹ +ÆäºóËùÓеÄÐж¼ÏòÉÏÒƶ¯¡£C-k ´¦ÀíÊý×Ö²ÎÊýµÄ·½Ê½ºÜÌرð£¬Ëü»á°Ñ²ÎÊýÖ¸¶¨µÄ +ÄÇô¶àÐÐÁ¬Í¬ÆäºóµÄ»»ÐзûÒ»ÆðÒƳý£¬¶ø²»½ö½öÊÇÖظ´ C-k ¶øÒÑ¡£±ÈÈç C-u 2 +C-k »á°ÑÁ½ÐÐÒÔ¼°ËüÃǵĻ»ÐзûÒƳý£»¶øÈç¹ûÖ»ÊÇÊäÈë C-k Á½´ÎÏÔÈ»²»ÊÇÕâ¸ö½á +¹û¡£ -½«±»É±µôµÄÎÄ×ֻظ´µÄ¶¯×÷³ÆΪ¡¸À»Ø£¨ yanking £©¡¹¡££¨°ÑËüÏëÏñ³ÉÄú°Ñ±ð -ÈË´ÓÄúÉíÉ϶áÈ¥µÄ¶«Î÷ÃÍÁ¦µØÀ»ØÀ´£©Äú¿ÉÒÔÔÚÄúɾ³ýÎÄ×ֵĵط½À»Ø£¬Ò²¿ÉÒÔ -ÔÚÎÄ×ÖµÄÆäËûµØ·½À»Ø¡£Äú¿ÉÒÔÀ»ØÊý´ÎͬÑùµÄÎÄ×Ö£¬ÒÔÖÆ×÷ËüµÄÊý·Ý¿½±´¡£ +½«±»ÒƳýµÄÎÄ×Ö»Ö¸´µÄ¶¯×÷³ÆΪ¡°Õٻأ¨yanking£©¡±¡££¨¾ÍºÃÏñÄã°Ñ±ðÈË´ÓÄãÉí +±ßÒÆ×ߵĶ«Î÷ÓÖÃÍÁ¦µØÀ»ØÀ´¡££©Äã¿ÉÒÔÔÚÄãɾ³ýÎÄ×ֵĵط½Õٻأ¬Ò²¿ÉÒÔÔÚ±ð +µÄµØ·½Õٻأ¬»¹¿ÉÒÔ¶à´ÎÕÙ»ØͬÑùµÄÎÄ×ÖÒԵõ½ËüµÄ¶à¸ö¿½±´¡£ -À»ØµÄÖ¸ÁîΪ C-y¡£Ëü»áÔÚÄ¿Ç°ÓαêµÄλÖÃÖØвåÈë×îºóɱµôµÄÎÄ×Ö¡£ +ÕٻصÄÃüÁîÊÇ C-y¡£Ëü»áÔÚ¹â±êËùÔÚ´¦²åÈëÄã×îºóÒƳýµÄÎÄ×Ö¡£ ->> ÊÔÊÔ¿´£»¼üÈë C-y ½«ÎÄ×ÖÀ»Ø¡£ +>> ÊÔÊÔ¿´£¬ÊäÈë C-y ½«ÎÄ×ÖÕٻء£ -Èç¹ûÄúÁ¬ÐøµØ×öÁËÊý´Î C-k£¬ËùÓб»É±µôµÄÎÄ×Ö¶¼»á±»´¢´æÔÚÒ»Æð£¬Òò´Ë×öÒ»´Î -C-y ¾Í»á°ÑËùÓÐÕâЩÐж¼À»ØÀ´¡£ +Èç¹ûÄãÒ»´ÎÁ¬°´Á˺ü¸Ï C-k£¬ÄÇôËùÓб»ÒƳýµÄÐлᱻ´æ´¢ÔÚÒ»Æð£¬Ö»ÒªÒ»¸ö +C-y ¾Í¿ÉÒÔ°ÑËüÃǶ¼Õٻء£ ->> ÏÖÔÚ×öһϣ¬¼üÈë C-k Êý´Î¡£ +>> ÔÚÕâÀïÊÔÊÔ£¬Á¬Ðø°´¼¸´Î C-k¡£ -ÏÖÔÚÒª»Ø¸´ÄÇЩɱµôµÄÎÄ×Ö£º +ÏÖÔÚÔÙÀ´»Ö¸´¸Õ¸Õ±»ÎÒÃÇÒƳýµÄÎÄ×Ö£º ->> ¼üÈë C-y¡£È»ºó°ÑÓαêÍùÏÂÒƶ¯¸ö¼¸ÐУ¬ÔÙÒ»´Î¼üÈë C-y¡£ - ÄúÏÖÔÚÖªµÀÈçºÎ¸´ÖÆijЩÎÄ×ÖÁË¡£ +>> °´ C-y¡£È»ºó°Ñ¹â±êÍùÏÂÒƶ¯¼¸ÐУ¬ÔÙ°´Ò»´Î C-y¡£ + ÏÖÔÚÄãÓ¦¸ÃÖªµÀÔõô¸´ÖÆÎÄ×ÖÁË¡£ + +C-y ¿ÉÒÔ°Ñ×î½üÒƳýµÄÎÄ×ÖÕٻأ¬µ«Èç¹ûÄãÏëÕٻصĶ«Î÷²»ÊÇ×î½üÒƳýµÄ£¬¸ÃÔõ +ô°ìÄØ£¿ËüÃǵ±È»Ã»Óжª£¬Äã¿ÉÒÔÓà M-y À´ÕÙ»ØËüÃÇ¡£ÔÚÓà C-y ÕÙ»Ø×î½üÒƳý +µÄÎÄ×ÖÖ®ºó£¬½ô½Ó×ÅÔÙÓà M-y ¾Í¿ÉÒÔÕÙ»ØÔÙÇ°Ò»´Î±»ÒƳýµÄÎÄ×Ö£¬ÔÙ°´Ò»´Î +M-y ÓÖ¿ÉÒÔÕÙ»ØÔÙÉÏÒ»´ÎµÄ£¬Òò´ËÖ»Òª¶à°´¼¸´Î M-y ¾Í¿ÉÒÔÕÒµ½ÄãÏëÒªÕٻصĶ« +Î÷ÁË¡£ÕÒµ½ÁËÖ®ºó£¬ÄãʲôҲ²»ÓÃ×ö£¬°ÑËüÃÇÁÀÔÚÄÇÀ¼ÌÐøÄãµÄ±à¼¾ÍÐÐÁË¡£ -Èç¹ûÄúÓÐһЩÎÄ×ÖÏëÒªÀ»ØÀ´£¬µ«ÊǺóÀ´ÄúÓÖɱÁËijЩ¶«Î÷£¬ÄÇô¸ÃÔõô×öÄØ£¿ -C-y »á°Ñ×î½üɱµôµÄÀ»ØÀ´£¬µ«ÊÇÏÈÇ°µÄÎÄ×Ö²¢Ã»ÓÐÏûʧ£¬Äú¿ÉÒÔÓà M-y À´»Ø -µ½Ëü¡£µ±ÄúÒѾʹÓà C-y °Ñ×î½üɱµôµÄÀ»ØÀ´Ö®ºó£¬ÔÙ¼üÈë M-y À´°ÑÕâЩÀ»Ø -À´µÄÎÄ×ÖÌ滻ΪÏÈÇ°ËùɱµôµÄ¡£Ò»´ÎÓÖÒ»´ÎµØ¼üÈë M-y »á°ÑÏÈÇ°ÔÙÏÈÇ°Ëùɱµô -µÄÎÄ×Ö´ø»ØÀ´¡£µ±Äúµ½ÁËÄúÏëÕÒµÄÎÄ×Öʱ£¬Äú²»ÐèÒª×öÈκÎÊÂÀ´±£´æËü£¬Ö»Òª¼Ì -ÐøÄúµÄ±à¼£¬°ÑÕâЩÒÑÀ»ØµÄÎÄ×ÖÁôÔÚÄÇÀï¾ÍºÃ¡£ +Èç¹ûÄãÒ»´Î°´ M-y °´Á˺ܶàÏ£¬Äã¿ÉÄÜ»á»Øµ½Æðʼµã£¬Ò²¾ÍÊÇ×î½üÒƳýµÄÎÄ×Ö¡£ +¡¾¿´µÃ³öÕâʵ¼ÊÉÏÊÇÒ»¸ö»·¡£¡¿ -Èç¹ûÄú M-y ×öÁ˺ܶà´Î£¬Äú¿ÉÄÜ»á»Øµ½Æðʼµã£¬Ò²¾ÍÊÇ×î½üɱµôµÄ¡£ - ->> ɱµôÒ»ÐУ¬µ½´¦ÈÆÈÆ£¬ÔÙɱµôÁíÒ»ÐС£ - È»ºóÓà C-y ½«µÚ¶þ´ÎɱµôµÄÄÇÐдø»ØÀ´¡£ - È»ºóÔÙÓà M-y£¬Ëü½«»á±»µÚÒ»´ÎɱµôµÄÄÇÐÐÈ¡´ú¡£ - ÔÙ×ö¼¸´Î M-y ¿´¿´Äú»áµÃµ½Ê²Ã´¡£ - ²»¼ä¶ÏµØ×ö£¬Ö±µ½µÚ¶þ¸öɱµôÐлØÀ´£¬ÔÙ×ö¸ö¼¸´Î¡£ - Èç¹ûÄúÏëµÄ»°£¬Äú¿ÉÒÔÊÔÖø¸ø M-y ÕýµÄ»òÊǸºµÄ²ÎÊý¡£ +>> ÒƳýÒ»ÐУ¬Òƶ¯Ò»Ï¹â±ê£¬È»ºóÔÙÒƳýÁíÍâÒ»ÐС£ + °´ C-y ½«µÚ¶þ´ÎÒƳýµÄÄÇÐÐÕÙ»ØÀ´¡£ + ½ô½Ó×ÅÔÙ°´ M-y£¬Ëü½«»á±»µÚÒ»´ÎÒƳýµÄÄÇÐÐÈ¡´ú¡£ + ÊÔ×ÅÔÙ°´¼¸Ï M-y ¿´¿´»á·¢Éúʲô¡£ + ÔÙ¼ÌÐø£¬Ö±µ½µÚ¶þÐб»ÕÙ»ØÀ´£¬È»ºóÔÙ×ö¸ö¼¸´Î¡£ + Èç¹ûÄãÔ¸Ò⣬Äã¿ÉÒÔÊÔןø M-y Ö¸¶¨Ò»¸öÕýµÄ»ò¸ºµÄ²ÎÊý¡£ -* È¡Ïû¶¯×÷£¨ UNDO £© --------------------- +* ³·Ïú£¨UNDO£© +-------------- -Èç¹ûÄú¶ÔÎÄ×Ö×öÁËһЩ¸Ä±ä£¬ºóÀ´¾õµÃËüÊǸö´íÎó£¬Äú¿ÉÒÔ Undo Ö¸ÁîÈ¡ÏûÕâÒ» -¸ö¸Ä±ä£¬C-x u¡£ +Èç¹ûÄãÐÞ¸ÄÁËÒ»¶ÎÎÄ×Ö£¬ÓÖ¾õµÃ¸ÄµÃ²»ºÃ£¬¿ÉÒÔÓà undo ÃüÁî½øÐг·Ïú£º +C-x u¡£ -ͨ³£ C-x u »á°ÑÒ»¸öÖ¸ÁîËùÔì³ÉµÄ¸Ä±äÈ¡Ïûµô£»Èç¹ûÄúÔÚÒ»ÐÐÖÐÖظ´ÁËÐí¶à´Î -C-x u£¬Ã¿Ò»¸öÖظ´¶¼»áÈ¡Ïû¶îÍâµÄÖ¸Áî¡£ +ͨ³£ C-x u »áÏû³ýÒ»¸öÃüÁîËùÔì³ÉµÄËùÓиı䣻Èç¹ûÄãÔÚÒ»ÐÐÖÐÁ¬Ðø¶à´ÎµØʹÓà +C-x u£¬Äã»á°ÑÒÔÇ°µÄÃüÁîÒ²ÒÀ´Î³·Ïú¡£ µ«ÊÇÓÐÁ½¸öÀýÍ⣺ -(1) ûÓиıäÎÄ×ÖµÄÖ¸Áî²»Ë㣨Õâ°üÀ¨ÁËÓαêÒƶ¯µÄÖ¸ÁÓоíÖáÖ¸Á£» -(2) ×ÔÐмüÈëµÄ×ÖÔªÒÔһȺһȺ -- ÿȺ×î¶à 20 ¸ö -- À´½øÐд¦Àí¡£ - £¨ÕâÊÇΪÁ˼õÉÙÄúÔÚÈ¡Ïû¡¸²åÈëÎÄ×Ö¶¯×÷¡¹Ëù±ØÐë¼üÈë C-x u µÄ´ÎÊý£© +1£© ûÓиıäÎÄ×ÖµÄÃüÁî²»Ë㣨°üÀ¨¹â±êÒƶ¯ÃüÁîºÍ¹ö¶¯ÃüÁ +2£© ´Ó¼üÅÌÊäÈëµÄ×Ö·ûÒÔ×éΪµ¥Î»¡ª¡ªÃ¿×é 20 ¸ö×Ö·û¡ª¡ªÀ´½øÐд¦Àí¡£ + £¨ÕâÊÇΪÁ˼õÉÙÄãÔÚ³·Ïú¡°²åÈëÎÄ×Ö¡±¶¯×÷ʱÐèÒªÊäÈë C-x u µÄ´ÎÊý£© ->> ÒÔ C-k ½«ÕâÒ»ÐÐɱµô£¬È»ºó¼üÈë C-x u ºóËü»áÔٴγöÏÖ¡£ +>> Óà C-k ½«ÕâÒ»ÐÐÒƳý£¬È»ºóÊäÈë C-x u £¬Ëü»áÔٴγöÏÖ¡£ -C-_ ÊÇÁíÒ»¸öÈ¡ÏûÖ¸ÁËüµÄ×÷ÓÃ¾ÍºÍ C-x u Ò»Ñù£¬µ«ÊÇÔÚÒ»ÐÐÖÐËü±È½ÏÈÝÒ× -¼üÈëÐí¶à´Î¡£C-_ µÄȱµãÊÇÔÚijЩ¼üÅÌÖв»Ì«Çå³þÈçºÎ¼üÈëËü£¬ÕâÒ²ÊÇΪʲôÎÒ -ÃÇͬʱÌṩ C-x u µÄÔÒò¡£ÔÚijЩÖն˻ú£¬Äú¿ÉÒÔ°´×¡ CONTROL ÔÙ¼üÈë / £¬ -À´¼üÈë C-_¡£ +C-_ Ò²Êdz·ÏúÃüÁËüµÄ×÷Óøú C-x u Ò»Ñù£¬µ«ÊÇËü±È½ÏÈÝÒ׶à´ÎÊäÈë¡£C-_ µÄ +ȱµãÊÇÔÚijЩ¼üÅÌÉÏ¿ÉÄܲ»Ì«ÈÝÒ×°´£¬ÕâÒ²ÕýÊÇÎÒÃÇͬʱÌṩ C-x u µÄÔÒò¡£ÔÚ +ijЩÖÕ¶ËÉÏ£¬Äã¿ÉÒÔ°´×¡ CONTROL ÔÙ°´¡°/¡±À´ÊäÈë C-_¡£ -Ò»¸öÊý×Ö²ÎÊý¶Ô C-_ or C-x u À´Ëµ£¬ÊÇ×÷ΪÖظ´µÄ´ÎÊý¡£ +Êý×Ö²ÎÊý¶ÔÓÚ C-_ ºÍ C-x u µÄÒâÒåÊÇÖ´Ðг·ÏúµÄÖظ´´ÎÊý¡£ -* µµ°¸£¨ FILE £© ----------------- - -ΪÁËʹÄú±à¼µÄÎÄ×ÖÓÀ¾Ã±£´æ£¬Äú±ØÐë°ÑËü·Åµ½Ò»¸öµµ°¸ÖС£²»È»£¬µ±ÄúÀ뿪 -Emacs ºó£¬Ëü¾Í»áËæÖ®Ïûʧ¡£ÎªÁË°ÑÄúµÄÎÄ×Ö·ÅÔÚµµ°¸ÖУ¬Äú±ØÐëÔÚÄú¼üÈëÕâЩ -ÎÄ×ÖÇ°¡¸ÕÒ£¨ find £©¡¹µµ°¸¡££¨ÕâÒ²³Æ֮Ϊ¡¸°Ý·Ã£¨ visiting £©¡¹µµ°¸£© +* Îļþ£¨FILE£© +-------------- -ÕÒÒ»¸öµµ°¸±íʾÄú¿ÉÒÔÔÚ Emacs Öп´µ½µµ°¸µÄÄÚÈÝ¡£´ÓÐí¶à·½ÃæÀ´¿´£¬Ëü¾ÍÏñ -ÊÇÄúÖ±½Ó±à¼ÄǸöµµ°¸Ò»Ñù¡£È»¶ø£¬Ö±µ½Äú¡¸´¢´æ¡¹Õâ¸öµµ°¸Ö®Ç°£¬ÄúʹÓà -Emacs ±à¼Ëù×ö³öµÄ¸Ä±ä²¢²»»á±£´æÏÂÀ´¡£Õâ¾ÍÊÇΪʲôµ±Äú²»ÏëҪʱ£¬Äú¿ÉÒÔ -±ÜÃâÁôÏÂÐ޸ĵ½Ò»°ëµÄµµ°¸ÔÚϵͳÖС£¼´Ê¹µ±Äú´¢´æÁË£¬Emacs Ò²»á°ÑÔ±¾µÄµµ -°¸ÒÔÒ»¸ö²»Í¬µÄÃû³Æ±£ÁôÏÂÀ´£¬ÈôÄúÉÔºó¾õµÃÄúµÄ¸Ä±äÊÇÒ»¸ö´íÎóµÄ»°£¬¾Í¿ÉÒÔ -ʹÓÃËü¡£ +Ïë±£´æ¹¤×÷³É¹û¾ÍÒª¼ÇµÃ´æÅÌ£¬·ñÔòÒ»µ©Í˳ö Emacs Äã±à¼µÄÎÄ×־Ͷ¼¶ªÁË¡£Òª +´æÅÌ£¬¾ÍÒªÔÚ±à¼Ç°¡°Ñ°ÕÒ¡±µ½Ò»¸ö´æÅÌÎļþ¡££¨Õâ¸ö¹ý³Ìͨ³£Ò²±»³ÆΪ¡°·ÃÎÊ¡± +Îļþ¡££© + +Ñ°ÕÒµ½Ò»¸öÎļþÒâζ×ÅÄã¿ÉÒÔÔÚ Emacs Àï²é¿´Õâ¸öÎļþµÄÄÚÈÝ¡£´ÓºÜ¶à½Ç¶È½²£¬ +Õâ¾ÍµÈÓÚÄãÔÚÖ±½Ó±à¼Õâ¸öÎļþ¡£µ«ÊÇÄãËù×öµÄÐÞ¸ÄÖ»ÓÐÔÚ¡°´æÅÌ¡±µÄʱºò²Å»á +±»Ð´ÈëÎļþ¡£Ò²ÕýÒòΪÈç´Ë£¬Äã¿ÉÒÔ¶ªÆúÒ»¸ö¸Äµ½Ò»°ëµÄÎļþ¶ø²»±Ø°ÑÕâ¸ö²Ð·Ï +ÎļþÒ²±£´æµ½¼ÆËã»úÉÏ¡£×îºó¾ÍËãÄãÕæÕý´æÁËÅÌ£¬Emacs Ò²»á°Ñ´æÅÌÇ°µÄÎļþÖØ +ÃüÃû±£´æ£¬ÒÔ·ÀÄã¸ÄÍêÖ®ºóÓÖÏë·´»Ú¡£ -ÔÚ¿¿½üÓ©Ä»µÄÏ·½£¬Äú¿ÉÒÔ¿´µ½ÓÉÆÆÕۺſªÊ¼Óë½áÊøµÄÒ»ÐÐ -- ͨ³£ÊÇÒÔ¡¸--:-- -TUTORIAL.cn¡¹»òÆäËûÀàËƵĶ«Î÷×÷Ϊ¿ªÊ¼¡£ÕâÊÇÓ©Ä»µÄÒ»²¿·Ö£¬Í¨³£ÓÃÀ´±íʾ -ÄúÕýÔڰݷõĵµ°¸¡£ÏÖÔÚ£¬ÄúÕýÔڰݷõĵµ°¸½Ð×ö¡¸TUTORIAL.cn¡¹£¬ËüÊÇÄú¸ö -È˵Ŀ½±´¡£µ±ÄúÒÔ Emacs ÕÒ³öÒ»¸öµµ°¸Ê±£¬ÄǸöµµ°¸µÄÃû×־ͻá³öÏÖÔÚÄǸöµØ -·½¡£ +ÔÚÆÁÄ»µÄÏ·½£¬ÄãÓ¦¸ÃÄܹ»¿´µ½Í·Î²¶¼ÊǶÌÏß¡°-¡±µÄÒ»ÐУ¬Æ俪ͷͨ³£¶¼ÊÇÖîÈç +¡°--:-- TUTORIAL.cn¡±ÕâÑùµÄ¶«Î÷£¬ÕâЩÎÄ×־ʹú±íÁËÄ㵱ǰÕýÔÚ·ÃÎʵÄÎļþ¡£ +ÏÖÔÚÄã·ÃÎʵÄÎļþ½Ð¡°TUTORIAL.cn¡±£¬ËüÖ»ÊǸøÄã¸öÈËÁÙʱʹÓõÄÒ»¸ö¿½±´¡£Ö» +ÒªÄãÓà Emacs Ñ°ÕÒµ½Ò»¸öÎļþ£¬ÎļþÃû¾Í»á³öÏÖÔÚÉÏÊöλÖᣠ-¹Øì¶Ñ°ÕÒµµ°¸µÄÖ¸ÁîÖУ¬ÓÐÒ»¸öºÜÌرðµÄÊÇ£¬Äú±ØÐë˵³öÕâ¸öÄúÏëÒªµÄµµ°¸Ãû³Æ¡£ -ÎÒÃÇ˵Õâ¸öÖ¸Á´ÓÖն˻úÖжÁ½øÁËÒ»¸ö²ÎÊý¡¹¡££¨ÔÚÕâ¸öÀý×ÓÖУ¬Õâ²ÎÊý¾ÍÊÇ -µµ°¸µÄÃû³Æ£©µ±Äú¼üÈëÕâ¸öÖ¸Áîºó£¬ +Ñ°ÕÒÎļþµÄÃüÁîÓÐÒ»¸öÌرðÖ®´¦£¬ÄǾÍÊÇÄã±ØÐë¸ø³öÎļþÃû¡£ÎÒÃdzÆÕâ¸öÃüÁî +¡°´ÓÖն˶ÁÈëÁËÒ»¸ö²ÎÊý¡±£¨ÔÚÕâÀÕâ¸ö²ÎÊýÏÔÈ»¾ÍÊÇÎļþÃû£©¡£µ±ÄãÊäÈëÁË +Õâ¸öÃüÁîÖ®ºó£º - C-x C-f ÕÒÒ»¸öµµ°¸ + C-x C-f Ñ°ÕÒÒ»¸öÎļþ -Emacs »áÒªÄú¼üÈëµµÃû¡£ÄúËù¼üÈëµÄµµÃû»á³öÏÖÔÚÓ©Ä»µÄµ×ÐС£ÔÚ±»ÓÃÀ´×÷ΪÕâ -ÖÖÐÎʽµÄÊäÈëʱ£¬µ×Ðб»³ÆΪС»º³åÇø£¨ minibuffer £©¡£Äú¿ÉÒÔʹÓÃÕý³£µÄ -Emacs ±à¼Ö¸ÁîÀ´±à¼Õâ¸öµµÃû¡£ +Emacs »áÌáʾÄãÊäÈëÎļþÃû¡£ÄãÊäÈëµÄÎļþÃû»á³öÏÖÔÚÆÁÄ»×îµ×¶ËµÄÒ»ÐУ¬ÕâÒ» +Ðб»³ÆΪС»º³å£¨minibuffer£©£¬ÔÚС»º³åÀïÄã¿ÉÒÔʹÓÃͨ³£µÄ Emacs ±à¼ÃüÁî +À´±à¼ÎļþÃû¡£ -µ±ÄúÕýÔÚ¼üÈëµµÃûʱ£¨»òÊÇÈκεÄС»º³åÇøÊäÈëʱ£©£¬Äú¿ÉÒÔÓà C-g Õâ¸öÖ¸Áî -À´È¡ÏûËü¡£ +ÔÚС»º³åÀïÊäÈëÎļþÃû£¨ÆäʵÊäÈë±ðµÄ¶«Î÷Ò²Ò»Ñù£©Ê±¿ÉÒÔÓà C-g È¡Ïû¡£ ->> ¼üÈë C-x C-f£¬È»ºó¼üÈë C-g¡£Õâ»áÈ¡ÏûС»º³åÇø£¬ - ²¢ÇÒÒ²»áÈ¡ÏûʹÓÃÕâ¸öС»º³åÇøµÄ C-x C-f Ö¸Áî¡£ - Òò´ËÄúûÓÐÕÒÈκεµ°¸¡£ +>> ÊäÈë C-x C-f£¬È»ºóÊäÈë C-g + Õâ»á¹ØµôС»º³å£¬Í¬Ê±Ò²»áÈ¡ÏûʹÓÃС»º³åµÄ C-x C-f ÃüÁî¡£ + µ±È»ÁË£¬ÄãҲûÓÐÕÒÈκÎÎļþ¡£ -µ±ÄúÒѾ¼üÈëÁËÕâ¸öµµÃû£¬Çë¼üÈë <Return> À´½áÊøËü¡£È»ºó C-x C-f Ö¸Áî¾Í -»á¿ªÊ¼ÔË×÷£¬²¢ÇÒÕÒµ½ÄúËùÑ¡ÔñµÄµµ°¸¡£Ð¡»º³åÇøÔÚµ± C-x C-f Ö¸Áî½áÊøʱ¾Í -»áÏûʧ¡£ +ÊäÈëÍêÎļþÃûÖ®ºóÓà <Return> ½áÊø£¬È»ºó C-x C-f ÃüÁʼ¹¤×÷²¢ÕÒµ½ÄãÖ¸¶¨ +µÄÎļþ¡£Ð¡»º³åÔÚ C-x C-f ÃüÁî½áÊøÖ®ºóÒ²»áÏûʧ¡£ -¹ýÁËÒ»»á¶ù£¬µµ°¸µÄÄÚÈݾͻá³öÏÖÔÚÓ©Ä»£¬È»ºóÄú¾Í¿ÉÒÔ±à¼ËüµÄÄÚÈÝ¡£µ±ÄúÏë -ÒªÄúµÄ¸Ä±äÓÀ¾Ã±£´æʱ£¬¼üÈëÕâ¸öÖ¸Á +Õ£ÑÛ¼äÎļþ¾Í»áÏÔʾÔÚÆÁÄ»ÉÏ£¬Äã¿ÉÒÔ¿ªÊ¼±à¼ÁË¡£´æÅÌÓÃÕâ¸öÃüÁ - C-x C-s ´¢´æÕâ¸öµµ°¸ + C-x C-s ´¢´æÕâ¸öÎļþ -Õâ»á°ÑÔÚ Emacs ÖеÄÎÄ×Ö¸´ÖƵ½µµ°¸ÖС£µ±ÄúµÚÒ»´Î×öÕâ¸ö¶¯×÷ʱ£¬Emacs »á -½«ÔʼµÄµµ°¸ÖØÐÂÃüÃû³ÉÒ»¸öеÄÃû×Ö£¬ÕâÑùËü²Å²»»áÏûʧ¡£ÐµÄÃû×Öͨ³£»á¼Ó -È롸~¡¹µ½Ôʼµµ°¸µÄÃû×ÖºóÃæ¡£ +Õâ¸öÃüÁî°Ñ Emacs ÖеÄÎÄ×Ö´æ´¢µ½ÎļþÖС£µÚÒ»´Î´æÅ̵Äʱºò Emacs »á½«ÔÎÄ +¼þÖØÃüÃûÒÔ±£ÁôÔÎÄ¡£ÖØÃüÃûµÄ¹æÔòͨ³£ÊÇÔÚÔÎļþÃûÖ®ºóÌí¼ÓÒ»¸ö¡°~¡±×Ö·û¡£ -µ±´¢´æ½áÊøʱ£¬Emacs »á°ÑдÈëµµ°¸µÄÃû×ÖÁгöÀ´¡£ÄúÓ¦¸Ã¾³£µØ½øÐд¢´æ£¬Õâ -Ñù×ÓÈç¹ûϵͳµ±»úʱ£¬Äú¾Í²»»áËðʧ̫¶à¹¤×÷¡£ +´æÅ̽áÊøºó£¬Emacs »áÏÔʾдÈëÎļþµÄÎļþÃû¡£Äã×îºÃÑø³É¾³£´æÅ̵ÄÏ°¹ß£¬Õâ +ÑùÔÚϵͳ±ÀÀ£»òÕßËÀ»úµÄʱºòÄã²»»áËðʧ̫¶à¡£ ->> ¼üÈë C-x C-s ÒÔ´¢´æ±¾¿ìËÙÖ¸ÄϵÄÄúµÄ¿½±´¡£ - Õâ»á°Ñ¡¸Wrote ...TUTORIAL.cn¡¹Õâ¸öѶϢÏÔʾÔÚÓ©Ä»µÄÏ·½¡£ +>> ÊäÈë C-x C-s °Ñ±¾¿ìËÙÖ¸ÄÏ´æÏÂÀ´¡£ + Äã»á¿´µ½¡°Wrote ...TUTORIAL.cn¡±ÕâÑùµÄÏûÏ¢ÏÔʾÔÚÆÁÄ»µÄÏ·½¡£ -×¢Ò⣺ÔÚijЩϵͳÖУ¬¼üÈë C-x C-s ½«»á°ÑÓ©Ä»¶³½á£¬Äú½«¿´²»µ½´Ó Emacs À´ -µÄÈκÎÊä³ö¡£Õâ±íʾ²Ù×÷ϵͳһ¸ö³ÆΪ¡¸Á÷³Ì¿ØÖÆ¡¹µÄ¡¸¹¦ÄÜ¡¹½« C-s Ö¸ÁîÀ¹ -½Øס£¬²¢ÇÒ²»ÈÃËü´«µ½ Emacs¡£ÒªÈ¡ÏûÓ©Ä»µÄ¶³½á£¬Çë¼üÈë C-q¡£È»ºóµ½ Emacs -ʹÓÃÊÖ²áÖп´¿´¶Ô춡¸½¥½øʽËÑÑ°µÄͬʱ½øÈ루 Spontaneous Entry to -Incremental Search £©¡¹Õâ¸öÖ÷Ì⣬ÒÔÈ¡µÃ´¦ÀíÕâ¸ö¡¸¹¦ÄÜ¡¹µÄ½¨Òé¡£ +×¢Ò⣺ʹÓÃijЩÖն˵Äʱºò£¬ÊäÈë C-x C-s »á¶³½áÆÁÄ»¡¾ÆÁĻûÓÐÈκÎÊä³ö¡¿£¬ +ÕâÑùÄã¾Í¿´²»µ½ Emacs µÄÈκα仯¡£ÆäÔÒòÊDzÙ×÷ϵͳµÄ¡°Á÷Á¿¿ØÖÆ¡±¹¦ÄÜ°Ñ +C-s À¹½ØÁË£¬²¢ÇÒ¶³½áÁËÆÁÄ»£¬Emacs ×ÔȻҲ¾Í¿´²»µ½Õâ¸öÊäÈëÁË¡£Óà C-q ¿ÉÒÔ +½â³ýÆÁÄ»¶³½á¡£Òª½â¾öÕâ¸öÎÊÌ⣬Çë²Î¿¼ Emacs ÊÖ²áÀïµÄ¡°Spontaneous Entry +to Incremental Search¡±Ò»½Ú¡¾Emacs ÊÖ²á¿ÉÄÜ»¹Ã»ÓÐÖÐÎÄ·Òë¡¿£¬ÄÇÀï¿ÉÄÜÓÐ +һЩÓÐÓõĽ¨Òé¡£ -Äú¿ÉÒÔÕÒ³öÒ»¸öÒѾ´æÔڵĵµ°¸£¬È»ºó¹Û¿´Ëü»ò±à¼Ëü¡£ÄúÒ²¿ÉÒÔÕÒÒ»¸ö»¹Ã»ÓÐ -´æÔÚ¹ýµÄµµ°¸¡£ÕâÊÇÒÔ Emacs ½¨Á¢Ò»¸öµµ°¸µÄ·½·¨£ºÕÒÕâ¸öµµ°¸£¬¾Í´ÓÁ㿪ʼ£¬ -È»ºó¿ªÊ¼²åÈëÎÄ×Öµ½Õâ¸öµµ°¸ÖС£µ±ÄúÒªÇ󡸴¢´æ¡¹Õâ¸öµµ°¸£¬Emacs »áÕæµÄ½¨ -Á¢Ò»¸öµµ°¸£¬²¢°ÑÄúËù²åÈëµÄÎÄ×Ö°Úµ½µµ°¸ÖС£´ÓÄÇʱºò¿ªÊ¼£¬Äú¾Í¿ÉÒÔµ±×Ô¼º -ÊÇÔÚ±à¼Ò»¸öÒѾ´æÔڵĵµ°¸ÁË¡£ +Äã¿ÉÒÔÑ°ÕÒÒ»¸öÒÑÓеÄÎļþÈ»ºó²é¿´»òÕ߱༣¬Ä㻹¿ÉÒÔÑ°ÕÒÒ»¸ö²»´æÔÚµÄÎļþ¡£ +ʵ¼ÊÉÏÕâÕýÊÇÓà Emacs ´´½¨ÐÂÎļþµÄ·½·¨£ºÕÒµ½²»´æÔÚµÄÐÂÎļþ£¬È»ºó´ÓÁ㿪ʼ¡£ +ÔÚ´æÅ̵Äʱºò£¬Emacs ²ÅÕæÕý´´½¨Õâ¸öÎļþÈ»ºóÔÙ´æÅÌ¡£ÔÚÕâÖ®ºóÒ»Çо͸úÄã±à +¼Ò»¸öÒÑÓÐÎļþÒ»ÑùÁË¡£ -* »º³åÇø£¨ BUFFER £© --------------------- +* »º³åÇø£¨BUFFER£© +------------------ -Èç¹ûÄúÒÔ C-x C-f¡¸ÕÒ¡¹µÚ¶þ¸öµµ°¸£¬µÚÒ»¸öµµ°¸ÈÔÈ»´æÔÚ Emacs ÄÚ¡£ÒªÇл» -»ØËü£¬Äú¿ÉÒÔ C-x C-f ÔÙÕÒËüÒ»´Î¡£ÒÀ´Ë·½Ê½£¬Äú¿ÉÒÔÔÚ Emacs ÄÚ¿ªÆô²»ÉÙµµ -°¸¡£ +Èç¹ûÄãÓà C-x C-f ÕÒµ½µÚ¶þ¸öÎļþ£¬µÚÒ»¸öÎļþÈÔÈ»»áÔÚ Emacs Àï¡£ÒªÇÐ»ØµÚ +Ò»¸öÎļþ£¬Äã¿ÉÒÔ C-x C-f ÔÙ´ÎÑ°ÕÒËü¡£ÕâÑù£¬Äã¿ÉÒÔÔÚ Emacs Àïͬʱ´ò¿ªºÜ +¶àÎļþ¡£ ->> ÒÔ¼üÈë C-x C-f foo <Return> µÄ·½Ê½½¨Á¢Ò»¸öÃûΪ¡¸foo¡¹µÄµµ°¸¡£ - È»ºó²åÈëһЩÎÄ×Ö£¬±à¼Ëü£¬È»ºóÔÙÒÔ C-x C-s ´¢´æ¡¸foo¡¹¡£ - ×îºó£¬¼üÈë C-x C-f TUTORIAL.cn <Return> »Øµ½±¾¿ìËÙÖ¸ÄÏ¡£ +>> Óà C-x C-f foo <Return> µÄ·½Ê½½¨Á¢Ò»¸öÃûΪ¡°foo¡±µÄÎļþ¡£ + È»ºóÇÃÈëһЩÎÄ×Ö£¬ÔÙÓà C-x C-s ±£´æÎļþ¡°foo¡±¡£ + ×îºó£¬ÊäÈë C-x C-f TUTORIAL.cn <Return> »Øµ½ÕâÀï¡£ -Emacs ´¢´æÿ¸öµµ°¸µÄÎÄ×ÖÔÚÒ»¸ö³ÆΪ¡¸»º³åÇø£¨ buffer £©¡¹µÄÎï¼þÖС£ÕÒÒ» -¸öµµ°¸»áÔÚ Emacs ÄÚ²¿½¨Á¢Ò»¸ö»º³åÇø¡£ÏëÒª¿´Ä¿Ç°´æÔÚÄúµÄ Emacs µÄ¹¤×÷ÖÐ -»º³åÇøÁÐ±í£¬¼üÈë +Emacs °Ñÿ¸ö±à¼ÖеÄÎļþ¶¼·ÅÔÚÒ»¸ö³ÆΪ¡°»º³åÇø£¨buffer£©¡±µÄµØ·½¡£Ã¿Ñ° +ÕÒµ½Ò»¸öÎļþ£¬Emacs ¾ÍÔÚÆäÄÚ²¿¿ª±ÙÒ»¸ö»º³åÇø¡£ÓÃÏÂÃæµÄÃüÁî¿ÉÒÔÁгöµ±Ç° +ËùÓеĻº³åÇø£º C-x C-b Áгö»º³åÇø >> ÏÖÔÚ¾ÍÊÔһϠC-x C-b -¿´¿´Ã¿Ò»¸ö»º³åÇøÊÇÈçºÎÃüÃûµÄ£¬ËüÒ²¿ÉÄÜͬʱӵÓÐÒ»¸ö¡¸´¢´æÆäÄÚÈݵĵµ°¸¡¹ -µÄÃû³Æ¡£ÄúÔÚÒ»¸ö Emacs ´°¸ñËù¼ûµ½µÄ¡¸ÈκΡ¹ÎÄ×Ö¶¼ÊÇij¸ö»º³åÇøµÄÒ»²¿·Ý¡£ +¹Û²ìһϻº³åÇøÊÇÈçºÎÃüÃûµÄ£¬ËüºÜ¿ÉÄܸúÆä¶ÔÓ¦µÄÎļþͬÃû¡£ÊÂʵÉÏ£¬ÄãÔÚÒ» +¸ö Emacs ´°¸ñÀï¿´µ½µÄÈκÎÎÄ×Ö¶¼ÊÇij¸ö»º³åÇøµÄÒ»²¿·Ö¡£ ->> ¼üÈë C-x 1 ÒÔÀ뿪»º³åÁбí +>> ÊäÈë C-x 1 À뿪»º³åÇøÁбí -µ±ÄúÓÐÊý¸ö»º³åÇøʱ£¬ÔÚÈκÎʱºòÆäÖÐÖ»ÓÐÒ»¸öÊÇ¡¸Ä¿Ç°×÷Óõġ¹¡£¶øÄǸö¾ÍÊÇ -ÄúÔڱ༵Ļº³åÇø¡£Èç¹ûÄúÏëÒª±à¼ÁíÒ»¸ö»º³åÇø£¬ÄÇôÄú±ØÐ롸Çл»¡¹µ½Ëü¡£ -Èç¹ûÄúÏëÒªÇл»µ½Á¬½Óµ½Ä³¸öµµ°¸µÄ»º³åÇø£¬Äú¿ÉÒÔÓà C-x C-f ÔٴΰݷÃÄǸö -µµ°¸¡£µ«ÊÇÓиö±È½Ï¼òµ¥µÄ·½Ê½£ºÊ¹Óà C-x b £»ÔÚÕâ¸öÖ¸ÁîÖУ¬Äú±ØÐë¼üÈ뻺 -³åÇøµÄÃû³Æ¡£ +²»¹Ü´æÔÚ¶àÉÙ»º³åÇø£¬ÈκÎʱºò¶¼Ö»ÄÜÓÐÒ»¸öÊÇ¡°µ±Ç°¡±»º³åÇø£¬Ò²¾ÍÊÇÄãÕýÔÚ +±à¼µÄÕâ¸ö¡£Èç¹ûÄãÏë±à¼ÁíÍâÒ»¸ö»º³åÇø£¬ÄÇôÄã±ØÐë¡°Çл»¡±¹ýÈ¥¡£ÉÏÃæ½² +¹ý£¬Óà C-x C-f ¿ÉÒÔÇл»µ½Ä³¸öÎļþ¶ÔÓ¦µÄ»º³åÇø¡£²»¹ý»¹ÓÐÒ»¸ö¸ü¼òµ¥µãµÄ°ì +·¨£¬ÄǾÍÊÇÓà C-x b¡£ÓÃÕâ¸öÃüÁÄã±ØÐëÊäÈ뻺³åÇøµÄÃû³Æ¡£ ->> ¼üÈë C-x b foo <Return> ÒԻص½º¬Óеµ°¸¡¸foo¡¹µÄÎÄ×ֵĻº³åÇø¡£ - È»ºó½¨Èë C-x b TUTORIAL <Return> ÒԻص½±¾¿ìËÙÖ¸ÄÏ¡£ +>> ÊäÈë C-x b foo <Return> ÒԻص½Îļþ¡°foo¡±µÄ»º³åÇø¡£ + È»ºóÊäÈë C-x b TUTORIAL.cn <Return> »Øµ½ÕâÀï¡£ -¾Í´ó²¿·ÝµÄÇé¿öÀ´Ëµ£¬»º³åÇøµÄÃû³ÆÓëµµ°¸µÄÃû³ÆÊÇÏàͬµÄ£¨³ýÈ¥Á˵µÃûÖеÄÄ¿ -¼²¿·Ý£©¡£È»¶ø²¢²»×ÜÊÇÈç´Ë¡£ÄúÒÔ C-x C-b ËùÖÆ×÷³öµÄ»º³åÇøÁбí×ÜÊÇ»áÏÔ -ʾ¸øÄúÿһ¸ö»º³åÇøµÄÃû³Æ¡£ +´ó¶àÊýÇé¿öÏ£¬»º³åÇøºÍÓëÆä¶ÔÓ¦µÄÎļþÊÇͬÃûµÄ£¨²»°üÀ¨Ä¿Â¼Ãû£©£¬²»¹ýÕâÒ² +²»ÊǾø¶ÔµÄ¡£Óà C-x C-b µÃµ½µÄ»º³åÇøÁбíÖÐÏÔʾµÄ×ÜÊÇ»º³åÇøµÄÃû³Æ¡£ -ÄúÔÚÒ»¸ö Emacs ´°¸ñÖÐËù¼ûµ½µÄ¡¸ÈκΡ¹ÎÄ×Ö×ÜÊÇij¸ö»º³åÇøµÄÒ»²¿·Ý¡£ÓÐÒ» -Щ»º³åÇø²¢Ã»ÓÐÁ¬½Óµ½µµ°¸¡£¾ÙÀýÀ´Ëµ£¬ÃüÃûΪ¡¸*Buffer List*¡¹µÄ»º³åÇø²¢ -ûÓÐÈκεµ°¸¡£ËüÊÇ°üº¬ÓÐÄúÒÔ C-x C-b Ö¸ÁîËùÖÆ×÷³öÀ´µÄ»º³åÇøÁбíµÄ»º³å -Çø¡£ÃüÃûΪ¡¸*Messages*¡¹µÄ»º³åÇøҲûÓÐÁ¬½Óµ½Èκεµ°¸£»ËüÔÚÄúµÄ Emacs -²Ù×÷½×¶ÎÖаüº¬³öÏÖÔÚµ×ÐеÄѶϢ¡£ +ÄãÔÚ Emacs ´°¸ñÀï¿´µ½µÄ¡°ÈκΡ±ÎÄ×Ö¶¼Ò»¶¨ÊÇÊôÓÚij¸ö»º³åÇøµÄ¡£Ò²ÓÐЩ»º³å +Çø²¢Ã»ÓжÔÓ¦Îļþ£º±ÈÈçÏÔʾ»º³åÇøÁбíµÄ»º³åÇø¾ÍÊÇÕâÑù£¬ÔÙ±ÈÈçÒ»¸öÃû½Ð +¡°*Messages*¡±µÄ»º³åÇøҲûÓжÔÓ¦µÄÎļþ£¬Õâ¸ö»º³åÇøÀï´æ·ÅµÄ¶¼ÊÇÔÚ Emacs +µ×²¿³öÏÖµÄÏûÏ¢¡£ ->> ¼üÈë C-x b *Messages* <Return> À´¿´¿´Ñ¶Ï¢µÄ»º³åÇø¡£ - È»ºó¼üÈë C-x b TUTORIAL <Return> »Øµ½±¾¿ìËÙÖ¸ÄÏ¡£ +>> ÊäÈë C-x b *Messages* <Return> ³ò³òÏûÏ¢»º³åÇøÀﶼÓÐʲô¶«Î÷¡£ + È»ºóÔÙÊäÈë C-x b TUTORIAL.cn <Return> »Øµ½ÕâÀï¡£ -Èç¹ûÄú¶Ôµµ°¸ÖеÄÎÄ×Ö×öÁËÐ޸ģ¬È»ºóÕÒÁíÒ»µµ°¸£¬Õâ¸ö¶¯×÷²¢²»»á´¢´æµÚÒ»¸ö -µµ°¸¡£ËüµÄÐÞ¸ÄÈԾɴæÔÚ Emacs ÖУ¬Ò²¾ÍÊÇÔÚÄǸöµµ°¸µÄ»º³åÇøÖС£¶Ô춵ڶþ -¸öµµ°¸µÄ½¨Á¢»ò±à¼²¢²»»áÓ°Ïìµ½µÚÒ»¸öµµ°¸µÄ»º³åÇø¡£ÕâÑù×ӷdz£ÓÐÓ㬵«Õâ -¸öÇéÐÎÒ²±íÃ÷ÁËÄúÐèÒª¡¸Ò»¸ö·½±ãµÄ·½·¨¡¹À´´¢´æµÚÒ»¸öµµ°¸µÄ»º³åÇø¡£Ö»ÊÇΪ -´¢´æµÚÒ»¸öµµ°¸¾Í±ØÐëÒÔ C-x C-f Çл»»º³åÇø£¬²ÅÄÜÒÔ C-x C-s ½«Ëü´¢´æ£¬×Ü -ÊǸöÈÃÈËÌÖÑáµÄ¹ý³Ì¡£Òò´ËÎÒÃÇÓÐ +Èç¹ûÄã¶ÔÎļþ×öÁËÐ޸ģ¬È»ºóÇл»µ½ÁíÒ»¸öÎļþ£¬Õâ¸ö¶¯×÷²¢²»»á°ïÄã°ÑµÚÒ»¸ö +Îļþ´æÅÌ£¬¶ÔµÚÒ»¸öÎļþµÄÐÞ¸ÄÈÔÈ»½öÏÞÓÚ Emacs ÖУ¬Ò²¾ÍÊÇÔÚËü¶ÔÓ¦µÄ»º³åÇø +Àͬʱ¶ÔµÚ¶þ¸öÎļþµÄÐÞ¸ÄÒ²²»»áÓ°Ïìµ½µÚÒ»¸öÎļþ¡£ÕâºÜÓÐÓ㬵«ÊÇҲͦÂé +·³£¬ÒòΪÈç¹ûÄãÓÖÏëÒª´æ´¢µÚÒ»¸öÎļþ£¬Ä㻹ÐèÒªÏÈÓà C-x C-f Çл»»ØÈ¥£¬È»ºó +ÔÙÓà C-x C-s ´æÅÌ£¬ÕâÏÔȻ̫Âé·³ÁË¡£ÄãÐèÒªÒ»¸ö¸ü¼ò±ãµÄ·½·¨£¬¶ø Emacs µ± +È»ÒѾÌæÄãÏëµ½ÁË£º - C-x s ´¢´æһЩ»º³åÇø + C-x s ±£´æ¶à¸ö»º³åÇø -C-x s »áѯÎÊÄú¹Øì¶ÄúÒÑ×ö³öÐ޸ĵ«»¹Ã»´¢´æµÄÿһ¸ö»º³åÇø¡£Ëü»áÎÊÄú£¬¶Ôì¶ -ÿһ¸öÕâÑùµÄ»º³åÇø£¬ÊÇ·ñÒª´¢´æ£¿ +C-x s »áÕÒµ½ËùÓÐÒѱ»Ð޸ĵ«ÉÐδ´æÅ̵Ļº³åÇø£¬È»ºóÏòÄãÖð¸öѯÎÊ£¬ÊÇ·ñÐèÒª +´æÅÌ£¿ ->> ²åÈëÒ»ÐÐÎÄ×Ö£¬È»ºó¼üÈë C-x s¡£ - ËüÓ¦¸Ã»áÎÊÄúÊÇ·ñÒª´¢´æÃûΪ TUTORIAL.cn µÄ»º³åÇø¡£ - ¼üÈ롺y¡»ÒԻشðÒª´¢´æ¡£ +>> ²åÈëÒ»ÐÐÎÄ×Ö£¬È»ºóÊäÈë C-x s¡£ + ËüÓ¦¸Ã»áÎÊÄ㣬ÊÇ·ñÒª´¢´æÃûΪ TUTORIAL.cn µÄ»º³åÇø£¿ + °´¡°y¡±¸æËßËüÄãÏë´æÅÌ¡£ -* À©³äÖ¸Á£¨ EXTENDING THE COMMAND SET £© -------------------------------------------- +* ÃüÁÀ©Õ¹£¨EXTENDING THE COMMAND SET£© +----------------------------------------- -ÓÉì¶ Emacs ÓµÓÐÌ«¶àÖ¸Á¼´±ãʹÓÃÉÏËùÓÐµÄ CONTROL ºÍ META ×ÖÔª£¬Ò²Ã»°ì -·¨ÍêÈ«°ÚÉÏ¡£Emacs ÒÔ X£¨À©³ä¡ºeXtend¡»£©Ö¸ÁîÀ´½â¾öÕâ¸öÎÊÌâ¡£À©³äÖ¸ÁîÓÐ -Á½ÖÖÐÍʽ£º +Emacs µÄÃüÁî¾ÍÏñÌìÉϵÄÐÇÐÇ£¬ÊýÒ²Êý²»Çå¡£°ÑËüÃǶ¼¶ÔÓ¦µ½ CONTROL ºÍ META +×éºÏ¼üÉÏÏÔÈ»ÊDz»¿ÉÄܵÄÊÂÇé¡£Emacs ÓÃÀ©Õ¹£¨eXtend£©ÃüÁîÀ´½â¾öÕâ¸öÎÊÌ⣬ +À©Õ¹ÃüÁîÓÐÁ½ÖÖ·ç¸ñ£º - C-x ×ÖÔªÀ©³ä¡£ºóÃæ¸úÖøÒ»¸ö×ÖÔª¡£ - M-x ÓÐÃû³ÆµÄÖ¸ÁîÀ©³ä¡£ºóÃæ¸úÖøÒ»¸ö³¤µÄÃû³Æ¡£ + C-x ×Ö·ûÀ©Õ¹¡£ C-x Ö®ºóÊäÈëÁíÒ»¸ö×Ö·û»òÕß×éºÏ¼ü¡£ + M-x ÃüÁîÃûÀ©Õ¹¡£M-x Ö®ºóÊäÈëÒ»¸öÃüÁîÃû¡£ -»¹ÓÐһЩָÁîͨ³£À´ËµÊǺÜÓÐÓõģ¬µ«ÊDZÈÄúÒѾѧµ½µÄÖ¸Áî½ÏÉÙʹÓá£ÄúÒѾ -¿´¹ýÆäÖÐÁ½¸ö£ºµµ°¸Ö¸ÁîÖÐµÄ C-x C-f ȥѰÕÒ£¬ÒÔ¼° C-x C-s È¥´¢´æ¡£ÆäËûµÄ -Àý×ÓÔòÓнáÊø Emacs ½×¶ÎµÄÖ¸Áî -- Õâ¸öÖ¸ÁîÊÇ C-x C-c¡££¨²»Òªµ£ÐÄÄú»áʧ -È¥ÒѾ×ö³öµÄ¸Ä±ä£¬C-x C-c ÔÚËüɱµô Emacs ֮ǰ»áÌṩ´¢´æÿһ¸ö±ä¶¯µÄµµ -°¸µÄ»ú»á¡££© +ºÜ¶àÀ©Õ¹ÃüÁºÜÓÐÓã¬ËäÈ»ÓëÄãÒѾѧ¹ýµÄÃüÁî±ÈÆðÀ´£¬ËûÃÇ¿ÉÄܲ»ÄÇô³£Óᣠ+ÄãÓ¦¸ÃÒѾ¼û¹ýһЩÀ©Õ¹ÃüÁîÁË£¬±ÈÈçÓà C-x C-f Ñ°ÕÒÎļþºÍÓà C-x C-s ±£´æ +Îļþ¡£Í˳ö Emacs ÓÃµÄ C-x C-c Ò²ÊÇÀ©Õ¹ÃüÁî¡££¨²»Óõ£ÐÄÍ˳ö Emacs »á¸øÄã +´øÀ´Ê²Ã´Ëðʧ£¬Emacs »áÔÚÍ˳ö֮ǰÌáÐÑÄã±£´æÎļþµÄ£© + +ÔÚ¿ØÖÆ̨Ï£¬C-z ¿ÉÒÔÔÝʱÀ뿪 Emacs¡ª¡ªµ±È»£¬Ä㻹¿ÉÒÔÔÙ»ØÀ´¡£ -C-z ÊÇ *ÔÝʱ* À뿪 Emacs µÄÖ¸Áî -- Òò´ËÄúÉÔºó¿ÉÒԻص½Í¬ÑùµÄ Emacs ½×¶Î¡£ +ÔÚÔÊÐí C-z µÄϵͳÖУ¬C-z »á°Ñ Emacs¡°¹ÒÆ𡱣¬Ò²¾ÍÊÇ˵£¬Ëü»á»Øµ½ shell +µ«²»Í˳ö Emacs¡£ÔÚÄÇЩ×î³£ÓÃµÄ shell ÖУ¬Í¨³£¿ÉÒÔÓá°fg¡±»òÕß¡°%emacs¡± +ÃüÁîÔٴλص½ Emacs ÖС£ -ÔÚijЩÔÊÐíËüµÄ×÷ÓõÄϵͳÖУ¬ C-z »á¡¸ÔÝͣס£¨ suspends £©¡¹Emacs£¬Ò²¾Í -ÊÇ˵£¬Ëü»á»Øµ½ shell µ«²»»á°Ñ Emacs »Ùµô¡£ÔÚ×î³£ÓÃµÄ shell ÖУ¬Äú¿ÉÒÔ -Óáºfg¡»»ò¡º%emacs¡»Á½ÖÖÖ¸Áî»Ö¸´ Emacs¡£ +ÔÚûÓÐÌṩ¹ÒÆð¹¦ÄܵÄϵͳÖУ¬C-z »áÔÚ Emacs ֮ϴ´½¨Ò»¸ö×Ó shell À´ÈÃÄã +ÔËÐÐÆäËü³ÌÐò£¬²¢ÇÒÔٴΡ°»Øµ½¡± Emacs ÖСª¡ªËäÈ»ÎÒÃDz¢Ã»ÓÐÕæÕýÀ뿪¹ý¡£Õâ +ÖÖÇé¿öÏ£¬Í¨³£ÓÃshell ÃüÁî¡°exit¡±´Ó×Ó shell »Øµ½ Emacs¡£ -ÔÚûÓÐÌṩÔÝÍ£¹¦ÄܵÄϵͳÖУ¬C-z »áÔÚ Emacs µ×Ͻ¨Á¢Ò»¸ö subshell ÒÔÈà -ÄúÓлú»áÖ´ÐÐÆäËûµÄ³Ìʽ£¬²¢ÇÒÔÚÉÔºó»Øµ½ Emacs£¬Ëü²¢Ã»ÓÐÕæµÄÀ뿪 Emacs¡£ -ÔÚÕâ¸öÀý×ÓÖУ¬shell Ö¸Áexit¡»ÊÇ´Ósubshell »Øµ½ Emacs µÄͨ³£·½Ê½¡£ +C-x C-c ×îºÃÔÚÄã´òËãÍ˳öµÇ½µÄʱºòÔÙÓá£ÔÚ Emacs ±»ÖîÈçÓʼþ´¦Àí³ÌÐòÖ®Àà +µÄÍⲿ³ÌÐòµ÷ÓÃÖ®ºó£¬Ò²¿ÉÒÔÓà C-x C-c Í˳ö¡£²»¹ýÒ»°ãÀ´½²£¬Èç¹ûÄã²»ÏëÍ˳ö +µÇ¼£¬×îºÃ»¹ÊÇ°Ñ Emacs ¹ÒÆð¶ø²»ÊÇÍ˳ö¡£ -ʹÓà C-x C-c µÄʱ»úÊǵ±Äú´òËãÒªµÇ³öʱ¡£ËüÒ²·Ç³£ÊʺÏÓÃÀ´À뿪±»ÆäËûÓʼþ -´¦Àí³Ìʽ£¬ÒÔ¼°Ðí¶à²»Í¬µÄÓ¦ÓóÌʽËùÆô¶¯µÄ Emacs¡£È»¶øÔÚÒ»°ãµÄ×´¿öÏ£¬Èç -¹ûÄú²»´òËãµÇ³ö£¬×îºÃÊÇ°Ñ Emacs ÔÝÍ£¶ø²»ÊÇÀ뿪Ëü¡£ +C-x µÄÀ©Õ¹ÃüÁîÓкܶ࣬ÏÂÃæÁгöµÄÊÇÄãÒѾѧ¹ýµÄ£º -ÓÐÐí¶à C-x µÄÖ¸Áî¡£ÕâÀïÊÇÒ»·ÝÄúÒѾѧ¹ýµÄÁÐ±í£º - - C-x C-f ÕÒµµ°¸¡£ - C-x C-s ´¢´æµµ°¸¡£ + C-x C-f Ñ°ÕÒÎļþ¡£ + C-x C-s ±£´æÎļþ¡£ C-x C-b Áгö»º³åÇø¡£ C-x C-c À뿪 Emacs¡£ - C-x 1 ³ýÁËÒ»¸öÍ⣬ɾȥÆäËûËùÓеĴ°¸ñ¡£ - C-x u È¡Ïû¶¯×÷¡£ + C-x 1 ¹ØµôÆäËüËùÓд°¸ñ£¬Ö»±£ÁôÒ»¸ö¡£ + C-x u ³·Ïú¡£ -ÒÔÀ©³äÀ´ÃüÃûµÄÖ¸Áîͨ³£ÊDz»Ì«³£Ê¹ÓõÄÖ¸Á»òÊÇÖ»ÔÚÌض¨µÄģʽϲŻáʹÓà -µÄÖ¸Áî¡£Ò»¸öÀý×ÓÊÇÈ¡´ú×Ö´®Ö¸ÁËü»áÈ«ÓòµØ½«Ò»¸ö×Ö´®ÒÔÁíÒ»¸öÀ´È¡´ú¡£µ± -Äú¼üÈë M-x ʱ£¬Emacs »áÔÚÓ©Ä»µÄµ×¶ËѯÎÊÄú£¬È»ºóÄúÒ²Ó¦¸Ã¼üÈëÕâ¸öÖ¸ÁîµÄ -Ãû³Æ¡£ÔÚÕâ¸öÀý×ÓÖÐÊÇ¡ºreplace-string¡»Ö»Òª¼üÈ롺repl s<TAB>¡»£¬È»ºó -Emacs ½«»á²¹ÆëÕâ¸öÃû³Æ¡£ÒÔ <Return> À´½áÊøÕâ¸öÖ¸ÁîÃû³Æ¡£ +ÓÃÃüÁîÃûÀ©Õ¹µÄÃüÁîÒ»°ã¶¼²»Ì«³£Ó㬻òÕßÖ»ÔÚ²¿·Öģʽϱ»Óõ½¡£±ÈÈç +replace-string£¨×Ö·û´®Ìæ»»£©Õâ¸öÃüÁËü»áÔÚÈ«ÎÄ·¶Î§ÄÚ°ÑÒ»¸ö×Ö·û´®Ìæ»» +³ÉÁíÒ»¸ö¡£ÔÚÄãÊäÈë M-x µÄʱºò£¬Emacs »áÔÚÆÁÄ»µ×¶ËÏòÄãѯÎÊ£¬È»ºóÄãÓ¦¸ÃÊä +ÈëÃüÁîÃû¡£Èç¹ûÄãÏëÊäÈë¡°replace-string¡±£¬ÆäʵֻÐèÒªÇá°repl s<TAB>¡±¾Í +ÐÐÁË£¬Emacs »á°ïÄã×Ô¶¯²¹ÆëµÄ¡£ÊäÈëÍêÖ®ºó°´ <Return> ¡£ -È¡´ú×Ö´®Ö¸ÁîÐèÒªÁ½¸ö²ÎÊý -- ±»È¡´úµÄ×Ö´®ÒÔ¼°ÓÃÀ´È¡´úËüµÄ×Ö´®¡£Äú±ØÐëÒÔ -Newline ×ÖÔªÀ´½áÊøÿһ¸ö²ÎÊý¡£ +×Ö·û´®Ìæ»»ÃüÁîÐèÒªÁ½¸ö²ÎÊý¡ª¡ª±»Ìæ»»µÄ×Ö·û´®ºÍÓÃÀ´Ìæ»»ËüµÄ×Ö·û´®¡£Ã¿¸ö +²ÎÊýµÄÊäÈëÓû»ÐзûÀ´½áÊø¡£ ->> ½«ÓαêÒƵ½±¾ÐеÄÏÂÁ½Ðпհף¬È»ºó¼üÈë +>> ½«¹â±êÒƵ½±¾ÐеÄÏÂÁ½Ðпհף¬È»ºóÊäÈë M-x repl s<Return>changed<Return>altered<Return>¡£ - ¡¾ÎªÁË˵Ã÷µÄÄ¿µÄ£¬ì¶Ï±£ÁôÒ»ÐÐÔÎÄ¡£ + ¡¾ÎªÁ˼ÌÐøÁ·Ï°£¬±£ÁôÒ»ÐÐÔÎÄÈçÏ£º Notice how this line has changed: you've replaced... ¡¿ -Çë×¢ÒâÕâÒ»ÐÐÊÇÔõô¸Ä±äµÄ£ºÔÚÓαêµÄÆðʼλÖÃÖ®ºó£¬ÄúÒѾ½« c-h-a-n-g-e-d -Õâ¸ö×Ö -- ²»¹ÜËüÔÚÄÄÀï³öÏÖ -- ÒÔ¡¸altered¡¹Õâ¸ö×ÖÀ´È¡´úÁË¡£ +Çë×¢ÒâÕâÒ»ÐÐÊÇÔõô¸Ä±äµÄ£ºÔÚ¹â±êÖ®ºóµÄ·¶Î§ÄÚ£¬ÄãÒѾ½«¡°changed¡±Õâ¸ö +´Ê¡ª¡ª²»¹ÜËüÔÚÄÄÀï³öÏÖ¡ª¡ªÈ«²¿Óá°altered¡±Ìæ»»µôÁË¡£ -* ×Ô¶¯´æµµ£¨ AUTO SAVE £© -------------------------- - -µ±ÄúÔÚÒ»¸öµµ°¸ÖÐ×öÁËÐ޸ģ¬µ«ÊÇ»¹Ã»Óн«ËüÃÇ´¢´æÆðÀ´£¬ÄÇôÈç¹ûÄúµÄµçÄÔµ± -»ú£¬ËüÃǽ«ÓпÉÄÜÒÅʧ¡£ÎªÁ˱ÜÃâÕâÖÖÇéÐη¢ÉúÔÚÄúµÄÉíÉÏ£¬Emacs »á¶¨Æڵؽ« -ÄúÕýÔڱ༵ĵµ°¸Ð´È롸×Ô¶¯´¢´æ¡¹µµ°¸ÖС£×Ô¶¯´¢´æµµ°¸ÔÚµµÃûµÄÇ°ºó»á¸÷ÓÐ -Ò»¸ö # ·ûºÅ£»¾ÙÀýÀ´Ëµ£¬Èç¹ûÄúµÄµµ°¸ÃûΪ¡¸hello.c¡¹£¬ÄÇôËüµÄ×Ô¶¯´¢´æµµ -°¸µÄµµÃû¾ÍÊÇ¡¸#hello.c#¡¹¡£µ±ÄúÒÔƽ³£µÄ·½Ê½´¢´æµµ°¸Ê±£¬Emacs ¾Í»á°ÑËü -µÄ×Ô¶¯´¢´æµµÉ¾³ý¡£ - -Èç¹ûµ±»ú£¬Äú¿ÉÒÔ¾ÓÉÕý³£µØÑ°ÕÒµµ°¸£¬£¨Ö¸µÄÊÇÄúÔڱ༵ĵµ°¸¶ø²»ÊÇ×Ô¶¯´¢ -´æµµ£©È»ºó¼üÈë M-x recover file<Return> À´»Ø¸´ÄúµÄ×Ô¶¯´¢´æµµ¡£µ±ËüÒªÇó -È·ÈÏʱ£¬¼üÈë yes<Return> ÒÔ¼ÌÐø²¢»Ø¸´×Ô¶¯´¢´æµÄ×ÊÁÏ¡£ - - -* »ØÓ¦Çø£¨ ECHO AREA £© +* ×Ô¶¯±£´æ£¨AUTO SAVE£© ----------------------- -Èç¹û Emacs ¼ûµ½ÄúºÜÂýµØ¼üÈë¶à×ÖÔªÖ¸ÁËü»á½«ËüÃÇÏÔʾÔÚλ춴°¸ñÏ·½£¬ -³ÆΪ¡¸»ØÓ¦Çø¡¹µÄÇøÓò¸øÄú²ÎÔÄ¡£»ØÓ¦ÇøλÔÚ´°¸ñµÄ×îºóÒ»ÐС£ +Èç¹ûÄãÐÞ¸ÄÁËÒ»¸öÎļþµ«ÊÇ»¹Ã»À´µÃ¼°´æÅÌ£¬È»ºóÄãµÄ¼ÆËã»ú°Õ¹¤ÁË£¬ÄÇôÄã±à +¼µÄ¶«Î÷ºÜ¿ÉÄܾÍÕÒ²»»ØÀ´ÁË¡£ÎªÁ˱ÜÃâÕâÑùµÄ²»ÐÒÒ»ÔÙ·¢Éú£¬Emacs »á¶¨ÆÚ½« +ÄãÕýÔڱ༵ÄÎļþ´æÈëÒ»¸ö¡°×Ô¶¯±£´æ¡±ÎļþÖС£×Ô¶¯±£´æµÄÎļþÃûµÄͷβ¸÷ÓÐ +Ò»¸ö¡°#¡±×Ö·û£¬±ÈÈçÄãÕýÔڱ༡°hello.c¡±£¬ÄÇôËüµÄ×Ô¶¯±£´æÎļþ¾Í½Ð +¡°#hello.c#¡±¡£ÔÚÄãÕý³£´æÅÌÖ®ºó£¬Emacs »áɾ³ý×Ô¶¯±£´æÎļþ¡£ + +¼ÙÈç²»ÐÒÕæµÄ·¢ÉúÁË£¬Äã´ó¿ÉÒÔ´ÓÈݵĴò¿ªÔÀ´µÄÎļþ£¨×¢Òâ²»ÊÇ×Ô¶¯±£´æÎļþ£© +È»ºóÊäÈë M-x recover file<Return> À´»Ö¸´ÄãµÄ×Ô¶¯±£´æÎļþ¡£ÔÚÌáʾȷÈ쵀 +ʱºò£¬ÊäÈë yes<Return> ¾ÍÐÐÁË¡£ + + +* »ØÏÔÇø£¨ECHO AREA£© +--------------------- + +Èç¹û Emacs ·¢ÏÖÄãÊäÈë¶à×Ö·ûÃüÁîµÄ½Ú×àºÜÂý£¬Ëü»áÔÚ´°¸ñµÄÏ·½³ÆΪ¡°»ØÏÔÇø¡± +µÄµØ·½¸øÄãÌáʾ¡£»ØÏÔÇøλÓÚÆÁÄ»µÄ×îºóÒ»ÐС£ -* ״̬ÐУ¨ MODE LINE £© ------------------------ +* ״̬À¸£¨MODE LINE£© +--------------------- -λÔÚ»ØÓ¦ÇøµÄÕýÉÏÃæÊdzÆΪ¡¸×´Ì¬ÐС¹µÄÒ»ÐС£×´Ì¬ÐÐÏÔʾ³öһЩÐÅÏ¢£¬È磺 +λÓÚ»ØÏÔÇøµÄÕýÉÏ·½µÄÒ»Ðб»³ÆΪ¡°×´Ì¬À¸¡±¡£×´Ì¬À¸ÉÏ»áÏÔʾһЩÐÅÏ¢£¬±ÈÈ磺 ---:** TUTORIAL.cn (Fundamental)--L670--58%---------------- +--:** TUTORIAL.cn (Fundamental)--L670--54%---------------- -±¾ÐÐÌṩһЩ¹Ø춡¸Emacs µÄ״̬¡¹ÒÔ¼°¡¸ÄúÕýÔڱ༵ÄÎÄ×Ö¡¹µÄÓÐÓÃÐÅÏ¢¡£ +״̬À¸ÏÔʾÁË Emacs µÄ״̬ºÍÄãÕýÔڱ༵ÄÎÄ×ÖµÄһЩÐÅÏ¢¡£ -ÄúÒѾ֪µÀµµÃûµÄÒâÒåÊÇʲôÁË -- ¾ÍÊÇÄúÕҵĵµ°¸¡£-NN%-- Ö¸³öÄ¿Ç°ÄúÔÚÎÄ -×ÖµµÖеÄλÖã»ËüµÄÒâ˼ÊÇ˵£ºÓÐ NN °Ù·Ö±ÈµÄÎÄ×ÖλÔÚ´°¸ñµÄÉÏÃæ¡£Èç¹ûµµ°¸ -µÄ¶¥¶Ë¾ÍλÔÚ´°¸ñÖУ¬ÄÇôËü¾Í»áÏÔʾ --Top-- ¶ø²»ÊÇ --00%--¡£Èç¹ûµµ°¸µÄ -µ×²¿¾ÍλÔÚ´°¸ñÖУ¬ÄÇôËüÊÇÏÔʾ --Bot--¡£Èç¹ûÄúÕýÔÚ¿´µÄÎÄ×ÖµµºÜС£¬ÔÚ´° -¸ñÖоÍ×ãÒÔ¿´µ½È«²¿µÄÄÚÈÝ£¬ÄÇô״̬ÐоͻáÏÔʾ --All--¡£ - -L ºÍÊý×ÖÒÔÁíÒ»ÖÖ·½Ê½À´±íʾ³öλÖãºËüÃǸø³öÁËÄ¿Ç°ËùÔÚµÄÐÐÊý£¨ Line £©¡£ +ÄãÓ¦¸ÃÖªµÀÎļþÃûµÄÒâ˼°É£¿¾ÍÊÇÄãÕÒµ½µÄÄǸöÎļþÂï¡£-NN%-- ÏÔʾµÄÊǹâ±êÔÚ +È«ÎÄÖеÄλÖá£Èç¹ûλÓÚÎļþµÄ¿ªÍ·£¬ÄÇô¾ÍÏÔʾ --Top-- ¶ø²»ÊÇ --00%--£»Èç +¹ûλÓÚÎļþµÄĩ⣬¾ÍÏÔʾ --Bot--¡£Èç¹ûÎļþºÜС£¬Ò»ÆÁ¾Í×ãÒÔÏÔʾȫ²¿ÄÚÈÝ£¬ +ÄÇô״̬À¸»áÏÔʾ --All--¡£ -ÔÚ¿¿½üÇ°ÃæµÄÐǺűíʾÄúÒѾ¶ÔÕâЩÎÄ×Ö×öÁ˸ı䡣ÔÚÄú¸Õ°Ý·Ã»ò´¢´æÒ»¸öµµ°¸ -Ö®ºó£¬×´Ì¬ÐеÄÄǸö²¿·Ö»áûÓÐÐǺţ¬Ö»ÓÐÆÆÕۺš£ +L ºÍÆäºóµÄÊý×Ö¸ø³öÁ˹â±êËùÔÚÐеÄÐкš£ -״̬ÐÐÖÐλì¶Ð¡À¨»¡ÀïÃæµÄ²¿·Ö£¬ÊÇÓÃÀ´¸æËßÄúÕýÔÚʹÓÃʲô±à¼Ä£Ê½¡£Ô¤ÉèµÄ -ģʽÊÇ Fundamental£¬Ò²¾ÍÊÇÄúÏÖÔÚʹÓõġ£ËüÊÇ¡¸Ö÷ģʽ¡¹µÄÒ»¸öÀý×Ó¡£ +×ͷµÄÐǺţ¨*£©±íʾÄãÒѾ¶ÔÎÄ×Ö×ö¹ý¸Ä¶¯¡£¸Õ¸Õ´ò¿ªµÄÎļþ¿Ï¶¨Ã»Óб»¸Ä¶¯ +¹ý£¬ËùÒÔ״̬À¸ÉÏÏÔʾµÄ²»ÊÇÐǺŶøÊǶÌÏߣ¨-£©¡£ + +״̬À¸ÉÏСÀ¨ºÅÀïµÄÄÚÈݸæËßÄ㵱ǰÕýÔÚʹÓõıà¼Ä£Ê½¡£È±Ê¡µÄģʽÊÇ +Fundamental£¬¾ÍÊÇÄãÏÖÔÚÕýÔÚʹÓõÄÕâ¸ö¡£ËüÊÇÒ»ÖÖ¡°Ö÷ģʽ¡±¡£ -Emacs ÓÐÐí¶à²»Í¬µÄÖ÷ģʽ¡£ËüÃÇÖ®ÖÐÓÐһЩÊÇÓÃÀ´±à¼²»Í¬µÄÓïÑÔÒÔ¼°£¯»ò²» -ͬÖÖÀàµÄÎÄ×Ö£¬ÏñÊÇ Lisp ģʽ¡¢ Text ģʽµÈµÈ¡£ÔÚÈκεÄʱ¼äÖ»ÓÐÒ»¸öÖ÷Ä£ -ʽ¿ÉÒÔ×÷Ó㬲¢ÇÒËüµÄÃû³Æ×Ü¿ÉÒÔÔÚ״̬ÐÐÖб»ÕÒµ½£¬¾ÍÔÚÏÖÔÚµÄ -¡¸Fundamental¡¹ÖеÄλÖᣠ+Emacs µÄÖ÷ģʽÁÖÁÖ×Ü×Ü¡£ÓÐÓÃÀ´±à¼³ÌÐò´úÂëµÄ¡ª¡ª±ÈÈç Lisp ģʽ£»Ò²ÓÐÓà +À´±à¼¸÷ÖÖ×ÔÈ»ÓïÑÔÎı¾µÄ¡ª¡ª±ÈÈç Text ģʽ¡£ÈκÎÇé¿öÏÂÖ»ÄÜÓ¦ÓÃÒ»¸öÖ÷Ä£ +ʽ£¬ÆäÃû³Æ»áÏÔʾÔÚ״̬À¸ÉÏ£¬¾ÍÔÚÏÖÔÚÏÔʾ¡°Fundamental¡±µÄµØ·½¡£ -ÿһ¸öÖ÷ģʽ¶¼Ê¹µÃһЩָÁîµÄÐÐΪ±íÏֵò»Ì«Ò»Ñù¡£¾ÙÀýÀ´Ëµ£¬ÔÚÒ»¸ö³ÌʽÖÐ -ÓÐһЩָÁîÓÃÀ´ÖÆ×÷³ö×¢½â£¬¶øÓÉì¶Ã¿Ò»ÖÖ³ÌʽÓïÑÔ¶Ôì¶Ò»¸ö×¢½âÓ¦¸Ã³¤µÃÏñʲ -ô£¬¶¼ÓÐÖø²»Í¬µÄÏë·¨£¬Òò´Ëÿһ¸öÖ÷ģʽ¶¼±ØÐëÒÔ²»Í¬µÄ·½Ê½À´²åÈë×¢½â¡£Ã¿ -Ò»¸öÖ÷ģʽÊÇÒ»¸öÑÓÉìÖ¸ÁîµÄÃû³Æ£¬Ê¹µÃÄú¿ÉÒÔÓÃÀ´Çл»ÖÁÄǸöģʽ¡£¾ÙÀýÀ´Ëµ£¬ -M-x fundamental-mode ¾ÍÊÇÇл»µ½ Fundamental ģʽµÄÒ»¸öÖ¸Áî¡£ - -Èç¹ûÄúÏëÒª±à¼ÈËÀàÓïÑÔµÄÎÄ×Öµµ°¸ -- ÏñÊÇÏÖÔÚµÄÕâÒ»¸ö£¬ÄúÓ¦¸ÃʹÓà Text +Ö÷ģʽÓÐʱ»á¸Ä±äһЩÃüÁîµÄÐÐΪ¡£±ÈÈç˵£¬²»¹Ü±à¼Ê²Ã´ÑùµÄ³ÌÐò´úÂ룬Ä㶼 +¿ÉÒÔÓÃÒ»¸öͳһµÄÃüÁîÀ´Ìí¼Ó×¢ÊÍ£¬µ«ÊÇÔÚ²»Í¬µÄÓïÑÔÖÐ×¢Ê͵ÄÓï·¨ÍùÍùÊDz»Í¬ +µÄ£¬ÕâʱÏàÓ¦µÄÖ÷ģʽ¾Í»á·Ö±ðÓø÷×ÔµÄÓï·¨¹æÔòÀ´Ìí¼Ó×¢ÊÍ¡£Ö÷ģʽ¶¼ÊÇ¿ÉÒÔ +Óà M-x Æô¶¯µÄÃüÁËùÒÔ M-x fundamental-mode ¾Í¿ÉÒÔÇл»µ½ Fundamental ģʽ¡£ ->> ¼üÈë M-x text mode<Return>¡£ +Èç¹ûÄãÒª±à¼×ÔÈ»ÓïÑÔÎı¾¡ª¡ª±ÈÈçÏÖÔÚ¡ª¡ªÄãÓ¦¸ÃÓà Text ģʽ¡£ + +>> ÊäÈë M-x text mode<Return>¡£ + +±ðº¦Å£¬Ã»ÓÐʲôÃüÁî»á¸Ä±ä¹¦ÄÜ¡£²»¹ýÄã¿ÉÒÔ·¢ÏÖ£¬M-f ºÍ M-b ÏÖÔڰѵ¥ÒýºÅ +£¨'£©ÊÓΪ´ÊµÄÒ»²¿·ÖÁË¡£¶øÔÚÏÈÇ°£¬ÔÚ Fundamental ģʽÖУ¬M-f ºÍ M-b ¶¼½« +µ¥ÒýºÅÊÓΪ·Ö¸ôµ¥´ÊµÄ·ûºÅ¡£ -²»Òªµ£ÐÄ£¬Ã»ÓÐÈκÎÒ»¸öÄúÒѾѧ¹ýµÄ Emacs Ö¸Á»á±»¸Ä±ä³ÉÈκηdz£²»Í¬ -µÄÐÎʽ¡£µ«ÊÇÄú¿ÉÒÔ·¢ÏÖµ½ M-f ºÍ M-b ÏÖÔÚ°ÑƲºÅ£¨'£©ÊÓΪ×ÖµÄÒ»²¿·Ö¡£ÏÈ -Ç°£¬ÔÚ Fundamental ģʽÖУ¬M-f ºÍ M-b ½«Æ²ºÅÊÓΪ×ֵķָô·ûºÅ¡£ +Ö÷ģʽͨ³£¶¼»á¸ãһЩÀàËƵÄС¶¯×÷£¬ÒòΪºÜ¶àÃüÁîÆäʵÍê³ÉµÄÊÇ¡°ÏàͬµÄ¹¤ +×÷¡±£¬Ö»ÊÇÔÚ²»Í¬Çé¿öÏ»áÓв»Í¬µÄ¹¤×÷·½Ê½¶øÒÑ¡£¡¾Ëùν¡°Çóͬ´æÒ족£¬ÔÚ +Emacs ÀïµÃµ½Á˺ܺõÄÌåÏÖ¡¿ + +Óà C-h m ¿ÉÒԲ鿴µ±Ç°Ö÷ģʽµÄÎĵµ¡£ + +>> Óà C-u C-v ½«±¾Ðдøµ½¿¿½üÆÁÄ»µÄÉÏ·½¡£ +>> ÊäÈë C-h m£¬¿´¿´ Text ģʽÓë Fundamental ģʽÓÐÄÄЩ²»Í¬¡£ +>> ÊäÈë C-x 1 ¹ØµôÎĵµ´°¸ñ¡£ + +Ö÷ģʽ֮ËùÒÔ³Æ֮Ϊ¡°Ö÷£¨major£©¡±Ä£Ê½£¬ÊÇÒòΪͬʱ»¹ÓС°¸¨Ä£Ê½¡±£¨minor +mode£©´æÔÚ¡£¸¨Ä£Ê½²¢²»ÄÜÌæ´úÖ÷ģʽ£¬¶øÊÇÔÚÖ÷ģʽ֮ÍâÔÙ×öһЩ¸¨ÖúµÄÐ޸ġ£ +ÿ¸ö¸¨Ä£Ê½¶¼¿ÉÒÔ¶ÀÁ¢µØ¿ªÆôºÍ¹Ø±Õ£¬¸úÆäËü¸¨Ä£Ê½Î޹أ¬¸úÖ÷ģʽҲÎ޹ء£Ëù +ÒÔÄã¿ÉÒÔ²»Óø¨Ä£Ê½£¬Ò²¿ÉÒÔÓÃÒ»¸ö»òÕ߶à¸ö¸¨Ä£Ê½¡£ -Ö÷ģʽͨ³£»áÏñÉÏÊöÄǸöÀý×ÓÒ»Ñù£¬×ö³öһЩ¾«Çɵĸı䣺´ó²¿·ÖµÄÖ¸ÁîÔÚÿһ -¸öÖ÷ģʽÖС¸×öͬÑùµÄÊ¡¹£¬µ«ÊÇËüÃÇÒÔÒ»µãµã²»Í¬µÄ·½Ê½À´¹¤×÷¡£¡¾ÔپٸöÀý -×Ó£¬½ÓÐøÉÏÃæËù¿ªµÄÍ·£¬ÒÔ³ÌʽÓïÑÔµÄ×¢½âÀ´Ëµ¡£Í¬ÑùÒ»¸ö²åÈë×¢½âµÄ¶¯×÷£¬Òò -ΪÄúʹÓõijÌʽÓïÑÔ£¯Ö÷ģʽµÄ²»Í¬¶ø²»Í¬¡£ÈôÄúʹÓà C ÓïÑÔ£¬Emacs ²åÈë -¡º/* ½éì¶ÖмäµÄΪע½âÇø¿é */¡»£»ÈôÄúʹÓõÄÊÇ Fortran ÓïÑÔ£¬Emacs ²åÈë -¡ºc ÒÔ×ÖÔª c ΪÊ×µÄΪע½âÐС»£»ÈôÄúʹÓõÄÊÇ Basic ÓïÑÔ£¬Emacs Ôò²åÈ롺' -ƲºÅÒÔºóµÄΪע½âÎÄ×Ö¡»¡£±à¼Æ÷µÄµ¯ÐÔÈç´Ë£¬ÊµÔÚûÓбØҪΪÁ˲»Í¬µÄÓïÑÔ¡¢ -Ä¿µÄ»òÍâ¹Û£¬Éè¼ÆÌØÊ⻯µÄ±à¼Æ÷¡£¡¸Çó´óͬ£¬´æСÒ졹ÔÚÕâÀïÒ²ÊdzÉÁ¢µÄ¡£¡¿ +ÓÐÒ»¸ö½Ð×ö×Ô¶¯ÕÛÐУ¨Auto Fill£©µÄ¸¨Ä£Ê½Óô¦ºÜ´ó£¬ÌرðÊÇÔÚ±à¼×ÔÈ»ÓïÑÔÎÄ +±¾µÄʱºò¡£Õâ¸ö¸¨Ä£Ê½Æô¶¯ºó£¬Emacs »áÔÚÄã´ò×Ö³¬³öÒ»Ðб߽çʱ×Ô¶¯ÌæÄã»»ÐС£ + +Óà M-x auto fill mode<Return> Æô¶¯×Ô¶¯ÕÛÐÐģʽ¡£Æô¶¯Ö®ºó£¬Èç¹ûÎÒÃÇÔÙÓà +Ò»´Î M-x auto fill mode<Return>£¬×Ô¶¯ÕÛÐÐģʽ¾Í±»¹Ø±ÕÁË¡£Ò²¾ÍÊÇ˵£¬Èç¹û +×Ô¶¯ÕÛÐÐģʽûÓпªÆô£¬Õâ¸öÃüÁî»á¿ªÆôËü£»¶øÈç¹ûÒѾ¿ªÆôÁË£¬Õâ¸öÃüÁî»á¹Ø +±ÕËü¡£ÎÒÃÇ˵Õâ¸öÃüÁîÓÃÀ´¡°¿ª¹Ø£¨toggle£©¡±Ä£Ê½¡£ + +>> ÏÖÔÚÊäÈë M-x auto fill mode<Return>¡£È»ºóËæ±ãÇõãʲô£¬Ö±µ½Äã¿´µ½Ëü + ·Ö³ÉÁ½ÐС£±ØÐëÇÃһЩ¿Õ¸ñ£¬ÒòΪ Auto Fill Ö»ÔÚ¿Õ°×´¦½øÐжÏÐС£¡¾¿Õ¸ñ + ¶ÔÓ¢ÎÄÀ´ËµÊDZØÐëµÄ£¬¶ø¶ÔÖÐÎÄÔò²»±Ø¡£¡¿ -Òªä¯ÀÀÄúÏÖÔÚËù´¦µÄÖ÷ģʽµÄÎĵµ£¬¼üÈë C-h m¡£ +Ðб߽çͨ³£±»É趨Ϊ 70 ¸ö×Ö·û¡¾ÕâÀïÖ¸Ó¢ÎÄ×Ö·û¡¿£¬Äã¿ÉÒÔÓà C-x f ÃüÁîÀ´ÖØ +ÐÂÉ趨֮¡£Ö¸¶¨ÐÂÐб߽ç¿ÉÒÔÓÃÊý×Ö²ÎÊýÀ´½øÐд«µÝ¡£ ->> ʹÓà C-u C-v Ò»»òÊý´Î£¬½«±¾Ðдøµ½¿¿½üÓ©Ä»µÄÉÏ·½¡£ ->> ¼üÈë C-h m£¬¿´¿´ Text ģʽÓë Fundamental ģʽÊÇÄÄÀﲻͬ¡£ ->> ¼üÈë C-x 1 ½«Îĵµ´ÓÓ©Ä»ÒƳýµô¡£ +>> ÊäÈë C-x f ²¢´«µÝ²ÎÊý 20£º C-u 2 0 C-x f¡£ + È»ºóÊäÈëһЩÎÄ×Ö£¬¹Û²ì Emacs µÄ×Ô¶¯ÕÛÐж¯×÷ + ×îºóÔÙÓà C-x f ½«±ß½çÉè»Ø 70¡£ -Ö÷ģʽ֮ËùÒÔ³ÆΪ¡¸Ö÷Òª£¨ major £©¡¹µÄÔÒòÊÇÒòΪËüÃÇÒ²ÓдÎģʽ£¨ minor -mode £©¡£´ÎÒªµÄģʽ²¢²»ÊÇÖ÷ģʽµÄÆäËûÑ¡Ôñ£¬¶øÖ»ÊÇ´ÎÒªµÄ¸ü¸Ä¡£Ã¿Ò»¸ö´Î -ģʽ¿ÉÒÔ±»Ëü±¾ÉíÆôÓûòÍ£Ö¹£¬ºÍËùÓÐÆäËûµÄ´ÎģʽÎ޹أ¬²¢ÇÒÒ²ºÍÄúµÄÖ÷ģʽ -Î޹ء£ËùÒÔÄú¿ÉÒÔ²»Ê¹ÓôÎģʽ£¬»òÒ»¸ö£¬»òÈκÎÊýÁ¿µÄ´ÎģʽµÄ×éºÏ¡£ +Èç¹ûÄãÔÚ¶ÎÂäµÄÖмä×öÁËһЩÐ޸ģ¬ÄÇô×Ô¶¯ÕÛÐÐģʽ²»»áÌæÄã°ÑÕû¸ö¶ÎÂäÖØР+ÕÛÐС£ÖØÐÂ×Ô¶¯ÕÛÐÐÓà M-q£¬×¢ÒâʹÓõÄʱºò¹â±ê±ØÐëλÓÚÄãÏëÕÛÐеÄÄÇÒ»¶ÎÀï¡£ + +>> Òƶ¯¹â±êµ½Ç°Ò»¶ÎÖУ¬È»ºóÊäÈë M-q¡£ -ÓÐÒ»¸ö½Ð×ö Auto Fill ģʽµÄ´Îģʽ·Ç³£ÓÐÓã¬ÌرðÊÇÔÚ±à¼ÈËÀàÓïÑÔµÄÎÄ×Ö -ʱ¡£µ±Õâ¸öģʽÆôÓÃʱ£¬ Emacs ÔÚµ±Äú²åÈëÎÄ×Ö²¢ÇÒʹһÐÐÌ«¿íʱ£¬»á½«ÄÇÒ» -ÐУ¬ÔÚ×ÖÓë×ÖÖ®¼ä×Ô¶¯µØ·Ö¸ô¿ª¡£ + +* ËÑË÷£¨SEARCHING£© +------------------- + +Emacs ¿ÉÒÔÏòÇ°»òÕßÏòºóËÑË÷×Ö·û´®¡£ËÑË÷ÃüÁîÊÇÒ»¸öÒƶ¯¹â±êµÄÃüÁËÑË÷³É +¹¦ºó£¬¹â±ê»áÍ£ÁôÔÚËÑË÷Ä¿±ê³öÏֵĵط½¡£ + +Emacs µÄËÑË÷ÃüÁîµÄ¶ÀÌØÖ®´¦ÔÚÓÚ£¬ËüÊÇ¡°½¥½øµÄ£¨incremental£©¡±£¬Òâ˼ÊÇËÑ +Ë÷ÓëÊäÈëͬʱ½øÐУºÄãÔÚÕâ±ßÒ»¸ö×ÖÒ»¸ö×ÖµØÊäÈëÄãÏëËÑË÷µÄ¶«Î÷£¬Í¬Ê± Emacs +ÔÚÄDZ߾ÍÌæÄãËÑË÷ÁË¡£ -Äú¿ÉÒÔ M-x auto fill mode<Return> À´½« Auto Fill ģʽÆôÓᣵ±Õâ¸öģʽ -ÆôÓÃʱ£¬Äú¿ÉÒÔʹÓà M-x auto fill mode<Return> À´½«ËüÈ¡Ïû¡£µ±Õâ¸öģʽ²» -ÓÃʱ£¬ÔòÕâ¸öÖ¸Áî»á½«ËüÆô¶¯£¬¶øµ±Õâ¸öģʽÆôÓÃʱ£¬Õâ¸öÖ¸Áî»á½«Ëü¹Ø±Õ¡£ÎÒ -ÃÇ˵Õâ¸öÖ¸ÁîÓÃÀ´¡¸Çл»£¨ toggle £©¡¹Ä£Ê½¡£ +C-s ÊÇÏòÇ°ËÑË÷£¬C-r ÊÇÏòºóËÑË÷¡£²»¹ýÊÖ±ðÕâô¿ì£¡Ïȵȵȱð׿±ÊÔ¡£ + +ÔÚÄã°´Ï C-s Ö®ºó£¬Äã»á·¢ÏÖ»ØÏÔÇøÀïÓС°I-search¡±×ÖÑù³öÏÖ£¬ÕâÊÇÔÚÌáʾ +ÄãÄ¿Ç° Emacs Õý´¦ÓÚ¡°½¥½øËÑË÷¡±×´Ì¬£¬ÕýÔڵȴýÄãÊäÈëËÑË÷×Ö´®¡£<Return> +»á½áÊøËÑË÷¡£ ->> ÏÖÔÚ¼üÈë M-x auto fill mode<Return>¡£È»ºóÒ»ÔٵزåÈë×Ö´® - ¡¸ asdf ¡¹£¬Ö±µ½Äú¿´µ½Ëü·Ö³ÉÁ½ÐС£Äú±ØÐëÔÚËüÃÇÖ®¼ä°ÚÉÏ¿Õ°×£¬ - ÒòΪ Auto Fill Ö»ÔÚ¿Õ°×´¦¶ÏÐС£ +>> ÊäÈë C-s ¿ªÊ¼Ò»¸öËÑË÷¡£×¢ÒâÇÃÂýÒ»µã£¬Ò»´ÎÊäÈëÒ»¸ö×Ö·û¡£ + ÂýÂýÊäÈë¡°cursor¡±Õû¸ö´Ê£¬Ã¿ÇÃÒ»¸ö×Ö¾ÍÔÝͣһϣ¬×¢Òâ¹Û²ì¹â±ê¡£ + ÏÖÔÚÄãÓ¦¸ÃÒÑÔø¾ÕÒµ½¡°cursor¡±Õâ¸ö´ÊÁË¡£ +>> ÔÙ°´Ò»´Î C-s£¬ËÑË÷ÏÂÒ»¸ö¡°cursor¡±³öÏÖµÄλÖᣠ+>> ÏÖÔÚ°´ËÄ´ÎÍ˸ñ¼ü£¬¿´¿´¹â±êÊÇÈçºÎÒƶ¯µÄ¡£ +>> Çà <Return> ½áÊøËÑË÷¡£ -±ß½çͨ³£±»É趨Ϊ 70 ¸ö×ÖÔª£¬µ«ÊÇÄú¿ÉÒÔÓà C-x f Ö¸ÁîÀ´¸Ä±äËü¡£ÄúÓ¦¸ÃÒÔ -Ò»¸öÊý×Ö²ÎÊýµÄ·½Ê½À´¸ø¶¨ÄúËùÏ£ÍûµÄ±ß½çÉ趨¡£ +¸Õ²Å¿´×ÐϸÁËô£¿ÔÚÒ»¸ö½¥½øʽËÑË÷ÖУ¬Emacs »á³¢ÊÔÌøµ½ÄãÊäÈëµÄ×Ö·û´®µÄ³ö +ÏÖλÖá£ÏëÌøµ½ÏÂÒ»¸öËÑË÷Ä¿±ê³öÏÖµÄλÖã¬Ö»ÒªÔÙ°´Ò»´Î C-s ¾ÍÐÐÁË¡£Èç¹ûÕÒ +²»µ½£¬Emacs »á·¢³ö¡°ßÙ¡±µÄÒ»Éù£¬¸æËßÄãËÑË÷ʧ°Ü¡£ÔÚÕû¸ö¹ý³ÌÖУ¬¶¼¿ÉÒÔÓà +C-g À´ÖÕÖ¹ËÑË÷¡£¡¾Äã»á·¢ÏÖ C-g Ö®ºó¹â±ê»Øµ½ÁËËÑË÷¿ªÊ¼Ç°µÄµØ·½£¬¶ø +<Return> »áÈùâ±êÁôÔÚËÑË÷½á¹ûÉÏ£¬ÕâÊǺÜÓÐÓõŦÄÜ¡£¡¿ ->> ¼üÈë C-x f ²¢¸½ÉÏÒýÊý 20£º¡ºC-u 2 0 C-x f¡»¡£ - È»ºó¼üÈëһЩÎÄ×Ö£¬¿´¿´ Emacs ÒÔ 20 ¸ö×ÖÔª£¬ - ÔÚÐÐÓëÐÐÖ®¼ä½øÐÐ fill ¶¯×÷¡£È»ºóÔÙÓÃÒ»´Î C-x f ½«±ß½çÉè»Ø 70¡£ +×¢Ò⣺ʹÓÃijЩÖն˵Äʱºò£¬ÊäÈë C-x C-s »á¶³½áÆÁÄ»¡¾ÆÁĻûÓÐÈκÎÊä³ö¡¿£¬ +ÕâÑùÄã¾Í¿´²»µ½ Emacs µÄÈκα仯¡£ÆäÔÒòÊDzÙ×÷ϵͳµÄ¡°Á÷Á¿¿ØÖÆ¡±¹¦ÄÜ°Ñ +C-s À¹½ØÁË£¬²¢ÇÒ¶³½áÁËÆÁÄ»£¬Emacs ×ÔȻҲ¾Í¿´²»µ½Õâ¸öÊäÈëÁË¡£Óà C-q ¿ÉÒÔ +½â³ýÆÁÄ»¶³½á¡£Òª½â¾öÕâ¸öÎÊÌ⣬Çë²Î¿¼ Emacs ÊÖ²áÀïµÄ¡°Spontaneous Entry +to Incremental Search¡±Ò»½Ú¡¾Emacs ÊÖ²á¿ÉÄÜ»¹Ã»ÓÐÖÐÎÄ·Òë¡¿£¬ÄÇÀï¿ÉÄÜÓÐ +һЩÓÐÓõĽ¨Òé¡£ -Èç¹ûÄúÔÚÒ»¸ö¶ÎÂäµÄÖмä×ö³ö¸Ä±ä£¬Auto Fill ģʽ²¢²»»áΪÄúÖØнøÐÐ fill -µÄ¶¯×÷£¨ re-fill £©¡£Òª re-fill Õâ¸ö¶ÎÂ䣬¼üÈë M-q (META-q)£¬¶øÓαê±Ø -Ðë´¦ÔÚÆäÖС£ +Èç¹ûÄãÕýÔÚ½¥½øʽËÑË÷ÖУ¬°´Í˸ñ¼ü»áɾ³ýÄ¿±ê×Ö·û´®µÄ×îºóÒ»¸ö×Ö·û£¬²¢ÇÒ¹â +±ê»á»Øµ½×î½üÒ»´ÎËÑË÷µÄÃüÖÐλÖᣱÈÈçÄãÒѾÊäÈëÁË¡°c¡±£¬¹â±ê¾ÍÍ£ÔÚ¡°c¡± +µÚÒ»´Î³öÏֵĵط½£¬ÔÙÊäÈë¡°u¡±£¬¹â±êÍ£ÔÚ¡°cu¡±µÚÒ»´Î³öÏֵĵط½£¬ÕâʱÔÙ°´ +Í˸ñ¼ü£¬¡°u¡±¾Í´ÓËÑË÷×Ö´®ÖÐÏûʧÁË£¬È»ºó¹â±ê»á»Øµ½¡°c¡±µÚÒ»´Î³öÏֵĵط½¡£ ->> Òƶ¯Óα굽ǰһ¶ÎÖУ¬È»ºó¼üÈë M-q¡£ +ÁíÍâÈç¹ûÄãÔÚËÑË÷µÄʱºòÊäÈëÁË CONTROL »òÕß META ×éºÏ¼üµÄ»°£¬ËÑË÷¿ÉÄÜ»á +½áÊø¡££¨Ò²ÓÐÀýÍ⣬±ÈÈç C-s ºÍ M-r ÕâЩ¶ÔËÑË÷ÓÐÌرðÒâÒåµÄ×éºÏ¼ü¡££© + +Ç°Ãæ˵µÄ¶¼ÊÇ¡°ÏòÏ¡±ËÑË÷£¬Èç¹ûÏë¡°ÏòÉÏ¡±ËÑË÷£¬¿ÉÒÔÓà C-r¡£C-r Óë C-s +Ïà±È³ýÁËËÑË÷·½ÏòÏà·´Ö®Í⣬ÆäËüµÄ²Ù×÷¶¼Ò»Ñù¡£ -* ËÑÑ°£¨ SEARCHING £© ---------------------- +* ¶à´°¸ñ£¨MULTIPLE WINDOWS£© +---------------------------- + +Emacs µÄÃÔÈËÖ®´¦ºÜ¶à£¬Äܹ»ÔÚÆÁÄ»ÉÏͬʱÏÔʾ¶à¸ö´°¸ñ¾ÍÊÇÆäÖÐÖ®Ò»¡£ -Emacs ¿ÉÒÔËÑÑ°×Ö´®£¨×Ö´®¿ÉÒÔÊÇһȺÁ¬ÐøµÄ×ÖÔª»ò×Ö£©¡¾¾ÍÖÐÎÄÀ´Ëµ£¬×ÖÔªºÍ -×Ö»ù±¾ÉÏÒâÒåÏàͬ£»´Ë´¦ËùÖ¸µÄ¡º×Ö¡»£¬ÊÇÓ¢ÎÄÖÐûÓб»¿Õ°×¸ô¿ªµÄ×ÖÔª¼¯ -ºÏ¡£¡¿£¬ÍùÇ°»òÍùºóËÑÑ°¶¼¿ÉÒÔ¡£ËÑÑ°Ò»¸ö×Ö´®ÊÇÒ»ÖÖÓαêÒƶ¯Ö¸ÁËü»á½«ÓÎ -±êÒƶ¯µ½×Ö´®³öÏÖµÄÏÂÒ»¸öµØ·½¡£ +>> Òƶ¯¹â±êµ½ÕâÒ»ÐУ¬È»ºóÊäÈë C-u 0 C-l¡£ + +>> ÏÖÔÚÊäÈë C-x 2£¬Ëü»á½«ÆÁÄ»»®·Ö³ÉÁ½¸ö´°¸ñ¡£ + ÕâÁ½¸ö´°¸ñÀïÏÔʾµÄ¶¼ÊDZ¾Æª¿ìËÙÖ¸ÄÏ£¬¶ø¹â±êÔòÍ£ÁôÔÚÉÏ·½µÄ´°¸ñÀï¡£ -Emacs ËÑÑ°Ö¸ÁîÓë´ó²¿·Ö±à¼Æ÷µÄËÑÑ°Ö¸ÁͬµÄµØ·½ÔÚ춣¬ËüÊÇ¡¸½¥½øµÄ -£¨ incremental £©¡¹¡£Õâ±íʾËÑÑ°·¢ÉúÔÚÄú¼üÈëÏëÒªËÑÑ°µÄÎÄ×Ö´®ºó¡£ +>> ÊÔÊÔÓà C-M-v ¹ö¶¯Ï·½µÄ´°¸ñ¡£ + £¨Èç¹ûÄ㲢ûÓÐ META ¼ü£¬Óà ESC C-v Ò²¿ÉÒÔ¡££© + ¡¾ÏòÉϹö¶¯ÊÇ C-M-S-v£¬Ò²¾ÍÊÇͬʱ°´×¡ CONTROL¡¢META ºÍ SHIFT ÔÙ°´ v¡¿ -Òª¿ªÊ¼ËÑÑ°µÄÖ¸ÁîÊÇ£ºC-s ÍùÇ°ËÑÑ°£¬C-r ÍùºóËÑÑ°¡£µ«ÏȵÈһϣ¡ÏÖÔÚÏȲ»Òª -ÊÔ¡£ +>> ÊäÈë C-x o£¨¡°o¡±Ö¸µÄÊÇ¡°ÆäËü£¨other£©¡±£©£¬ + ½«¹â±êתÒƵ½Ï·½µÄ´°¸ñ¡£ -µ±Äú¼üÈë C-s ʱ£¬»á·¢ÏÖµ½ÓÐÒ»¸ö×Ö´®¡¸I-search¡¹³öÏÖÔÚ»ØÓ¦ÇøÖÐ×÷ΪÌáʾ¡£ -Ëü¸æËßÄú Emacs ÏÖÔÚÕý´¦ì¶³ÆΪ¡¸½¥½øʽËÑÑ°¡¹µÄ״̬ÖУ¬µÈ´ýÄú¼üÈëÄúÏëÒª -ËÑÑ°µÄ×Ö´®¡£<Return> »á½áÊøÒ»¸öËÑÑ°¡£ +>> ÔÚÏ·½µÄ´°¸ñÖУ¬Óà C-v ºÍ M-v À´¹ö¶¯¡£ + ͬʱ¼ÌÐøÔÚÉÏ·½µÄ´°¸ñÀïÔĶÁÕâЩָµ¼¡£ + +>> ÔÙÊäÈë C-x o ½«¹â±êÒƻص½ÉÏ·½µÄ´°¸ñÀï¡£ + ¹â±ê»á»Øµ½ËüÔÚÉÏ·½´°¸ñÖÐÔ±¾ËùÔÚµÄλÖᣠ->> ÏÖÔÚ¼üÈë C-s ¿ªÊ¼Ò»¸öËÑÑ°¡£ÂýÒ»µã£¬Ò»´Î¼üÈëÒ»¸ö×ÖÔª£¬ - ¼üÈ롺cursor¡»Õâ¸ö×Ö£¬Ã¿¼üÈëÒ»¸ö×ÖԪʱ£¬ÉÔ΢ͣһÏ£¬ - ×¢Òâ¿´¿´Óα귢ÉúÁËʲôÊ¡£ÏÖÔÚÄúÒÑÔø¾ËÑÑ°¹ý¡¸cursor¡¹Õâ¸ö×ÖÁË¡£ ->> ÔٴμüÈë C-s À´ËÑÑ°¡¸cursor¡¹µÄÏÂÒ»¸ö³öÏÖλÖᣠ->> ÏÖÔÚ¼üÈë <Delback> ËĴΣ¬¿´¿´ÓαêÊÇÈçºÎÒƶ¯µÄ¡£ ->> ¼üÈë <Return> ½áÊøËÑÑ°¡£ +Á¬ÐøʹÓà C-x o ¿ÉÒÔ±éÀúËùÓд°¸ñ¡£Ã¿Ò»¸ö´°¸ñ¶¼ÓÐËü×Ô¼ºµÄ¹â±êλÖ㬵«ÊÇÖ» +ÓÐÒ»¸ö´°¸ñ»áÕæÕýÏÔʾÕâ¸ö¹â±ê¡£¡¾ÆäËü´°¸ñÔÚ¿ØÖÆ̨ϲ»»áÏÔʾ¹â±ê£¬ÔÚͼÐÎ +´°¿ÚÏÂȱʡÏÔʾΪïοչâ±ê¡£¡¿Ò»°ãËùÓеıà¼ÃüÁ×÷ÓÃÓÚÕâ¸ö¹â±êËùÔڵĴ° +¸ñ£¬ÎÒÃdzÆÕâ¸ö´°¸ñΪ¡°±»Ñ¡ÖеĴ°¸ñ¡±¡£ -ÄúÓÐûÓп´µ½·¢ÉúÁËʲô£¿ÔÚÒ»¸ö½¥½øʽËÑÑ°ÖУ¬Emacs ÊÔÖøÒª×ßµ½Äú¼üÈëµÄ×Ö -´®µÄÏÂÒ»¸ö³öÏÖλÖá£ÒªÒƶ¯µ½ÓαêËùÔÚµÄÏÂÒ»¸ö³öÏÖλÖã¬Ö»ÒªÔÙ¼üÈë C-s -Ò»´Î¡£Èç¹û²¢Ã»ÓÐÕâÑùµÄ³öÏÖλÖôæÔÚ£¬Emacs »áßÙÒ»Éù£¬²¢¸æËßÄúÄ¿Ç°µÄËÑÑ° -¡¸Ê§°Ü¡¹¡£ÁíÍâ C-g Ò²¿ÉÒÔÓÃÀ´½áÊøËÑÑ°¡£ +µ±ÄãÔÚÒ»¸ö´°¸ñÖб༣¬µ«ÊÇÏëÓÃÁíÒ»¸ö´°¸ñ×÷²Î¿¼µÄʱºò£¬C-M-v ÊǺÜÓÐÓÃµÄ +ÃüÁî¡£Äã¿ÉÒÔ±£³Ö¹â±êʼÖÕ´¦Óڱ༴°¸ñÖУ¬È»ºóÓà C-M-v ÃüÁîÔÚÁíÍâÒ»¸ö´°¸ñ +Àï¹ö¶¯¡£¡¾·ÒëºÍУ¶Ô¾ÍºÜÊʺÏÓÃÕâÖÖ·½Ê½½øÐС£¡¿ + +C-M-v ÊÇÒ»¸ö CONTROL-META ×éºÏ¼ü¡£Èç¹ûÄãÓÐ META ¼ü£¬Äã¿ÉÒÔͬʱ°´×¡ +CONTROL ºÍ META ¼üÈ»ºóÊäÈë v¡£CONTROL ºÍ META ¼üÄĸöÏÈ°´Ã»ÓйØϵ£¬ÒòΪ +ËüÃÇÖ»ÊÇÓÃÀ´¡°ÐÞÊΣ¨modify£©¡±ÄãÊäÈëµÄ×Ö·ûµÄ¡£ -×¢Ò⣺ÔÚijЩϵͳÖУ¬¼üÈë C-s ½«»á°ÑÓ©Ä»¶³½á£¬Äú½«¿´²»µ½´Ó Emacs À´µÄÈÎ -ºÎÊä³ö¡£Õâ±íʾ²Ù×÷ϵͳһ¸ö³ÆΪ¡¸Á÷³Ì¿ØÖÆ¡¹µÄ¡¸¹¦ÄÜ¡¹½« C-s Ö¸ÁîÀ¹½Øס£¬ -²¢ÇÒ²»ÈÃËü´«µ½ Emacs¡£ÒªÈ¡ÏûÓ©Ä»µÄ¶³½á£¬Çë¼üÈë C-q¡£È»ºóµ½ Emacs ʹÓà -ÊÖ²áÖп´¿´¶Ô춡¸½¥½øʽËÑÑ°µÄͬʱ½øÈ루 Spontaneous Entry to -Incremental Search £©¡¹Õâ¸öÖ÷Ì⣬ÒÔÈ¡µÃ´¦ÀíÕâ¸ö¡¸¹¦ÄÜ¡¹µÄ½¨Òé¡£ +Èç¹ûÄ㲢ûÓÐ META ¼ü£¬ÄãÒ²¿ÉÒÔÓà ESC À´´úÌ棬²»¹ýÕâÑù×Ó°´¼ü˳Ðò¾ÍÓйØϵ +ÁË£ºÄã±ØÐëÊäÈë ESC £¬È»ºóÔÙÊäÈë CONTROL-v¡£CONTROL-ESC v ÊÇûÓõģ¬ÒòΪ +ESC ±¾ÉíÊÇÒ»¸ö×Ö·û¼ü£¬¶ø²»ÊÇÒ»¸öÐÞÊμü£¨modifier key£©¡£ + +>> £¨ÔÚÉÏ·½´°¸ñÀÊäÈë C-x 1 ¹ØµôÏ·½´°¸ñ¡£ + +£¨Èç¹ûÄãÔÚÏ·½µÄ´°¸ñÀïÊäÈë C-x 1£¬ÄÇô¾Í»á¹ØµôÉÏ·½µÄ´°¸ñ¡£Äã¿ÉÒÔ°ÑÕâ¸ö +ÃüÁî¿´³ÉÊÇ¡°Ö»±£ÁôÒ»¸ö´°¸ñ¡±¡ª¡ª¾ÍÊÇÎÒÕýÔڱ༵ÄÕâ¸ö¡££© -Èç¹ûÄúÔÚÒ»¸ö½¥½øʽËÑÑ°µÄÖм䣬²¢ÇÒ¼üÈë <Delback>£¬Äú¿ÉÒÔ·¢ÏÖÔÚËÑÑ°×Ö´® -ÖеÄ×îºóÒ»¸ö×ÖÔª±»Ïû³ýÁË£¬²¢ÇÒËÑÑ°»á»Øµ½Õâ¸öËÑÑ°µÄ×îºóÒ»¸öµØ·½¡£¾ÙÀýÀ´ -˵£¬¼ÙÉèÄúÒѾ¼üÈëÁË¡ºc¡»£¬ÓÃÀ´Ñ°ÕÒ¡¸c¡¹µÄµÚÒ»´Î³öÏÖ¡£ÏÖÔÚÈç¹ûÄú¼üÈë -¡ºu¡»£¬Óαê»áÒƶ¯µ½¡¸cu¡¹µÄµÚÒ»´Î³öÏÖλÖá£ÏÖÔÚ¼üÈë <Delback> £¬Õâ»á½« -¡¸u¡¹´ÓËÑÑ°×Ö´®ÖÐÏû³ý£¬²¢ÇÒÓαê»áÒƻص½¡¸c¡¹µÄµÚÒ»´Î³öÏÖλÖᣠ+²»Í¬µÄ´°¸ñÀï¿ÉÒÔÏÔʾ²»Í¬µÄ»º³åÇø¡£Èç¹ûÄãÔÚÒ»¸ö´°¸ñÀïÓà C-x C-f ´ò¿ªÁË +Ò»¸öÎļþ£¬ÁíÒ»¸ö´°¸ñ²¢²»»áÓÐʲô±ä»¯¡£ÔÚÈκÎÒ»¸ö´°¸ñÀﶼ¿ÉÒÔ´ò¿ªÎļþ¡£ + +ÓÐÒ»ÖÖ·½Ê½¿ÉÒÔÈÃÄãÔÚÁíÒ»¸ö´°¸ñÀï´ò¿ªÎļþ£º -Èç¹ûÄúÔÚÒ»¸öËÑÑ°µÄÖм䣬²¢ÇÒ¼üÈëÒ»¸ö CONTROL »ò META ×ÖÔªµÄ»°£¬£¨µ«ÓÐ -һЩÀýÍâ -- ¶ÔËÑÑ°¶øÑÔÌرðµÄ×ÖÔª£¬ÏñÊÇ C-s ºÍ C-r £©£¬ËÑÑ°»á±»½áÊø¡£ +>> ÊäÈë C-x 4 C-f£¬ºóÃæ½ô¸ú×ÅÊäÈëÒ»¸öÎļþÃû£¬Óà <Return> ½áÊø¡£ + ¿ÉÒÔ¿´µ½ÄãÖ¸¶¨µÄÎļþ³öÏÖÔÚÏ·½µÄ´°¸ñÖУ¬Í¬Ê±¹â±êÒ²Ìøµ½ÁËÄÇÀï¡£ -C-s »á¿ªÊ¼Ò»¸öËÑÑ°£¬Ëü»áÑ°ÕÒËÑÑ°×Ö´®ÔÚÄ¿Ç°ÓαêλÖá¸Ö®ºó¡¹£¬µÄÈκγöÏÖ -λÖá£Èç¹ûÄúÏëÒªÔÚÏÈÇ°ÎÄ×ÖÖÐËÑÑ°£¬¼üÈë C-r ×÷ΪÌæ´ú¡£³ýÁËËÑÑ°µÄ·½ÏòÏà -·´Ö®Í⣬ÎÒÃÇËù˵µÄÓÐ¹Ø C-s µÄËùÓÐÊÂÇ飬ͬÑùµØ¿ÉÒÔÓ¦Óõ½ C-r ÉÏ¡£ +>> ÊäÈë C-x o »Øµ½ÉÏ·½µÄ´°¸ñ£¬È»ºóÔÙÓà C-x 1 ¹ØµôÏ·½´°¸ñ¡£ -* ¶àÖØ´°¸ñ£¨ MULTIPLE WINDOWS £© --------------------------------- - -Emacs Ðí¶àºÃ¹¦ÄܵÄÆäÖÐÖ®Ò»ÊÇ£¬Äú¿ÉÒÔÔÚÓ©Ä»ÖÐͬʱչʾ³¬¹ýÒ»¸ö´°¸ñ¡£ - ->> Òƶ¯Óα굽ÕâÒ»Ðв¢ÇÒ¼üÈë C-u 0 C-l¡£ - ->> ÏÖÔÚ¼üÈë C-x 2£¬Ëü»á½«Ó©Ä»Æ½·Ö³ÉÁ½¸ö´°¸ñ¡£ - ÕâÁ½¸ö´°¸ñ¶¼ÏÔʾÖøÕâ¸ö¿ìËÙÖ¸ÄÏ¡£ÓαêÔòÍ£ÁôÔÚÉÏ·½µÄ´°¸ñ¡£ - ->> ¼üÈë C-M-v ÒÔ¾í¶¯Ï·½µÄ´°¸ñ¡£ - £¨Èç¹ûÄú²¢Ã»ÓÐÒ»¸öÕæµÄ META ¼ü£¬Ôò¼üÈë ESC C-v Òà¿É¡££© - ->> ¼üÈë C-x o£¨¡ºo¡»Ö¸µÄÊÇÆäËû¡ºother¡»µÄÒâ˼£©£¬ - ½«ÓαêÒƶ¯µ½Ï·½µÄ´°¸ñ¡£ - ->> ÔÚÏ·½µÄ´°¸ñÖУ¬Ê¹Óà C-v ºÍ M-v À´¾í¶¯Ëü¡£ - ¼ÌÐøά³ÖÔÚÉÏ·½µÄ´°¸ñÖÐÔĶÁÕâЩָÒý¡£ - ->> ÔÙÒ»´Î¼üÈë C-x o ½«ÓαêÒƻص½ÉÏ·½µÄ´°¸ñ¡£ - Óαê»á»Øµ½ËüÔÚÉÏ·½´°¸ñÖУ¬Ô±¾ËùÔÚµÄλÖᣠ- -Äú¿ÉÒÔ³ÖÐøʹÓà C-x o ÔÚ´°¸ñÖ®¼äÇл»¡£Ã¿Ò»¸ö´°¸ñÓÐËü×Ô¼ºµÄÓαêλÖ㬵« -ÊÇÖ»ÓÐÒ»¸ö´°¸ñ»áÕæµÄÏÔʾ³öÓαꡣËùÓÐͨ³£µÄ±à¼Ö¸ÁîÖ»»áÓ¦Óõ½ÄǸöÓαêËù -ÔڵĴ°¸ñ¡£ÎÒÃdzÆÕâ¸öΪ¡¸±»Ñ¡ÔñµÄ´°¸ñ¡¹¡£ +* µÝ¹é±à¼£¨RECURSIVE EDITING LEVELS£© +-------------------------------------- -Ö¸Áî C-M-v ÔÚµ±Äúì¶Ò»¸ö´°¸ñÖбà¼ÎÄ×Ö£¬²¢Ê¹ÓÃÆäËûµÄ´°¸ñ×÷Ϊ²Î¿¼Ö®ÓÃʱ£¬ -ÊǷdz£ÓÐÓõġ£Äú¿ÉÒÔ½«ÓαêÒ»Ö±±£³ÖÔÚÄúÕýÔڱ༵Ĵ°¸ñÖУ¬²¢ÒÔ C-M-v Ö¸ -ÁîÔÚÆäËûµÄ´°¸ñÑÐòµØÇ°½ø¡£¡¾ÑéÖ¤¹¤×÷ÌرðÊʺÏÒÔÕâÖÖ·½Ê½À´½øÐУ¬Èç GNU -ÖÐÒëС×飺ÕÒÒ»¸öÔʼӢÎĵµ°¸£»ÔÙÕÒËü·ÒëºÃµÄÖÐÎĵµ°¸£¬±à¼Õâ¸ö¡¸±»Ñ¡Ôñ -µÄ´°¸ñ¡¹£¬ÒÔ C-M-v Ö¸Áî¸úÉÏÑéÖ¤ÖеĶÎÂä¡¡¡£¡¿ - -C-M-v ÊÇ CONTROL-META ×ÖÔªµÄÒ»¸öÀý×Ó¡£Èç¹ûÄúÓÐÒ»¸öÕæµÄ META ¼ü£¬Äú¿ÉÒÔ -ͬʱ°´×¡ CONTROL ºÍ META ÔÙ¼üÈë v À´¼üÈë C-M-v¡£CONTROL »ò META ¡¸ËÏÈ -±»°´×¡¡¹²¢Ã»ÓÐÓ°Ï죬ÒòΪÕâÁ½¸ö¼ü¶¼ÊÇÓÃÀ´ÐÞÊÎÄúËù¼üÈëµÄ×ÖÔª¡£ - -Èç¹ûÄú²¢Ã»ÓÐÒ»¸öÕæµÄ META ¼ü£¬Äú¿ÉÒÔʹÓà ESC À´×÷ΪÌæ´ú£¬ÕâÑù×Ó˳Ðò¾Í -ÓйØϵÁË£ºÄú±ØÐë¼üÈë ESC £¬¸úÖø¼üÈë CONTROL-v£¬CONTROL-ESC v ²¢²»»á×÷ -Óá£ÕâÊÇÒòΪ ESC ÊÇÒ»¸ö¾ßÓб¾Éí×÷ÓõÄ×ÖÔª£¬¶ø²»ÊÇÒ»¸öÐÞÊμü¡£ +ÓÐʱºòÄã»á½øÈëËùνµÄ¡°µÝ¹é±à¼¡±¡£µÝ¹é±à¼×´Ì¬ÓÉλÓÚ״̬À¸µÄ·½À¨ºÅËùÖ¸ +ʾ£¬ÆäÖаüº¬ÁËÓÃСÀ¨ºÅÀ´Ö¸Ã÷µÄģʽÃû³Æ¡£±ÈÈç˵£¬ÄãÓÐʱ¿ÉÄܻῴµ½ +[(Fundamental)]£¬¶ø²»ÊÇ (Fundamental)¡£¡¾±ÈÈçÔÚÓà M-% ½øÐн»»¥Ê½Ìæ»»µÄ +ʱºòÄãÓÖÓÃÁË C-s ½øÐÐËÑË÷£¬ÕâʱÌ滻ģʽ²¢Ã»ÓнáÊø£¬µ«ÄãÓÖ½øÈëÁËËÑË÷ģʽ£¬ +Õâ¾ÍÊÇËùνµÄµÝ¹é±à¼¡£¡¿ ->> £¨ÔÚÉÏ·½´°¸ñ£©¼üÈë C-x 1 ÒÔ³ýȥϷ½´°¸ñ¡£ - -£¨Èç¹ûÄúÒѾÔڵ׶˵Ĵ°¸ñ¼üÈë C-x 1£¬ÄÇô½«»á°ÑÉÏÃæµÄ´°¸ñÒþ²Øס¡£½«Õâ¸ö -Ö¸ÁîÏëÏñ³É¡¸Ö»±£ÁôÒ»¸ö´°¸ñ -- ÎÒÕýÔڱ༵ÄÕâ¸ö¡£¡¹£© +À뿪µÝ¹é±à¼¿ÉÒÔÓà ESC ESC ESC¡£ÕâÊÇÒ»¸ö×îͨÓõġ°À뿪¡±ÃüÁÄãÉõÖÁ¿É +ÒÔʹÓÃËüÀ´¹Øµô¶àÓàµÄ´°¸ñ£¬»òÕßÀ뿪С»º³å¡£ -Äú²»ÐèÒªÔÚÁ½¸ö²»Í¬µÄ´°¸ñÖÐÏÔʾÏàͬµÄ»º³åÇø¡£Èç¹ûÄúʹÓà C-x C-f ÔÚÒ»¸ö -´°¸ñÖÐÕÒµµ°¸£¬ÁíÒ»¸ö´°¸ñ²¢²»Òò¶ø¸Ä±ä¡£Äú¿ÉÒÔÔÚ¶ÀÁ¢µÄÈÎÒ»¸ö´°¸ñÖÐÕÒ¡²Ëü -×Ô¼ºµÄ¡³Ò»¸öµµ°¸¡£ - -ÕâÀïÓÐÁíÍâÒ»¸ö·½Ê½¿ÉÒÔÓÃÀ´£¬Ê¹ÓÃÁ½¸ö´°¸ñÏÔʾÁ½¸ö²»Í¬µÄ¶«Î÷£º +>> ÊäÈë M-x ½øÈëС»º³å£»È»ºóÊäÈë ESC ESC ESC À뿪¡£ ->> ¼üÈë C-x 4 C-f£¬ºóÃæ¸úÖøÄúµÄÆäÖÐÒ»¸öµµ°¸µÄÃû³Æ¡£ - ÒÔ <Return> ×÷Ϊ½áÊø¡£¿´¿´Ö¸¶¨µÄµµ°¸³öÏÖÔÚÏ·½µÄ´°¸ñ¡£ - ÓαêÒ²Åܵ½ÄÇÀï¡£ - ->> ¼üÈë C-x o ÒԻص½ÉÏ·½µÄ´°¸ñ£¬È»ºóÒÔ C-x 1 ɾ³ýµôÏ·½´°¸ñ¡£ +Äã²»ÄÜÓà C-g À´À뿪µÝ¹é±à¼£¬ÒòΪ C-g µÄ×÷ÓÃÊÇÈ¡ÏûÃüÁîºÍ¡°²ÎÊý +£¨arguments£©¡±£¬¶øÕâЩ¶«Î÷¶¼Î»ÓÚ±¾²ãµÝ¹é±à¼¡°Ö®ÄÚ¡±¡£ -* µÝ¹é±à¼½×²ã£¨ RECURSIVE EDITING LEVELS £© --------------------------------------------- - -ÓÐʱºòÄú»á½øÈëËùνµÄ¡¸µÝ¹é±à¼½×²ã¡¹¡£ËüÊÇÓÉλÔÚ״̬Ðеķ½À¨»¡ËùÖ¸Ã÷£¬ -²¢ÇÒ°üº¬×¡ÒÔСÀ¨»¡À´Ö¸Ã÷µÄģʽÃû³Æ¡£¾ÙÀýÀ´Ëµ£¬Äú¿ÉÄܻῴµ½ -[(Fundamental)]£¬¶ø²»ÊÇ (Fundamental)¡£ +* »ñµÃ¸ü¶à°ïÖú£¨GETTING MORE HELP£© +----------------------------------- -ÒªÀ뿪µÝ¹é±à¼½×²ã£¬Çë¼üÈë ESC ESC ESC¡£ÕâÊǸöÈ«¹¦Äܵġ¸À뿪¡¹Ö¸Áî¡£Äú -Ò²¿ÉÒÔʹÓÃËüÀ´³ýÈ¥¶àÓàµÄ´°¸ñ£¬²¢ÇÒÀ뿪С»º³åÇø¡£ - ->> ¼üÈë M-x ÒÔ½øÈëС»º³åÇø£»È»ºó¼üÈë ESC ESC ESC À뿪¡£ - -ÄúÎÞ·¨Ê¹Óà C-g À´À뿪µÝ¹é±à¼½×²ã¡£ÕâÊÇÒòΪ C-g ÊÇÓÃÀ´È¡ÏûÖ¸ÁîÒÔ¼°¡¸Î» -춡¹µÝ¹é±à¼½×²ãÖеġ¸ÒýÊý£¨ arguments £©¡¹Ö®¹Ê¡£ - - -* È¡µÃ¸ü¶àµÄ°ïÖú£¨ GETTING MORE HELP £© ---------------------------------------- +±¾¿ìËÙÖ¸ÄϵÄÄ¿µÄ½ö½öÊÇ°ïÖúÄãѧ»áÔÚ Emacs µÄ´óº£ÀïÓÎÓ¾£¬²»ÖÁÓÚÒ»ÉÏÀ´¾ÍÑÍ +ËÀ¡£ÓÐ¹Ø Emacs µÄ»°ÌâÈýÌìÈýÒ¹Ò²½²²»Í꣬ÕâÀï×ÔÈ»ÊÇд²»ÏÂÁË¡£Emacs ºÜÀí½â +ÄãÇóÖªÈô¿ÊµÄÐÄÇ飬ÒòΪËüÌṩµÄÇ¿¾¢¹¦ÄÜʵÔÚÊÇÌ«¶àÁË¡£Emacs ÌṩÁËһЩÃü +ÁîÀ´²é¿´ Emacs ÃüÁîµÄÎĵµ£¬ÕâЩÃüÁÒÔ CONTROL-h ¿ªÍ·£¬Õâ¸ö×Ö·ûÒ²Òò´Ë +±»³ÆΪ¡°Help£¨°ïÖú£©×Ö·û¡±¡£ -ÔÚ±¾¿ìËÙÖ¸ÄÏÖУ¬ÎÒÃÇÊÔÖø½öÌṩ¸Õ¸ÕºÃµÄÐÅÏ¢ÈÃÄú¿ÉÒÔ¿ªÊ¼Ê¹Óà Emacs¡£ÔÚ -Emacs ÖÐÓÐÌ«¶à¿ÉÈ¡µÃµÄÐÅÏ¢£¬ÏëÒªÔÚÕâÀïÈ«²¿½âÊÍÊDz»¿ÉÄܵġ£È»¶ø£¬ÄúÒ²Ðí -»áÏëҪѧϰ¸ü¶à Emacs Ïà¹ØµÄÐÅÏ¢£¬ÒòΪËüÓÐÐí¶àÆäËûÓÐÓõŦÄÜ¡£Emacs Ìá -¹©ÁË¡¸ÔĶÁÓÐ¹Ø Emacs Ö¸ÁµÄÖ¸Áî¡£ÕâЩ¡¸help¡¹Ö¸ÁÒÔ CONTROL-h Õâ¸ö -×ÖÔª×÷Ϊ¿ªÍ·£¬³Æ×÷Ϊ¡¸Help ×ÖÔª¡¹¡£ - -ҪʹÓà Help ¹¦ÄÜ£¬¼üÈë C-h ×ÖÔª£¬È»ºóÔÙ¼üÈëÒ»¸ö˵Ã÷ÄúËùÐèÒªµÄ°ïÖúµÄ×Ö -Ôª¡£Èç¹ûÄúÕæµÄ²»ÖªµÀÒªÎÊʲô£¬ÄÇôÇë¼üÈ롺C-h ?¡»£¬´Ëʱ Emacs ½«»á¸æËß -ÄúËüÄܹ»ÌṩµÄ°ïÖú¡£Èç¹ûÄúÒѾ¼üÈë C-h£¬µ«·¢ÏÖÄú²¢²»ÐèÒªÈκΰïÖú£¬¼üÈë -C-g À´È¡ÏûµôËü¾ÍÊÇÁË¡£ +ҪʹÓðïÖú£¨Help£©¹¦ÄÜ£¬ÇëÏÈÊäÈë C-h£¬È»ºóÔÙÊäÈëÒ»¸ö˵Ã÷ÄãÐèÇóµÄ×Ö·û¡£ +Èç¹ûÄãÔε½Á¬ÐèҪʲô°ïÖú¶¼²»ÖªµÀ£¬ÄÇô¾ÍÊäÈë C-h ?£¬Emacs »á¸æËßÄãËüÄÜ +ÌṩÄÄЩ°ïÖú¡£Èç¹ûÄãÒѾ°´ÁË C-h ÓÖÏë·´»Ú£¬ÄÇôÓà C-g È¡ÏûËü¾ÍÊÇÁË¡£ -£¨ÓÐЩÍøÕ¾½« C-h Õâ¸ö×ÖÔªµÄÒâÒå¸Ä±äÁË¡£ËûÃÇÕæµÄ²»Ó¦¸Ã°ÑËüÉèΪ¶ÔËùÓÐʹ -ÓÃÕßÈ«²¿¶¼ÊÊÓõķ½·¨£¬ËùÒÔÄúÏÖÔÚ¾ÍÓÐÁ˸öÀíÓÉÀ´±§Ô¹ÏµÍ³¹ÜÀíÕßÁË¡£ÔÚ´Ëͬ -ʱ£¬Èç¹û C-h ²¢Ã»ÓÐÔÚ´°¸ñµÄµ×²¿ÏÔʾÈκÎÓйذïÖúµÄѶϢ£¬ÊÔÖø¼üÈë F1 ¼ü£¬ -»òÊÇ M-x help <Return>¡££© +£¨ÓÐЩվµã¸Ä±äÁË C-h µÄÒâ˼£¬ËûÃÇÕâÖÖÒÔ¼º¶ÈÈËÍâ¼ÓÒ»µ¶ÇеÄ×ö·¨Èõ¹ÊÇÈÃÄã +¿ÉÒÔÒåÕý´ÇÑϵı§Ô¹ÏµÍ³¹ÜÀíÔ±£¬ÕæµÄ²»ÊÇÌ«ºÃ¡£»°Ëµ»ØÀ´£¬Èç¹ûÄã°´ C-h Ö®ºó +ûÓÐÈκΰïÖúÐÅÏ¢ÏÔʾ³öÀ´£¬ÄÇôÊÔÊÔ F1 ¼ü»òÕß M-x help <Return>¡££© -×î»ù±¾µÄ HELP ¹¦ÄÜÊÇ C-h c¡£¼üÈë C-h£¬×ÖÔª c£¬ÒÔ¼°Ò»¸ö»òÒ»´®×ÖÔª£»È»ºó -Emacs »áÏÔʾһ¸ö·Ç³£¼ò¶ÌµÄÓйØÕâ¸öÖ¸ÁîµÄ½âÊÍ¡£ +×î»ù±¾µÄ°ïÖú¹¦ÄÜÊÇ C-h c¡£ÊäÈë C-h c Ö®ºóÔÚÊäÈëÒ»¸ö×éºÏ¼ü£¬Emacs »áºÜ¼ò +ÒªµØ¸ø³öÕâ¸öÃüÁîµÄ˵Ã÷¡£ ->> ¼üÈë C-h c C-p¡£ +>> ÊäÈë C-h c C-p¡£ -ѶϢӦ¸Ã»áÏñÊÇÕâÑù£º +ÏÔʾµÄÏûÏ¢Ó¦¸Ã»áÊÇÕâÑù£º C-p runs the command previous-line -Õâ¸æËßÁËÄú¡¸º¯ÊýµÄÃû³Æ¡¹¡£º¯ÊýÃû³ÆÖ÷ÒªÊÇÓÃÀ´×Ô¶©ÒÔ¼°À©³ä Emacs¡£µ«ÊÇÓÉ -춺¯ÊýÃû³ÆÊÇÓÉ¡¸ÓÃÀ´Ö¸³öÕâÖ¸ÁîÔÚ×öЩʲô¡¹¶ø±»Ñ¡¶¨£¬ËüÃÇÒò´ËÒ²¿ÉÒÔ×÷Ϊ -·Ç³£¼ò¶ÌµÄÎĵµ -- ×ã¹»ÌáÐÑÄúÒѾѧ¹ýµÄÖ¸Áî¡£ +ÕâÌõÏûÏ¢ÏÔʾÁË C-p ÃüÁî¶ÔÓ¦µÄº¯ÊýÃû£¬º¯ÊýÃûÖ÷ÒªÓÃÀ´¶¨ÖƺÍÀ©Õ¹ Emacs¡£Ãü +ÁîµÄ¹¦ÄÜÓɺ¯ÊýÍê³É£¬ËùÒÔº¯ÊýÃû±¾ÉíÒ²¿ÉÒÔ±»¿´³ÉÊÇ×î¼òµ¥µÄÎĵµ¡ª¡ªÖÁÉÙ¶Ô +ÓÚÄãÒѾѧ¹ýµÄÃüÁîÀ´Ëµ£¬ËüÃǵĺ¯ÊýÃû×ãÒÔ½âÊÍËüÃÇËùÍê³ÉµÄ¹¤×÷ÁË¡£ -¶à×ÖÔªÖ¸ÁîÏñÊÇ C-x C-s ºÍ £¨Èç¹ûÄúûÓÐ META »ò EDIT »ò ALT ¼ü£©<ESC>v -Ò²¿ÉÒÔÔÚ C-h c ºóÃæ³öÏÖ¡£ +¶à×Ö·ûÃüÁîÒ»Ñù¿ÉÒÔÓà C-h c À´²é¿´¡£ -ҪȡµÃ¸ü¶àÓйØÒ»¸öÖ¸ÁîµÄÐÅÏ¢£¬Óà C-h k À´È¡´úʹÓà C-h c ¡£ +ÏëµÃµ½¸ü¶àµÄÐÅÏ¢£¬Çë°Ñ C-h c »»³É C-h k ÊÔÊÔ¿´¡£ ->> ¼üÈë C-h k C-p¡£ +>> ÊäÈë C-h k C-p¡£ -Õâ»áÔÚÒ»¸ö Emacs ´°¸ñÏÔʾÕâ¸öº¯ÊýµÄ˵Ã÷ÎĵµÒÔ¼°ËüµÄÃû³Æ¡£µ±ÄúÔĶÁÍêºó£¬ -¼üÈë C-x 1 ÒÔÌøÀëÕâЩ°ïÖúÎÄ×Ö¡£Äú²¢²»ÐèÒªÂíÉϸúÖø×ö¡£Äú¿ÉÒÔ×öЩ±à¼£¬ -µ±²Î¿¼µ½°ïÖúÎÄ×ÖʱÔÙ¼üÈë C-x 1¡£ - -ÕâÀïÓÐһЩÆäËûÓÐÓÃµÄ C-h Ñ¡Ï +ÉÏÃæµÄÃüÁî»áдò¿ªÒ»¸ö Emacs ´°¸ñ£¬²¢ÔÚÆäÖÐÏÔʾº¯ÊýµÄÃû³Æ¼°ÆäÎĵµ¡£Äã¶Á +ÍêÖ®ºó£¬¿ÉÒÔÓà C-x 1 ¹ØµôÕâ¸ö°ïÖú´°¸ñ¡£µ±È»Äã²¢²»ÐèÒªÔÚ C-h k Ö®ºóÁ¢¼´ +ÕâÑù×ö£¬ÄãÍêÈ«¿ÉÒÔÏÈÔڱ༴°¸ñÀï×öµã±ðµÄÊÂÇ飬ȻºóÔÙÓà C-x 1 ¹Øµô°ïÖú¡£ - C-h f ½âÊÍÒ»¸öº¯Êý¡£ÄúÒª¼üÈë´Ëº¯ÊýµÄÃû³Æ¡£ +»¹ÓÐһЩÆäËûÓÐÓÃµÄ C-h ÃüÁ ->> ÊÔÖø¼üÈë C-h f previous-line<Return>¡£ - Õâ»áÓ¡³ö Emacs ËùÓеÄÓйء¸Êµ×÷³ö C-p Õâ¸öÖ¸ÁîµÄº¯Êý¡¹µÄÐÅÏ¢ + C-h f ½âÊÍÒ»¸öº¯Êý¡£ÄãÒªÊäÈ뺯ÊýÃû¡£ -C-h v Õâ¸öÀàËƵÄÖ¸Áî»áÏÔʾ³ö¡¸Äú¿ÉÒÔÓÃÀ´×Ô¶© Emacs ÐÐΪµÄ±äÊý¡¹µÄÎĵµ¡£ -µ± Emacs ÒªÇóʱ£¬ÄúÐèÒª¼üÈëÕâ±äÊýµÄÃû³Æ¡£ +>> ÊÔÊÔ¿´£¬ÊäÈë C-h f previous-line<Return>¡£ + Emacs »á¸ø³öËüËùÖªµÀµÄËùÓÐÓйء°ÊµÏÖ C-p ÃüÁÄܵĺ¯Êý¡±µÄÐÅÏ¢¡£ - C-h a Ö¸ÁîÏà¹Ø²éÕÒ£¨ Command Apropos £©¡£ - ¼üÈëÒ»¸ö¹Ø¼ü×ÖÈ»ºó Emacs »áÁгöËùÓÐ - ¡¸ÔÚÆäÃû³ÆÖк¬Óд˹ؼü×Ö¡¹µÄÈ«²¿Ö¸Áî¡£ - ÕâЩָÁîÈ«²¿¶¼¿ÉÒÔ¾ÓÉ META-x À´Æô¶¯¡£ - ¶Ôì¶Ò»Ð©Ö¸Áî¶øÑÔ£¬Ö¸ÁîÏà¹Ø²éÕÒÒ²»áÁгö - ¡¸¿ÉÒÔÖ´ÐÐÏàָͬÁµÄÒ»¸ö»òÁ½¸ö×ÖÔªµÄ´®ÁС£ +C-h v ÓÃÀ´ÏÔʾ Emacs ±äÁ¿µÄÎĵµ£¬Emacs ±äÁ¿¿ÉÒÔ±»ÓÃÀ´¡°¶¨ÖÆ Emacs µÄÐÐ +Ϊ¡±¡£Í¬Ñù£¬ÄãÐèÒªÊäÈë±äÁ¿µÄÃû³Æ¡£ ->> ¼üÈë C-h a file<Return>¡£ + C-h a Ïà¹ØÃüÁîËÑË÷£¨Command Apropos£©¡£ + ÊäÈëÒ»¸ö¹Ø¼ü´ÊÈ»ºó Emacs »áÁгöËùÓÐÃüÁîÃûÖаüº¬´Ë¹Ø¼ü´Ê + µÄÃüÁî¡£ÕâЩÃüÁîÈ«¶¼¿ÉÒÔÓà M-x À´Æô¶¯¡£¶ÔÓÚijЩÃüÁîÀ´Ëµ£¬ + Ïà¹ØÃüÁîËÑË÷»¹»áÁгöÒ»Á½¸ö×éºÏ¼ü¡£ -Õâ»áÔÚÁíÒ»¸ö´°¸ñÏÔʾһ¸ö¡¸ÔÚÆäÃû³ÆÖк¬ÓСºfile¡»µÄÈ«²¿ M-x Ö¸ÁµÄÁÐ -±í¡£Äú½«»á¿´µ½ÏñÊÇ C-x C-f µÄ¡¸×ÖÔª-Ö¸ÁÁÐÔÚÆäÏà¶ÔÓ¦Ö¸ÁîÃû³Æ£¨È磺 -find-file £©µÄÅԱߡ£ +>> ÊäÈë C-h a file<Return>¡£ ->> ¼üÈë C-M-v ÉÏÏÂÒƶ¯ help ´°¸ñ¡£ÊÔ¸ö¼¸´Î¡£ +Emacs »áÔÚÁíÒ»¸ö´°¸ñÀïÏÔʾһ¸ö M-x ÃüÁîÁÐ±í£¬Õâ¸öÁбí°üº¬ÁËËùÓÐÃû³ÆÖк¬ +ÓС°file¡±µÄÃüÁî¡£Äã¿ÉÒÔ¿´µ½Ïñ¡°C-x C-f¡±ÕâÑùµÄ×éºÏ¼üÏÔʾÔÚ¡°find-file¡± +ÕâÑùµÄÃüÁîÃûµÄÅԱߡ£ ->> ¼üÈë C-x 1 À´É¾³ý help ´°¸ñ¡£ +>> Óà C-M-v À´»Ø¹ö¶¯ help ´°¸ñ£¬¶àÊÔ¼¸´Î¡£ + +>> ÊäÈë C-x 1 À´É¾³ý help ´°¸ñ¡£ - C-h i ÔĶÁÏßÉÏʹÓÃÊֲᣨ a.k.a. Info £©¡£ - Õâ¸öÖ¸ÁÄú´øµ½Á˳ÆΪ¡¸*info*¡¹µÄÌØÊ⻺³åÇø£¬ÔÚÄÇ£¬ - Äú¿ÉÒÔÔĶÁ°²×°ÔÚÄúµÄϵͳÀïµÄÈí¼þ°üµÄÏßÉÏʹÓÃÊֲᡣ - ¼üÈë m emacs <Return> ÒÔÔĶÁ Emacs ʹÓÃÊֲᡣ - Èç¹ûÄúÔÚ´Ë֮ǰδÔøʹÓùý Info ϵͳ£¬Çë¼üÈ롺?¡»¡£ - Emacs ½«»á´øÄú½øÈë Info ģʽ¹¦Äܵĵ¼ÀÀÖ¸ÄÏ¡£ - Ò»µ©Íê³ÉÁ˱¾¿ìËÙÖ¸ÄϵÄÑжÁ£¬ÄúÓ¦¸Ã²éÔÄ Emacs Info - ʹÓÃÊֲᣬÒÔ×÷ΪÖ÷ÒªµÄ²Î¿¼Îĵµ¡£ + C-h i ÔĶÁÁª»úÊֲᣨҲ¾ÍÊÇͨ³£½²µÄ Info£©¡£ + Õâ¸öÃüÁî»á´ò¿ªÒ»¸ö³ÆΪ¡°*info*¡±µÄÌØÊ⻺³åÇø£¬ÔÚÄÇÀ + Äã¿ÉÒÔÔĶÁ°²×°ÔÚϵͳÀïµÄÈí¼þ°üʹÓÃÊֲᡣҪ¶Á Emacs µÄʹ + ÓÃÊֲᣬ°´ m emacs <Return> ¾Í¿ÉÒÔÁË¡£Èç¹ûÄã֮ǰ´ÓûÓà + ¹ý Info ϵͳ£¬ÄÇôÇë°´¡°?¡±£¬Emacs »á´øÄã½øÈë Info µÄʹ + ÓÃÖ¸ÄÏ¡£ÔÚ¿´Íê±¾¿ìËÙÖ¸ÄÏÖ®ºó£¬Emacs Info »á³ÉΪÄãµÄÖ÷Òª + ²Î¿¼Îĵµ¡£ -* ¸ü¶à¹¦ÄÜÌØÉ«£¨ MORE FEATURES £© ---------------------------------- +* ¸ü¶à¾«²Ê£¨MORE FEATURES£© +--------------------------- -Äú¿ÉÒÔ¾ÓÉÔĶÁ Emacs ʹÓÃÊֲᡴ²»ÂÛÊÇÒ»±¾Êé»òÊÇÔÚ Info ÖеÄÏßÉÏ°æ±¾ -£¨Ê¹Óà Help Ñ¡µ¥»òÊǼüÈë F10 h r £©¡µÀ´Ñ§µ½¸ü¶àÓйØËüµÄ֪ʶ¡£ÓÐÁ½¸öÄú -¿ÉÄÜ»áÌرðϲ»¶µÄ¹¦ÄÜÌØÉ«ÊÇ¿ÉÒÔ½ÚÊ¡´ò×ÖÁ¿µÄ completion »¹Óмò»¯µµ°¸´¦Àí -µÄ dired ¡£ - -Completion ÊÇÒ»ÖÖ±ÜÃâ²»±ØÒªµÄ´ò×ֵķ½Ê½¡£¾ÙÀýÀ´Ëµ£¬Èç¹ûÄúÏëÒªÇл» -*Messages* »º³åÇø£¬Äú¿ÉÒÔ¼üÈë C-x b *M<Tab> £¬Ö»Òª¿ÉÒÔ´ÓÄúÒѾ¼üÈëµÄÎÄ -×ÖÖÐÈ·¶¨£¬ Emacs ¾Í»á½«Ê£ÏµĻº³åÇøÃû³Æ²¹Æë¡£ Completion ÊÇÔÚ Emacs ʹ -ÓÃÊÖ²áµÄ Info ÖУ¬³ÆΪ¡¸Completion¡¹µÄ½ÚµãÖÐËù½âÊ͵ġ£ +ÏëÁ˽â¸ü¶àʹÓà Emacs µÄ֪ʶ£¬Ó¦¸ÃÈ¥¶ÁÒ»¶Á Emacs ʹÓÃÊֲᡪ¡ª¿ÉÒÔÊÇÖ½°æ +µÄÊ飬Ҳ¿ÉÒÔÊǵç×Ó°æµÄÁª»ú°ïÖú£¨¿ÉÒÔ´Ó Help ²Ëµ¥½øÈë»òÕß°´ F10 h r£©¡£ +ÌáÁ½¸öÄã¿ÉÄÜ»áºÜ¸ÐÐËȤµÄ¹¦ÄÜ°É£¬Ò»¸öÊÇ¿ÉÒÔ°ïÄãÉÙÇüüÅÌµÄ completion£¨×Ô +¶¯²¹È«£©£¬Ò»¸öÊÇ·½±ãÎļþ´¦ÀíµÄ dired£¨Ä¿Â¼±à¼£©¡£ -Dired ʹÄú¿ÉÒÔÔÚÒ»¸öĿ¼ÖÐÁгöµµ°¸£¨´ÎĿ¼ÔòÊÇ¿ÉÑ¡µÄ£©¡¢ÔÚÁбíÖе½´¦ÒÆ -¶¯¡¢°Ý·Ã¡¢ÖØÐÂÃüÃû¡¢É¾³ýÒÔ¼°¶Ôµµ°¸×÷²Ù×÷¡£ Dired ÊÇÔÚ Emacs ʹÓÃÊÖ²áµÄ -Info ÖУ¬³ÆΪ¡¸Dired¡¹µÄ½ÚµãÖÐËù½âÊ͵ġ£ - -ʹÓÃÊÖ²áÒ²½âÊÍÁËÐí¶àÆäËü Emacs µÄ¹¦ÄÜÌØÉ«¡£ - +Completion ¿ÉÒÔÌæÄã½ÚÊ¡²»±ØÒªµÄ¼üÅÌÊäÈë¡£±ÈÈç˵ÄãÏëÇл»µ½ *Message* »º +³åÇø£¬Äã¾Í¿ÉÒÔÓà C-x b *M<Tab> À´Íê³É£¬Ö»Òª Emacs Äܹ»´ÓÄãÒѾÊäÈëµÄÎÄ +×ÖÖÐÅжϳöÄãÏëÒªÊäÈëµÄ¶«Î÷£¬Ëü»á×Ô¶¯°ïÄã²¹ÆëÓàϵġ£ÓÐ¹Ø Completion µÄ +Ïêϸ½âÊÍ¿ÉÒÔÔÚ Emacs Info Öеġ°Completion¡±Ò»½ÚÀïÕÒµ½¡£ -* ½áÂÛ£¨ CONCLUSION £© ----------------------- +Dired ¿ÉÒÔÔÚÒ»¸ö»º³åÇøÀïÁгöÒ»¸öĿ¼ÀïµÄËùÓÐÎļþ£¨¿ÉÒÔÑ¡ÔñÊÇ·ñÒ²Áгö×Ó +Ŀ¼£©£¬È»ºóÄã¿ÉÒÔÔÚÕâ¸öÎļþÁбíÉÏÍê³É¶ÔÎļþµÄÒƶ¯¡¢·ÃÎÊ¡¢¸ÄÃû»òÕßɾ³ý +µÈµÈ²Ù×÷¡£Dired Ò²ÔÚ Emacs Info ÖÐÓÐÏêϸ˵Ã÷£¬¾ÍÔÚ¡°Dired¡±Ò»½Ú¡£ -¼Çס£¬ÒªÍêÈ«À뿪 Emacs ÇëʹÓà C-x C-c ¡£ÒªÔÝʱÀ뿪µ½ shell£¬ÉÔºóÔٻص½ -Emacs£¬ÇëʹÓà C-z ¡£ - -±¾¿ìËÙÖ¸Ä϶Ôì¶ËùÓеÄÐÂÊÖÓ¦¸Ã¶¼ÊÇÒ×ì¶Àí½âµÄ£¬ËùÒÔÈç¹ûÄú·¢ÏÖÁËʲôµØ·½²» -Çå³þ£¬²»ÒªÖ»ÊÇ×øÖø¹Ö×Ô¼º -- £¨Ïò±¾ÎÄ×÷ÕߺͷÒ룩·¢µãÀÎɧ°É£¡ +Emacs ʹÓÃÊÖ²áÀﻹÓкܶàºÜ¶àµÄ¾«²Ê¹¦ÄܵÈ×ÅÄãÀ´Á˽⡣ -* ·Ò루 TRANSLATION £© ------------------------ - -±¾¿ìËÙÖ¸ÄϵķÒëÈËÔ±ÁбíÈçÏ£¬Èç¹ûÄúÔÚÔĶÁ±¾ÎÄ֮ǰ£¬¡¸ÍêÈ«¡¹¶Ô Emacs -ûÓиÅÄÇë¸æËßÎÒÃÇÄúµÄÒâ¼ûÒÔ×÷Ϊ±¾ÎĺóÐøµÄ¸Ä½øÒÀ¾Ý¡£·ÒëÒ²ÌṩÁËÒ»·Ý -¡¶GNU Emacs ÖÐÎÄ´¦Àí˵Ã÷¡·ÔÚ -http://www.gnu.org/software/chinese/guide/emacs-chinese.cn.html ¡´²¿·Ý -ÄÚÈÝÒѾÕûÀíµ½±¾¿ìËÙÖ¸ÄÏ¡µ£¬Ò²ÇëÄú×ÔÐвÎÔÄ¡£ - -±à¼Æ÷ÊǵçÄÔʹÓÃÕß×î³£½Ó´¥µ½µÄÓ¦ÓóÌʽ£¬Òò´Ë²»Ó¦¸ÃÈóõѧÕ߸е½¹ýì¶À§ÄÑ£¬ -¾ÍÒ»°ãµÄÆÀÂÛÀ´Ëµ£¬ Emacs ÊDz»ÄÑѧ»áʹÓõıà¼Æ÷£¬µ«ÄúµÄÒâ¼û¿ÉÒÔʹËü¸ü -ΪÌù½üÒ»°ãµÄʹÓÃÕߣ¬²¢Ê¹µçÄÔ×÷Ϊ¹¤¾ßµÄ½ÇÉ«µÃÒÔ³ä·Ö·¢»Ó¡£Èç¹ûÄúÔ¸ÒâÌṩ -¸Ä½øµÄÒâ¼û£¬Çë¼Ä email µ½<chinese-translators@gnu.org> ¡£Çë²»Òªº¦Ðߣ¬ -ÎÒÃÇ»¶ÓÈκÎÓйصÄÌÖÂÛ£»Èç¹ûÄú²»Ïë¼Äµ½ÓʼþÇåµ¥£¬ÇëÖ±½Ó email ¸ø±¾ÎÄ· -Òë <chliu@gnu.org> ¡£ÇëÔÚ Title ÐÐÖаüº¬´Ë×Ö´®¡¸Emacs TUTORIAL: <your -issue here>¡¹¡£ - -Èç¹ûÄúÊÇ Emacs ÀÏÊÖ£¬GNU Chinese Translators Team (GNU/CTT) -<http://www.gnu.org/software/chinese/> »¶ÓÄúµÄ¼ÓÈ룬ÎÒÃÇÏÖÔÚÕýÐèÒªÔ¸ -ÒâͶÈë·Òë Emacs ʹÓÃÊÖ²áµÄÈËÔ±¡£ - -±¾¿ìËÙÖ¸Äϲ¢Ã»ÓвÉÓÃÏ°¹ßÉϱà¼Æ÷ËùʹÓõķÒëÊõÓһ·½ÃæÒòΪËüµÄʵ¼ÊÒâ -ÒåÓëÒ»°ãµÄ±à¼Æ÷²»Í¬£¬ÔÎı¾¾Í²»Í¬£»ÁíÒ»·½ÃæÒ²ÒòΪ Emacs Ëù²ÉÓõÄÊÓ¾õ -Éè¼Æ¸ÅÄÔçÔÚ´°¿Ú»¯ÏµÍ³Ö®Ç°¾ÍÒѾ´æÔÚ£¬±¾ÖÊÒ²²»Ïàͬ¡£×ÜÖ®£¬·ÒëÒÔΪÕâ -Ñù¿ÉÒÔ°ïÖú¶Ôì¶ Emacs Õû¸öÉè¼ÆÕÜѧµÄÀí½â¡£Èç¹ûÊÕµ½µÄ»Ø¸²ÖУ¬´ó²¿·ÝÒªÇó -Ìá³öÐ޸ģ¬ÎÒÃÇ»¹ÊÇ´ÓÉÆÈçÁ÷¡£ +* ×ܽᣨCONCLUSION£© +-------------------- -(0) ΪÁ˱ÜÃ⡸ÓαêÒƶ¯Ö¸ÁÂÛÊöÉϵĻìÏý£¬±¾ÎIJÉÓõÄÊõÓïΪ£º - Íù¡¸Ç°¡¹ÒÆ£¨ move Forward £©£»Íù¡¸ºó¡¹ÒÆ£¨ move Backware £© - ¡²»òÊÇÍù¡¸»Ø¡¹ÒÆ¡³£» - Íù¡¸ÉÏ¡¹ÒÆ£¨ Previous line £©£»Íù¡¸Ï¡¹ÒÆ£¨ Next line £©¡£ -(1) ÔÚ±¾ÎÄÖУ¬¡¸ÐС¹Ö¸µÄÊÇ row£¬ÕâÊDzÉÓÃÒ»°ãµÄÏ°¹ßÓ÷¨¡£ - ΪÁ˱ÜÃâÎóµ¼ÖÐÎĶÁÕߣ¬ÌرðÔÚ´Ë˵Ã÷¡£ÔÚÕýʽµÄÓ÷¨ÖУº - ¡¸column¡¹·ÒëΪ¡¸ÐС¹£¬ÒÔ¡¸×Ý¡¹ÎªÐУ¨Ö±ÐУ©£¬Ò²ÒëΪ¡¸À¸¡¹£» - ¡¸row¡¹·ÒëΪ¡¸ÁС¹£¬ÒÔ¡¸ºá¡¹ÎªÁУ¨ºáÁУ©¡£ - ¶ÁÕß˼Ë÷һϡ¸ºÏ×ÝÁ¬ºá¡¹Ó¦¸Ã¿ÉÒÔÀí½â¡£ - ´óÔ¼ÊÇÒòΪÖÐÎÄÔ±¾ÊÇÖ±ÊéµÄ£¬ÎÒÃÇ˵¡¸Ò»ÐÐ×Ö¡¹ÊÇûÎÊÌ⣻ - µ«ÏÖÔڴ󲿷ݵÄÇéÐÎÖÐÎÄÊǺáÊéµÄ£¬ÓÉì¶Ï°¹ßʹȻҲ³ÆΪһÐÐ×ÖÁË¡£ -(2) ÓйØ춡¸ÎÄ×Ö¡¹¼°Æ伯ºÏµÄÏà¹ØÒëÎÄ£¬·ÒëËù²ÉÓõÄÓУº - ±à¼µÄ¡¸ÎÄ×Ö¡¹£º¡¸È»ºó¼üÈëһЩÎÄ×Ö¡¹£» - ÓÃÀ´×÷Ϊ˵Ã÷¹¦Äܵġ¸Îĵµ¡¹£º¡¸Õâ¸öº¯ÊýµÄ˵Ã÷Îĵµ¡¹£» - ÌØÖ¸ÆäËù˵Ã÷µÄÄÚÈݵġ¸Îı¾¡¹£º¡¸Êµ¼ÊЧÁ¦ÒÔÓ¢Îı¾Îª×¼¡¹¡£ - ¼´Ê¹Ö»ÊÇ¡¸Ò»ÐÐ×Ö¡¹£¬Ö»ÒªËüÊÇÓÃÀ´×÷Ϊ˵Ã÷Ö®Ó㬠- ·Ò뻹Êǽ«ËüÊÓΪ¡¸Îĵµ¡¹¡£ -(3) ¡¸cut¡¹µÄ¶¯×÷ÔÚ Emacs ÖзÖΪ¡¸É±µô¡¹ºÍ¡¸É¾³ý¡¹£¬Ö®¼äµÄ²îÒìÈçÏ£º - Ò»°ã±à¼Æ÷Öеġ¸cut¡¹£ºÖ»ÓÐ×î½ü±» cut µÄÎÄ×Ö°Úµ½ clipboard ÖУ» - ¡¸É±µô£¨ killing £©¡¹£º±»É±µôµÄÎÄ×Ö£¬È«²¿±»¼ÓÈëµ½ kill ring ÖУ» - ¡¸É¾³ý£¨ deleting £©¡¹£º±»É¾³ýµÄÎÄ×Ö£¬¾ÍÊDZ»É¾³ýÁË¡£ - Òò´ËÔÚÒ»°ã±à¼Æ÷ÖУ¬ÄúÖ»ÄÜ paste¡¸×î½ü¡¹±» cut µÄÎÄ×Ö£» - ¶øÔÚ Emacs ÖУ¬Äú¿ÉÒÔ¡¸À»Ø¡¹ÈκÎÏÈÇ°±»É±µôµÄÎÄ×Ö£¬Í¬Ê±£¬ - ËüµÄ×÷·¨ºÜÈÝÒס£ÖÁ춱»É¾³ýµÄ£¬ÒòΪÓÃÀ´×÷Ϊ¡¸É¾³ý¡¹¹¦ÄܵÄÖ¸Á - ËùÄÜÒÆÈ¥µÄÎÄ×ÖÊýÁ¿¶¼ºÜÉÙ£¬Òò´ËҲûʲôºÃÀ»ØµÄ£» - Èç¹ûÕæµÄÏë»Ø¸´ÕâЩÎÄ×Ö£¬undo ÄúµÄ¶¯×÷¾ÍÊÇÁË¡£ -(4) ¡¸window¡¹Í¬Ê±·ÒëΪ¡¸´°¿Ú¡¹ºÍ¡¸´°¸ñ¡¹£¬ - Ç°Õß±íʾÏÖÔÚÒ»°ã¸ÅÄîÖеĴ°¿Úϵͳ£¬È硸X ´°¿Ú¡¹£» - ºóÕß±íʾ Emacs ÖеĴ°¿Ú£¬·ÒëÔÚ´Ëͨ³ÆΪ¡¸´°¸ñ¡¹¡£ - Emacs µÄ¡¸´°¸ñ¡¹¼´Ê¹ÔÚÃüÁîÁÐÌáʾÏÂÒ²¿ÉÒÔÕý³£¹¤×÷£¬ - ´ËÒ»»ù±¾ÌØÐÔÏÔȻֵµÃÎÒÃÇÒÔÁíÒ»¸öרÓÃÊõÓïÀ´ÃèÊöËü¡£ -(5) ¹Ø춵µ°¸µÄÊõÓ¡¸ÕÒ¡¹Ò»¸öµµ°¸ÔÚ Emacs ÖÐÓÐÁ½ÖÖ×÷Ó㺠- ÕÒÒ»¸ö¡¸²¢²»´æÔÚ¡¹µÄµµ°¸£¬¶ÁÕßÓ¦ÈÏ֪Ϊ¡¸¿ªÐµµ°¸¡¹£» - ÕÒÒ»¸ö¡¸ÒѾ´æÔÚ¡¹µÄµµ°¸£¬ÔòÊÇ¡¸¿ªÆô¾Éµµ¡¹¡£ - Emacs Ö»ÒÔÒ»¸ö¡¸ÕÒ¡¹µÄ¶¯×÷À´½â¾ö£¬Ö÷ÒªµÄÔÒòÊÇ¡¸Êµ¼ÊÉÏ¡¹ - µÄÈí¼þ¹¤×÷Èç´Ë¡£ºÚ¿ÍÃÇÓ¦¸Ã»á·¢ÏÖÕâÑù±È½Ï×ÔÈ»£¬ - ÒòΪËü·´Ó¦Á˵çÄԵŤ×÷·½Ê½£¬Í¬Ê±²Ù×÷ÆðÀ´Ò²½ÏÉÙ·Ï»°¡£ -(6) ÔÚ¡¾¡¿ÖеÄÎÄ×ÖΪ·ÒëµÄ×¢½â¡£ -(7) ¹Øì¶Ê¹ÖÐÎÄÎĵµ½á¹¹»¯µÄÒéÌ⣬ÎÊÌâÒѾ»ñµÃ½â¾ö¡£ -(8) ±¾·ÒëÎı¾Ëù²ÉÓõļò·±ÓÃÓï²îÒìÁбíÈçÏ£º - zh cn - Îļþ Îĵµ - ÈíÌå Èí¼þ - ×÷Òµ ²Ù×÷ - Ì×¼þ °ü - ÊÓ´° ´°¿Ú - µÝ»Ø µÝ¹é - º§¿Í ºÚ¿Í - ×ÊѶ ÐÅÏ¢ +¼Çס£¬ÒªÍ˳ö Emacs ÇëÓà C-x C-c¡£ÒªÔÝʱÇл»µ½ shell ²¢ÇÒÉÔºóÔٻص½ +Emacs ÀïÀ´£¬ÇëÓà C-z¡£¡¾Çл»µ½ shell ½ö¶Ô¿ØÖÆ̨Ï嵀 Emacs ÓÐЧ¡¿ -ÁíÍ⣬ÎÒÃÇҲʮ·Ö»¶Ó¶ÁÕß¿ÉÒÔÖ±½ÓÐ޸ı¾¿ìËÙÖ¸ÄÏ£¬×ö³ö×Ô¼ºµÄ°æ±¾£¬ÒÔ×Ô¼º -ÈÏΪ×îΪºÏÊʵķ½Ê½À´½éÉÜ Emacs ¡£Èç¹ûÄú×ö³öÁËÕâÑù¸öÈË»¯µÄ°æ±¾£¬²¢ÇÒÈÏ -Ϊ×㹩´ó¼Ò²Î¿¼Ê¹Óã¬Çë¼Ä¸ø <chinese-coordinators@gnu.org> £¬ÎÒÃǻὫÄú -µÄ°æ±¾¹«¿ªÔÚ GNU/CTT µÄÍøÒ³ÖÐÌṩ¸øÖÐÎÄʹÓÃÕßÏÂÔØ¡£ - -·Ò룺Áõ ÕѺê <chliu@gnu.org> -ÑéÖ¤£ºÂí ѩƼ +±¾ÎÄÍêÈ«ÊÇΪÁãÆðµãÐÂÊÖдµÄɵ¹Ï½Ì³Ì¡£Èç¹ûÄã¾õµÃÄÄÀﻹ¿´²»Ã÷°×£¬Ç§Íò²»Òª +¾õµÃ²»ºÃÒâ˼£¬ÄÇÒ»¶¨ÊÇÎÒÃÇûÓÐдºÃ¡£ÎÒÃÇÓÀÔ¶»¶ÓÄãµÄ²»ÂúºÍ±§Ô¹¡£ -* ¸´ÖÆ£¨ COPYING £© -------------------- +* ·Ò루TRANSLATION£© +--------------------- + +·Ò룺Ëï Ò»½ <sunyijiang@gmail.com> +У¶Ô£ºË®Ä¾ÉçÇø£¨www.newsmth.net£©Emacs °åÖÚ¶àÍøÓÑ + +Emacs ¿ìËÙÖ¸ÄÏ£¨Tutorial£©ÔçÓÐÁ½¸öÁõÕѺêµÄÖÐÎÄÒë±¾£¬·±¼ò¸÷Ò»¡£Æä¼òÌå°æ±¾ +£¨TUTORIAL.cn£©»ù±¾ÓÉ·±Ìå°æ±¾£¨TUTORIAL.zh£©¾´ÊÓïÌæ»»¶øµÃ¡£È»¶ø·±¼òÖÐÎÄ +²»½öÔÚÓôÊÏ°¹ßÉÏÓÐËù²»Í¬£¬¸üÓÐÖî¶à±í´ï·½Ê½ºÍ¾ä·¨·½ÃæµÄ²îÒì¡£Òò´ËÒ»Ö±ÒÔÀ´ +ÔĶÁ TUTORIAL.cn ¶¼ÂÔ¾õ»ÞɬºÍÉúÓ²¡£Õâ´ÎÖØзÒë TUTORIAL.cn µÄ¶¯»úÕýÊÇÔ´ +ÓÚÕâÖÖÌåÑ飬ϣÍûÎÒÃǵŤ×÷Äܹ»Èñ¾ÎĸüºÃµÄ·¢»ÓÆäÓ¦ÓеÄ×÷Óá£TUTORIAL.zh +µÄÒëÎÄÖÊÁ¿ºÜ¸ß£¬ÔÚ·Òë¹ý³ÌÖиøÓè¹ýÎÒÃǺܶà½è¼øºÍ²Î¿¼£¬Ôڴ˶ÔÁõÕѺêµÄ¹¤×÷ +±íʾ¸Ðл¡£ + +·Òë¹ý³ÌÖÐ×î´óµÄÌôսĪ¹ýÓÚÊõÓïÒë´ÊµÄÑ¡ÔñÁË¡£¾¹ýˮľÉçÇø Emacs °åÈÈÐÄÍø +ÓÑС·¶Î§ÄÚµÄÌÖÂÛ£¬ÎÒÃÇÑ¡ÔñÁËÏÖÔÚµÄÒë·¨¡£Óû§µÄ¹ã·º²ÎÓëÊÇ×ÔÓÉÈí¼þÉúÃüÁ¦µÄ +ԴȪ£¬ËùÒÔÈç¹ûÄãÓÐÈκν¨Òé¡¢¿±Îó»ò¸üºÃµÄÏë·¨£¬ÇëÓÃÄãϲ»¶µÄ·½Ê½ÏòÎÒÃÇÌá³ö +¡£Äã¿ÉÒÔÖ±½Ó¸øÎÒ·¢µç×ÓÓʼþ£¬Ò²¿ÉÒԷŵ½ GNU Emacs µÄ¿ª·¢ÓʼþÁбí»òÕßˮľ +ÉçÇøµÄ Emacs °åÉϽøÐÐÌÖÂÛ¡£ÏÂÃæÁгöÖ÷ÒªÊõÓïµÄÒë´Ê¶ÔÕÕ£¬²¢¸ø³ö×¢ÊÍ˵Ã÷£º -±¾¿ìËÙÖ¸ÄÏÑØÏ®×Ô¾ßÓÐÓƾÃÀúÊ·µÄ Emacs ¿ìËÙÖ¸ÄÏ£¬ÓÉ Stuart Cracraft ΪÁË -ÔʼµÄ Emacs Ëù׫дµÄ°æ±¾¿ªÊ¼¡£ + command ÃüÁî + cursor ¹â±ê + scrolling ¹ö¶¯ + numeric argument Êý×Ö²ÎÊý + window ´°¸ñ [1] + insert ²åÈë + delete ɾ³ý [2] + kill ÒƳý [2] + yank ÕÙ»Ø [2] + undo ³·Ïú + file Îļþ + buffer »º³åÇø + minibuffer С»º³å + echo area »ØÏÔÇø + mode line ״̬À¸ + search ËÑË÷ + incremental search ½¥½øʽËÑË÷ [3] + +[1] ¡°window¡±Ò»´ÊÔÚ¼ÆËã»úÏà¹ØµÄÁìÓòÒ»°ã¶¼±»ÒëΪ¡°´°¿Ú¡±¡£µ«ÊÇÔÚ Emacs + ÖУ¬»¹ÓÐÒ»¸ö¡°frame¡±µÄ¸ÅÄî¡£ÔÚ±»¹ã·ºÊ¹ÓÃµÄ X ´°¿ÚϵͳºÍ΢ÈíµÄÊÓ´° + £¨Windows£©ÏµÁвÙ×÷ϵͳÖУ¬Emacs µÄÒ»¸ö¡°frame¡±¾ÍÊÇÒ»¸ö¡°´°¿Ú¡±£¬Òò + ´Ë°Ñ Emacs Öеġ°frame¡±Òë³É¡°´°¿Ú¡±¸ü¼Ó·ûºÏͨ³£µÄÏ°¹ß¡£ÕâÑù£¬Emacs + Öеġ°window¡±¾ÍÖ»ÄÜÒë³É¡°´°¸ñ¡±ÁË¡£ÎÒÃÇÈÏΪ Emacs ÖÐ window ºÍ + frame µÄ¹ØϵÓô°¸ñºÍ´°¿ÚÀ´Àà±ÈÊÇÊ®·ÖÐÎÏóµÄ¡£ -Õâ¸ö°æ±¾µÄ¿ìËÙÖ¸ÄÏºÍ GNU Emacs Ò»Ñù¶¼ÊÇ°æȨ»¯µÄ£¬²¢ÇÒÔÊÐíÔÚijЩÌõ¼þÏ -É¢²¼Æ俽±´£º +[2] ¶ÔÓÚ¡°delete¡±ºÍ¡°kill¡±µÄÇø±ð£¬ÕýÎÄÒѾ¸ø³öÁËÏêϸµÄ˵Ã÷¡£¡°É¾³ý¡±ºÍ + ¡°ÒƳý¡±Ïà±È½ÏÆðÀ´£¬Ç°Õ߸ü¶àµØÒþº¬×Å¡°ÆÆ»µ¡±ºÍ¡°²»¿É»Ö¸´¡±µÄÒâ˼£¬¶ø + ºóÕ߸ü¶àµØÒþº¬×Å¡°±»×ªÒÆ¡±ºÍ¡°¿É»Ö¸´¡±µÄÒâ˼¡£Òò´Ë·Ö±ðÑ¡ÔñËüÃÇ×÷ΪÉÏ + ÊöÁ½´ÊµÄÒë´Ê£¬Ï£ÍûÄܹ»ÌåÏÖ³öÇø±ð¡£¡°yank¡±ÔÚÖÐÎÄÎĵµÖÐÏÊÓжÔÓ¦Òë´Ê³ö + ÏÖ£¬·ÒëµÄÀ§Äѽϴ󡣾¿Æä±¾ÒâÊÇ£º¡°a strong sudden pull¡±£¨²Î¼ûΤÊÏ´Ê + µä£©£¬¼´¡°ÃÍÈ»À»Ø¡±¡£ÔÚÔÎĵµÖÐ yank ±»ÒýÉêΪ¡°½«ÏÈÇ°ÒƳýµÄ¶«Î÷ÔÙÒÆ + »ØÀ´¡±Õâ¸öÒâ˼£¬ËùÒÔÎÒÃÇÑ¡ÔñÁË¡°Õٻء±Ò»´ÊÓëÆä¶ÔÓ¦¡£ + +[3] ¡°incremental¡±Ò»´ÊÔÚ¼ÆËã»úÖø×÷Öй㷺³öÏÖ£¬±»¹ã·º½ÓÊܵÄÖÐÎÄÒë´ÊÓÐÁ½ + ¸ö£º¡°ÔöÁ¿µÄ¡±ºÍ¡°½¥½øµÄ¡±¡£¡°incremental search¡±·Òë³É¡°ÔöÁ¿Ê½ËÑË÷ + ¡±»òÕß¡°½¥½øʽËÑË÷¡±¶¼½²µÄͨ£¬ÇÒ¶¼Óи÷×ÔµÄÐÎÏóÖ®´¦¡£»¹ÊDzο¼ÔÎĶÔÆä + µÄ½âÊÍ£º¡°... means that the search happens while you type in the + string to search for¡±¡£Òâ˼ÊÇÖ®ËùÒÔ³ÆÆäΪ¡°incremental search¡±£¬ÊÇ + ÒòΪ¡°ÔÚÄãÊäÈëËÑË÷×Ö·û´®µÄ¹ý³ÌÖУ¬ËÑË÷¾ÍÒѾÔÚ½øÐÐÁË¡±¡£ÎÒÃÇÈÏΪ¡°Ôö + Á¿µÄ¡±¸ü¼ÓÇ¿µ÷ÔÚÏÖÓлù´¡Éϵı仯£¨±ÈÈç¡°ÔöÁ¿±¸·Ý¡±£¬¡°ÔöÁ¿±àÒ롱£©£» + ¶ø¡°½¥½øµÄ¡±¸ü¼ÓÇ¿µ÷¹ý³ÌµÄÖð½¥·¢Õ¹£¬Ò²¸ü¼Ó·ûºÏÔÎĵÄÒâ˼¡£Òò´ËÎÒÃÇÑ¡ + Ôñ½«¡°incremental search¡±Òë×÷¡°½¥½øʽËÑË÷¡±¡£ + + +* °æȨÉùÃ÷£¨COPYING£© +--------------------- + +This tutorial descends from a long line of Emacs tutorials +starting with the one written by Stuart Cracraft for the original Emacs. + +This version of the tutorial, like GNU Emacs, is copyrighted, and +comes with permission to distribute copies on certain conditions: Copyright (C) 1985, 1996, 1998, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -Chinese Translation by Chao-Hong Liu (2002, 2003) Permission is granted to anyone to make or distribute verbatim copies of this document as received, in any medium, provided that the @@ -1059,27 +991,37 @@ and that the distributor grants the recipient permission for further redistribution as permitted by this notice. - ±¾ÎÄÔÊÐíÔÚ²»±ä¸üÎĵµÄÚÈݵÄÇ°ÌáÏ¿¯µÇÔÚÈκÎÐÎʽµÄýÌåÖУ¬ - µ«Ðè±£Áô°æȨÉùÃ÷ÒÔ¼°Ðí¿ÉÉùÃ÷£¬ - É¢²¼ÕßÒ²±ØÐë¸øÓè½ÓÊÜÕßÈçͬ´ËÉùÃ÷ËùÔÊÐíµÄ£¬½øÒ»²½É¢²¼µÄÐí¿É¡£ - ¡¾±¾¶ÎÒëÎÄÌṩ¶ÁÕß×÷Ϊ²Î¿¼ÒÔ°ïÖúÀí½â£¬Êµ¼ÊЧÁ¦ÒÔÓ¢Îı¾Îª×¼¡£¡¿ - Permission is granted to distribute modified versions of this document, or of portions of it, under the above conditions, provided also that they carry prominent notices stating who last altered them. - ±¾ÎÄÔÊÐíÔÚÓëÉÏÊöÏàͬµÄÌõ¼þÏ£¬É¢²¼Ð޸ĺóµÄ°æ±¾£¬»òÊÇÆäÖеÄÒ»²¿·Ý£¬ - µ«ËüÃÇÒ²±ØÐë´øÓÐÏÔÖøµÄ£¬ËµÃ÷ÓÉË×îºó¸ü¶¯ÁËËüµÄÉùÃ÷¡£ - ¡¾Copyleft °æȨ³ýÁËÌṩʹÓÃÕß×ÔÓÉÍ⣬Ҳά»¤Ôʼ×÷Õߣ¬ - ÒÔ¼°ºóÀ´µÄÐÞ¸Ä×÷ÕßµÄÃûÓþȨ£¨ credit £©¡£ - ±¾¶ÎÒëÎÄÌṩ¶ÁÕß×÷Ϊ²Î¿¼ÒÔ°ïÖúÀí½â£¬Êµ¼ÊЧÁ¦ÒÔÓ¢Îı¾Îª×¼¡£¡¿ +The conditions for copying Emacs itself are more complex, but in the +same spirit. Please read the file COPYING and then do give copies of +GNU Emacs to your friends. Help stamp out software obstructionism +("ownership") by using, writing, and sharing free software! + +¡¾ÏÂÃæΪ°æȨÉùÃ÷µÄÒëÎÄ£¬½ö¹©²Î¿¼¡£Êµ¼Ê·¨ÂÉЧÁ¦ÒÔÓ¢ÎÄÔÎÄΪ׼¡£¡¿ + +±¾¿ìËÙÖ¸ÄÏÑØÏ®×ÔÀúÊ·ÓÆ¾ÃµÄ Emacs ¿ìËÙÖ¸ÄÏ£¬¿ÉÉÏËÝÖÁ Stuart Cracraft Ϊ×î +³õµÄ Emacs Ëù×÷µÄ°æ±¾¡£ + +±¾ÆªÎĵµÓë GNU Emacs Ò»ÑùÓµÓаæȨ£¬²¢ÔÊÐíÔÚÏÂÁÐÌõ¼þµÄÔ¼ÊøÏ·¢ÐÐÆ俽±´£º -¸´ÖÆ Emacs ±¾ÉíµÄÌõ¼þ½ÏΪ¸´ÔÓ£¬µ«ÊǾßÓÐÏàͬµÄ¾«Éñ¡£ÇëÔĶÁ COPYING Õâ¸ö -µµ°¸£¬²¢ÇÒȷʵ¸øÓèÄúµÄÅóÓÑ GNU Emacs µÄ¿½±´¡£Çë¾ÓÉ¡¸Ê¹Óá¢×«Ð´¡¢ÒÔ¼° -·ÖÏí×ÔÓÉÈí¼þ¡¹À´°ïÖúÏû³ýÈí¼þÕÏ°Ö÷Ò壨ӵÓÐȨ£©£¡ + Copyright (C) 1985, 1996, 1998, 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. + + ±¾ÎĵµÔÊÐíÔÚ²»±ä¸üÎĵµÄÚÈݵÄÇé¿öÏÂÓÉÈκÎÈË·¢²¼ÔÚÈκÎýÌåÉÏ£¬Í¬Ê±±ØÐë + ÍêÕû±£Áô°æȨºÍÐí¿ÉÉùÃ÷£¬ÇÒÐè¸øÓèÊÜÖÚÓë·¢ÐÐÕßÍêÈ«ÏàͬµÄ¡¢Èç±¾ÉùÃ÷ËùÔÊ + ÐíµÄÔٴη¢Ðб¾ÎĵµµÄȨÀû¡£ -;;; DO NOT PUT THIS ON ZHS OR ZHT FILE... + ±¾ÉùÃ÷ÔÊÐíÔÚÓëÉÏÊöÌõ¼þÏàͬµÄÇé¿öÏ·¢²¼¾¹ýÐ޸ĵÄÈ«²¿»ò²¿·ÖÎĵµ£¬Í¬Ê± + ±ØÐ븽´øÏÔÒªµÄÎÄ×ÖÒÔÉêÃ÷ÎĵµµÄ×îºóÐÞ¸ÄÕß¡£ + +Emacs ×ÔÉíµÄ°æȨÎÊÌâËä±È±¾ÎĵµÒª¸´ÔÓһЩ£¬µ«Ò²»ùÓÚÏàͬµÄ¾«Éñ¡£¾´ÇëÔĶÁÎÄ +¼þ¡°COPYING¡±£¬È»ºóÏòÄãµÄÅóÓÑÃÇ·Ö·¢ GNU Emacs ¿½±´¡£ÈÃÎÒÃÇÒÔʹÓᢱàдºÍ +·ÖÏí×ÔÓÉÈí¼þµÄʵ¼ÊÐж¯À´¹²Í¬ìî³ýÈí¼þÕÏ°Ö÷Ò壨ËùνµÄ¡°ËùÓÐȨ¡±£©£¡ + ;;; Local Variables: ;;; coding: chinese-iso-8bit ;;; End:
--- a/etc/TUTORIAL.translators Thu Feb 16 16:18:54 2006 +0000 +++ b/etc/TUTORIAL.translators Mon Feb 20 16:30:15 2006 +0000 @@ -6,8 +6,8 @@ Maintainer: Ognyan Kulev <ogi@fmi.uni-sofia.bg> * TUTORIAL.cn: -Author: Chao-Hong Liu <chliu@gnu.org> -Maintainer: Chao-Hong Liu <chliu@gnu.org> +Author: Sun Yijiang <sunyijiang@gmail.com> +Maintainer: Sun Yijiang <sunyijiang@gmail.com> * TUTORIAL.cs: Author: Milan Zamazal <pdm@zamazal.org>
--- a/lisp/ChangeLog Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/ChangeLog Mon Feb 20 16:30:15 2006 +0000 @@ -1,3 +1,349 @@ +2006-02-20 Juanma Barranquero <lekktu@gmail.com> + + * buff-menu.el (list-buffers-noselect): Turn also "\n" into a + strech spec so it doesn't display as "^J" on the header line + when `Buffer-menu-use-header-line' is t. + +2006-02-20 Nick Roberts <nickrob@snap.net.nz> + + * speedbar.el (speedbar-make-button): Keep text properties + of string arguments if desired. + + * progmodes/gud.el (gud-speedbar-buttons): Fontify watch + expessions. + + * progmodes/gdb-ui.el (gdb-speedbar-expand-node): Force update + of speedbar. + +2006-02-19 Ryan Yeske <rcyeske@gmail.com> + + * ffap.el (ffap-read-file-or-url): Bind `completion-ignore-case' + to value of `read-file-name-completion-ignore-case'. + +2006-02-19 Chong Yidong <cyd@stupidchicken.com> + + * custom.el (customize-mark-as-set): Push to `user' theme. + + * cus-edit.el (custom-save-variables): Allow unthemed values. + (customize-set-variable): Push setting to `user' theme. + +2006-02-19 Nick Roberts <nickrob@snap.net.nz> + + * progmodes/gud.el: Don't require font-lock as it's now + automatically loaded. + (gud-speedbar-buttons): Replace gdb-var-changed with + gdb-force-update. + + * progmodes/gdb-ui.el (gdb-force-update): Rename from + gdb-var-changed. + (gdb-post-prompt): Use it. + (gdb-var-create-handler, gdb-var-evaluate-expression-handler) + (gdb-var-update-handler, gdb-var-delete) + (gdb-speedbar-expand-node, gdb-var-list-children-handler-1) + (gdb-var-update-handler-1): Don't set gdb-var-changed, just set + gdb-force-update in gdb-post-prompt. + (gdb-reset): Clear watch expressions from speedbar when quitting. + +2006-02-19 Michael Kifer <kifer@cs.stonybrook.edu> + + * viper-cmd.el (viper-insert-state-post-command-sentinel) + (viper-change-state-to-vi, viper-change-state-to-emacs): + Make aware of cursor coloring in the Emacs state. + (viper-special-read-and-insert-char): Use read-char-exclusive. + (viper-minibuffer-trim-tail): Workaround for fields in minibuffer. + + * viper-init.el (viper-emacs-state-cursor-color): New variable. + + * viper-util.el (viper-save-cursor-color) + (viper-get-saved-cursor-color-in-replace-mode) + (viper-get-saved-cursor-color-in-insert-mode) + (viper-restore-cursor-color): Make aware of the cursor color in Emacs + state. + (viper-get-saved-cursor-color-in-emacs-mode): New function. + + * ediff-diff.el (ediff-ignore-case, ediff-ignore-case-option) + (ediff-ignore-case-option3, ediff-actual-diff-options) + (ediff-actual-diff3-options): New variables to control case sensitivity. + (ediff-make-diff2-buffer, ediff-setup-fine-diff-regions) + (ediff-setup-diff-regions3): Make aware of case-sensitivity. + (ediff-toggle-ignore-case): New function. + (ediff-extract-diffs, ediff-extract-diffs3): Preserve point in buffers. + + * ediff-help.el (ediff-long-help-message-narrow2) + (ediff-long-help-message-compare2, ediff-long-help-message-compare3) + (ediff-long-help-message-word-mode): Add ignore-case command. + (ediff-help-for-quick-help): Add ignore-case command. + + * ediff-merg.el: Move provide to the end. + + * ediff-ptch.el: Move provide to the end. + + * ediff-wind.el: Move provide to the end. + + * ediff-mult.el: Move provide to the end. + (ediff-set-meta-overlay): Enable follow-link. + + * ediff.el: Move provide to the end. + Break recursive load cycle in eval-when-compile. + (ediff-patch-buffer): Better heuristics. + + * ediff-util.el: Move provide to the end. + Break recursive load cycle in eval-when-compile. + (ediff-setup-keymap): Add binding for #c. Replace some defsubsts with + defuns. + (ediff-submit-report): Pass the values of ediff-diff3-program, + ediff-diff3-options. + +2006-02-19 Juanma Barranquero <lekktu@gmail.com> + + * help-fns.el (help-do-arg-highlight): Recognize also ARG- followed by + the opening bracket of the following bracketing pairs: {}, [], (), <>, + `' (for example, in the docstring of `windmove-default-keybindings'). + +2006-02-19 Nick Roberts <nickrob@snap.net.nz> + + * progmodes/gud.el (gud-speedbar-buttons): Update properly for + shadow face. Don't provide binding to edit variable when it is + out of scope. + + * progmodes/gdb-ui.el (gdb-var-evaluate-expression-handler) + (gdb-var-update-handler): Detect out of scope variables with pre + GDB 6.4 too. + (gdb-post-prompt): Revert changet 2006-02-17 (force update). + Reset status of variable objects to nil in update handlers. + (gdb-var-update-handler-1): Detect when a variable object comes + in scope. setcar on var changes gdb-var-list directly. + +2006-02-17 Juri Linkov <juri@jurta.org> + + * ffap.el (ffap) <defface>: Add explicit face declaration. + (ffap-highlight): Use face `ffap' directly instead of checking + for its existence. + + * icomplete.el (icomplete-get-keys): Use `t' for the second arg + `visible-ok' of `other-buffer' to find the right original buffer. + + * info.el (Info-search): Skip `Local Variables' node. + +2006-02-17 Juri Linkov <juri@jurta.org> + + * info.el (Info-find-file): Check for symbols `apropos', `history', + `toc' in the input filename, and return these symbols as is. + (Info-find-node-2): Set Info-current-file to symbols `apropos', + `history', `toc' instead of strings. + (Info-set-mode-line): For non-string Info-current-file use the + symbol's name inside **. + (Info-isearch-push-state): Add quote before Info-current-file and + Info-current-node. + (Info-isearch-pop-state): Use `equal' instead of `string='. + (Info-extract-pointer, Info-following-node-name): Use + `match-string-no-properties' instead of `match-string'. + (Info-up): Check `old-file' for `stringp'. + (Info-history): Use `equal' instead of `string-equal'. + Check `file' for `stringp'. + (Info-history): Use symbol `history' instead of string as first arg + of `Info-find-node'. + (Info-toc): Check `Info-current-file' for `stringp'. Use symbol + `toc' instead of string. + (Info-extract-menu-node-name): Use `buffer-substring-no-properties' + instead of `buffer-substring', and `match-string-no-properties' + instead of `match-string'. + (Info-index-nodes): Check for symbols `apropos', `history', `toc' + instead of strings. + (info-apropos): Use `Info-find-node' instead of `Info-goto-node'. + Use symbol `apropos' instead of string. + (Info-copy-current-node-name): Check `Info-current-file' for + `stringp' and construct a command with `Info-find-node' from it. + (Info-fontify-node): Use `match-string-no-properties' instead of + `match-string' and check file names for `stringp'. + (Info-desktop-buffer-misc-data): Check for symbols `apropos', + `history', `toc' instead of strings. + +2006-02-17 Chong Yidong <cyd@stupidchicken.com> + + * files.el: Rearrange functions and variables in the file local + variables section. + +2006-02-17 Reiner Steib <Reiner.Steib@gmx.de> + + * files.el: Add truncate-lines, ispell-check-comments and + ispell-local-dictionary as safe local variables. + +2006-02-18 Nick Roberts <nickrob@snap.net.nz> + + * progmodes/gud.el (gud-speedbar-buttons): Use shadow face for + out of scope variables. + (gud-speedbar-buttons): Use unless. + + * progmodes/gdb-ui.el (gdb-var-list): Update doc string. + (gdb-init-1, gdb-var-changed): Set gdb-var-changed to t initially. + (gdb-show-changed-values): Also use for out of scope variables. + (gdb-var-update-handler-1): Note if variable goes out of scope. + +2006-02-17 Ryan Yeske <rcyeske@gmail.com> + + * net/rcirc.el (rcirc-connect): Make all arguments optional, and + default to global variable values for unsupplied args. + (rcirc-get-buffer-create): Fix bug with setting the target. + (rcirc-any-buffer): Rename from rcirc-get-any-buffer, and include + test for rcirc-always-use-server-buffer-flag here. + (rcirc-response-formats): Add %N, which is a facified nick. %n + uses the default face. Change the ACTION format string. If the + "nick" is the server, don't print anything for that field. + Comment fixes. + (rcirc-target-buffer): Don't test + rcirc-always-use-server-buffer-flag here. + (rcirc-print): Squeeze extra spaces out of the text before message. + (rcirc-put-nick-channel): Strip potential "@" char from nick + before adding them to nick table. + (rcirc-url-regexp): Improve to match address like "foo.com". + +2006-02-17 Eli Zaretskii <eliz@gnu.org> + + * allout.el (allout-hidden-p): Move this defsubst before + allout-overlay-interior-modification-handler, where it is first + used. + +2006-02-17 Ken Manheimer <ken.manheimer@gmail.com> + + * allout.el: Use allout invisible-text overlays instead of + selective display for concealed text. Also, lots of general + cleanup, and improved compatibility code. + + (allout-version) Incremented, corrected, revised, and refined + module commentary. + + (provide 'allout): Moved to the bottom, added a require of overlay. + + (allout-encrypt-unencrypted-on-saves): Defaults to t instead of + `except-current'. + (allout-write-file-hook-handler): Minimize delay. + (count-trailing-whitespace-region): New function so + auto-encryption of current topic can resituate cursor exactly. + PGP/GPG encryption trims trailing whitespace from lines, which + must be accounted for across encryption then decryption. + + (allout-command-prefix): Now defaults to "\C-c<space>" rather than + just plain "\C-c", to avoid intruding on user's keybinding space. + + (allout-toggle-current-subtree-encryption): Pass along fetch-pass + parameter, so user request to provide a new password is done. + + (allout-outside-normal-auto-fill-function, allout-auto-fill): + Refined mechanism for auto-filling behavior while in allout mode. + + (allout-mode): Explicitly specify the mode map in the docstring. + Clarify provision for various write-file hook var names. + Adjusted for invisible-text overlays instead of selective-display. + + (allout-depth): Really return 0 if not within any topic. This + rectifies `allout-beginning-of-level' and sequence numbering + errors that occur when cutting and pasting numbered topics. + Changed from a in-line subst to a regular function, as well. + + (allout-pre-next-prefix): Renamed from allout-pre-next-preface. + + (allout-end-of-subtree, allout-end-of-subtree) + (allout-end-of-entry, allout-end-of-current-heading) + (allout-next-visible-heading, allout-open-topic, allout-show-entry) + (allout-show-children, allout-show-to-offshoot) + (allout-hide-current-entry, allout-show-current-entry): Rectified + handling of trailing blank lines between items. + + (allout-line-boundary-regexp, set-allout-regexp, allout-depth) + (allout-current-depth, allout-unprotected, allout-hidden-p) + (allout-on-current-heading-p, allout-listify-exposed) + (allout-chart-subtree, allout-goto-prefix) + (allout-back-to-current-heading, allout-get-body-text) + (allout-snug-back, allout-flag-current-subtree, allout-show-all) + (allout-hide-region-body, allout-toggle-subtree-encryption) + (allout-encrypt-string, allout-encrypted-key-info) + (allout-next-topic-pending-encryption, allout-encrypt-decrypted) + (allout-file-vars-section-data): Adjusted for use with + invisible-text overlays instead of selective-display. + + (allout-kill-line, allout-kill-topic, allout-yank-processing): + Reworked for use with invisible text overlays. + + (allout-current-topic-collapsed-p): New function. + + (allout-hide-current-subtree): Use allout-current-topic-collapsed-p + to know when to close the containing topic. + + (allout-pre-command-business, allout-post-command-business): + Simplify undo-batching and dynamic isearch exposure. + + (allout-set-overlay-category): New for invisible-text overlays. + Sets properties of allout-overlay-category, used by + allout-flag-region to set invisible-text overlay properties. + (allout-get-invisibility-overlay): Get the first qualifying + invisibility overlay, so we can find the extent of it. + (allout-back-to-visible-text): Get to just before the beginnining + of the current invisibility overlay, if any. + + (allout-overlay-insert-in-front-handler) + (allout-overlay-interior-modification-handler) + (allout-before-change-handler, allout-isearch-end-handler): New + functions to handle extraordinary actions affecting concealed + text. + + (allout-flag-region): Use overlays instead of selective-display + for invisible text - by inheritence from the properties of + allout-overlay-category in mainline Emacs, and applied + property-by-property in XEmacs, some recent versions of which + don't inherit the properties from the category. Provisions to + respond to concealed-text edits simplified drastically. + + (allout-isearch-rectification, allout-isearch-was-font-lock) + (allout-isearch-expose, allout-enwrap-isearch) + (allout-isearch-abort, allout-pre-was-isearching) + (allout-isearch-prior-pos, allout-isearch-did-quit) + (allout-isearch-dynamic-expose) + (allout-hide-current-entry-completely): Functions deleted. + + (allout-undo-aggregation): Explicit undo aggregation no longer + necessary due to transition away from selective-display. + + (set-allout-regexp, allout-up-current-level) + (allout-next-visible-heading, allout-forward-current-level) + (allout-open-topic, allout-reindent-body, allout-rebullet-topic) + (allout-kill-line, allout-yank-processing, allout-show-children) + (allout-expose-topic, allout-old-expose-topic) + (allout-listify-exposed, allout-insert-latex-header) + (allout-toggle-subtree-encryption, allout-encrypt-string) + (remove-from-invisibility-spec, allout-hide-current-subtree): + Ditched unused variables. + +2006-02-17 Agustin Martin <agustin.martin@hispalinux.es> + + * textmodes/ispell.el (ispell-change-dictionary): Call + ispell-buffer-local-dict instead of + ispell-accept-buffer-local-defs. + (ispell-local-dictionary-alist): Accept as valid any coding-system + supported by Emacs. + (ispell-dictionary-alist-3): Esperanto dictionary's coding system + changed to iso-8859-3. + +2006-02-17 Nick Roberts <nickrob@snap.net.nz> + + * speedbar.el (speedbar-frame-width): Make an inline function + instead of a macro. Use frame-width. + (speedbar-try-completion, speedbar-update-contents) + (speedbar-timer-fn): Use consp. + (speedbar-update-localized-contents): Try to preserve point. + + * progmodes/gdb-ui.el (gdba, gdb-var-list): Improve doc strings. + (menu): Re-order menu items. + (gdb-var-update-regexp, gdb-var-update-regexp-1): Match "in_scope" + field. + (gdb-var-update-handler-1): Use it for GDB 6.4+. + (gdb-post-prompt): Speed things by not forcing update. + +2006-02-16 Chong Yidong <cyd@stupidchicken.com> + + * wid-edit.el (widget-button-click): For mouse-1, cancel button + press and perform default action if we get a mouse movement event. + 2006-02-16 Juanma Barranquero <lekktu@gmail.com> * calendar/icalendar.el (icalendar--get-event-property)
--- a/lisp/allout.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/allout.el Mon Feb 20 16:30:15 2006 +0000 @@ -1,12 +1,12 @@ ;;; allout.el --- extensive outline mode for use alone and with other modes ;; Copyright (C) 1992, 1993, 1994, 2001, 2002, 2003, 2004, -;; 2005, 2006 Free Software Foundation, Inc. +;; 2005 Free Software Foundation, Inc. ;; Author: Ken Manheimer <ken dot manheimer at gmail dot com> ;; Maintainer: Ken Manheimer <ken dot manheimer at gmail dot com> ;; Created: Dec 1991 - first release to usenet -;; Version: 2.1 +;; Version: 2.2 ;; Keywords: outlines wp languages ;; This file is part of GNU Emacs. @@ -28,36 +28,39 @@ ;;; Commentary: -;; Allout outline mode provides extensive outline formatting and -;; and manipulation beyond standard emacs outline mode. It provides -;; for structured editing of outlines, as well as navigation and -;; exposure. It also provides for syntax-sensitive text like -;; programming languages. (For an example, see the allout code -;; itself, which is organized in ;; an outline framework.) -;; -;; Some features: +;; Allout outline minor mode provides extensive outline formatting and +;; and manipulation beyond standard emacs outline mode. Some features: ;; -;; - classic outline-mode topic-oriented navigation and exposure adjustment -;; - topic-oriented editing including coherent topic and subtopic -;; creation, promotion, demotion, cut/paste across depths, etc -;; - incremental search with dynamic exposure and reconcealment of text -;; - customizable bullet format enbles programming-language specific -;; outlining, for ultimate code-folding editing. (allout code itself is -;; formatted as an outline - do ESC-x eval-current-buffer in allout.el -;; to try it out.) -;; - configurable per-file initial exposure settings -;; - symmetric-key and key-pair topic encryption, plus symmetric passphrase +;; - Classic outline-mode topic-oriented navigation and exposure adjustment +;; - Topic-oriented editing including coherent topic and subtopic +;; creation, promotion, demotion, cut/paste across depths, etc. +;; - Incremental search with dynamic exposure and reconcealment of text +;; - Customizable bullet format - enables programming-language specific +;; outlining, for code-folding editing. (Allout code itself is to try it; +;; formatted as an outline - do ESC-x eval-current-buffer in allout.el; but +;; emacs local file variables need to be enabled when the +;; file was visited - see `enable-local-variables'.) +;; - Configurable per-file initial exposure settings +;; - Symmetric-key and key-pair topic encryption, plus symmetric passphrase ;; mnemonic support, with verification against an established passphrase ;; (using a stashed encrypted dummy string) and user-supplied hint -;; maintenance. (see allout-toggle-current-subtree-encryption docstring.) -;; - automatic topic-number maintenance -;; - "hot-spot" operation, for single-keystroke maneuvering and +;; maintenance. (See allout-toggle-current-subtree-encryption docstring.) +;; - Automatic topic-number maintenance +;; - "Hot-spot" operation, for single-keystroke maneuvering and ;; exposure control (see the allout-mode docstring) -;; - easy rendering of exposed portions into numbered, latex, indented, etc +;; - Easy rendering of exposed portions into numbered, latex, indented, etc ;; outline styles +;; - Careful attention to whitespace - enabling blank lines between items +;; and maintenance of hanging indentation (in paragraph auto-fill and +;; across topic promotion and demotion) of topic bodies consistent with +;; indentation of their topic header. ;; ;; and more. ;; +;; See the `allout-mode' function's docstring for an introduction to the +;; mode. The development version and helpful notes are available at +;; http://myriadicity.net/Sundry/EmacsAllout . +;; ;; The outline menubar additions provide quick reference to many of ;; the features, and see the docstring of the variable `allout-init' ;; for instructions on priming your emacs session for automatic @@ -75,20 +78,18 @@ ;;; Code: -;;;_* Provide -;(provide 'outline) -(provide 'allout) - ;;;_* Dependency autoloads +(require 'overlay) (eval-when-compile (progn (require 'pgg) (require 'pgg-gpg) - (fset 'allout-real-isearch-abort - (symbol-function 'isearch-abort)) + (require 'overlay) )) (autoload 'pgg-gpg-symmetric-key-p "pgg-gpg" "True if decoded armor MESSAGE-KEYS has symmetric encryption indicator.") ;;;_* USER CUSTOMIZATION VARIABLES: + +;;;_ > defgroup allout (defgroup allout nil "Extensive outline mode for use alone and with other modes." :prefix "allout-" @@ -151,7 +152,7 @@ will, modulo the above-mentioned conditions, cause the mode to be activated when the file is visited, followed by the equivalent of `\(allout-expose-topic 0 : -1 -1 0)'. \(This is the layout used for -the allout.el, itself.) +the allout.el source file.) Also, allout's mode-specific provisions will make topic prefixes default to the comment-start string, if any, of the language of the file. This @@ -450,7 +451,7 @@ :group 'allout) (make-variable-buffer-local 'allout-passphrase-hint-handling) ;;;_ = allout-encrypt-unencrypted-on-saves -(defcustom allout-encrypt-unencrypted-on-saves 'except-current +(defcustom allout-encrypt-unencrypted-on-saves t "*When saving, should topics pending encryption be encrypted? The idea is to prevent file-system exposure of any un-encrypted stuff, and @@ -485,8 +486,11 @@ ;;;_ + Miscellaneous customization ;;;_ = allout-command-prefix -(defcustom allout-command-prefix "\C-c" - "*Key sequence to be used as prefix for outline mode command key bindings." +(defcustom allout-command-prefix "\C-c " + "*Key sequence to be used as prefix for outline mode command key bindings. + +Default is '\C-c<space>'; just '\C-c' is more short-and-sweet, if you're +willing to let allout use a bunch of \C-c keybindings." :type 'string :group 'allout) @@ -538,23 +542,12 @@ ("=t" allout-latexify-exposed) ("=p" allout-flatten-exposed-to-buffer))) -;;;_ = allout-isearch-dynamic-expose -(defcustom allout-isearch-dynamic-expose t - "*Non-nil enable dynamic exposure of hidden incremental-search -targets as they're encountered." - :type 'boolean - :group 'allout) -(make-variable-buffer-local 'allout-isearch-dynamic-expose) - ;;;_ = allout-use-hanging-indents (defcustom allout-use-hanging-indents t "*If non-nil, topic body text auto-indent defaults to indent of the header. Ie, it is indented to be just past the header prefix. This is relevant mostly for use with indented-text-mode, or other situations -where auto-fill occurs. - -\[This feature no longer depends in any way on the `filladapt.el' -lisp-archive package.\]" +where auto-fill occurs." :type 'boolean :group 'allout) (make-variable-buffer-local 'allout-use-hanging-indents) @@ -597,7 +590,7 @@ ;;;_ #1 Internal Outline Formatting and Configuration ;;;_ : Version ;;;_ = allout-version -(defvar allout-version "2.1" +(defvar allout-version "2.2" "Version of currently loaded outline package. \(allout.el)") ;;;_ > allout-version (defun allout-version (&optional here) @@ -636,9 +629,9 @@ (defvar allout-line-boundary-regexp () "`allout-regexp' with outline style beginning-of-line anchor. -\(Ie, C-j, *or* C-m, for prefixes of hidden topics). This is properly -set when `allout-regexp' is produced by `set-allout-regexp', so -that (match-beginning 2) and (match-end 2) delimit the prefix.") +This is properly set when `allout-regexp' is produced by +`set-allout-regexp', so that (match-beginning 2) and (match-end +2) delimit the prefix.") (make-variable-buffer-local 'allout-line-boundary-regexp) ;;;_ = allout-bob-regexp (defvar allout-bob-regexp () @@ -753,11 +746,9 @@ cur-string cur-len cur-char - cur-char-string - index - new-string) + index) (while strings - (setq new-string "") (setq index 0) + (setq index 0) (setq cur-len (length (setq cur-string (symbol-value (car strings))))) (while (< index cur-len) (setq cur-char (aref cur-string index)) @@ -788,7 +779,7 @@ allout-primary-bullet "+\\|\^l")) (setq allout-line-boundary-regexp - (concat "\\([\n\r]\\)\\(" allout-regexp "\\)")) + (concat "\\(\n\\)\\(" allout-regexp "\\)")) (setq allout-bob-regexp (concat "\\(\\`\\)\\(" allout-regexp "\\)")) ) @@ -955,42 +946,28 @@ (setq allout-mode-prior-settings rebuild))))) ) ;;;_ : Mode-specific incidentals -;;;_ = allout-pre-was-isearching nil -(defvar allout-pre-was-isearching nil - "Cue for isearch-dynamic-exposure mechanism, implemented in -allout-pre- and -post-command-hooks.") -(make-variable-buffer-local 'allout-pre-was-isearching) -;;;_ = allout-isearch-prior-pos nil -(defvar allout-isearch-prior-pos nil - "Cue for isearch-dynamic-exposure tracking, used by -`allout-isearch-expose'.") -(make-variable-buffer-local 'allout-isearch-prior-pos) -;;;_ = allout-isearch-did-quit -(defvar allout-isearch-did-quit nil - "Distinguishes isearch conclusion and cancellation. - -Maintained by allout-isearch-abort \(which is wrapped around the real -isearch-abort), and monitored by allout-isearch-expose for action.") -(make-variable-buffer-local 'allout-isearch-did-quit) ;;;_ > allout-unprotected (expr) (defmacro allout-unprotected (expr) - "Enable internal outline operations to alter read-only text." - `(let ((was-inhibit-r-o inhibit-read-only)) - (unwind-protect - (progn - (setq inhibit-read-only t) - ,expr) - (setq inhibit-read-only was-inhibit-r-o) - ) - ) - ) -;;;_ = allout-undo-aggregation -(defvar allout-undo-aggregation 30 - "Amount of successive self-insert actions to bunch together per undo. - -This is purely a kludge variable, regulating the compensation for a bug in -the way that `before-change-functions' and undo interact.") -(make-variable-buffer-local 'allout-undo-aggregation) + "Enable internal outline operations to alter invisible text." + `(let ((inhibit-read-only t)) + ,expr)) +;;;_ = allout-mode-hook +(defvar allout-mode-hook nil + "*Hook that's run when allout mode starts.") +;;;_ = allout-overlay-category +(defvar allout-overlay-category nil + "Symbol for use in allout invisible-text overlays as the category.") +;;;_ = allout-view-change-hook +(defvar allout-view-change-hook nil + "*Hook that's run after allout outline visibility changes.") + +;;;_ = allout-outside-normal-auto-fill-function +(defvar allout-outside-normal-auto-fill-function nil + "Value of normal-auto-fill-function outside of allout mode. + +Used by allout-auto-fill to do the mandated normal-auto-fill-function +wrapped within allout's automatic fill-prefix setting.") +(make-variable-buffer-local 'allout-outside-normal-auto-fill-function) ;;;_ = file-var-bug hack (defvar allout-v18/19-file-var-hack nil "Horrible hack used to prevent invalid multiple triggering of outline @@ -1059,7 +1036,7 @@ (allout-next-topic-pending-encryption except-mark)) (progn (message "auto-encrypting pending topics") - (sit-for 2) + (sit-for 0) (condition-case failure (setq allout-after-save-decrypt (allout-encrypt-decrypted except-mark)) @@ -1184,7 +1161,6 @@ ((message "Outline mode auto-activation and -layout enabled.") 'full))))))) - ;;;_ > allout-setup-menubar () (defun allout-setup-menubar () "Populate the current buffer's menubar with `allout-mode' stuff." @@ -1197,12 +1173,37 @@ (setq cur (car menus) menus (cdr menus)) (easy-menu-add cur)))) +;;;_ > allout-set-overlay-category +(defun allout-set-overlay-category () + "Set the properties of the allout invisible-text overlay." + (setplist 'allout-overlay-category nil) + (put 'allout-overlay-category 'invisible 'allout) + (put 'allout-overlay-category 'evaporate t) + ;; XXX We use isearch-open-invisible *and* isearch-mode-end-hook. The + ;; latter would be sufficient, but it seems that a separate behavior - + ;; the _transient_ opening of invisible text during isearch - is keyed to + ;; presence of the isearch-open-invisible property - even though this + ;; property controls the isearch _arrival_ behavior. This is the case at + ;; least in emacs 21, 22.0, and xemacs 21.4. + (put 'allout-overlay-category 'isearch-open-invisible + 'allout-isearch-end-handler) + (if (featurep 'xemacs) + (put 'allout-overlay-category 'start-open t) + (put 'allout-overlay-category 'insert-in-front-hooks + '(allout-overlay-insert-in-front-handler))) + (if (featurep 'xemacs) + (progn (make-variable-buffer-local 'before-change-functions) + (add-hook 'before-change-functions + 'allout-before-change-handler)) + (put 'allout-overlay-category 'modification-hooks + '(allout-overlay-interior-modification-handler)))) ;;;_ > allout-mode (&optional toggle) ;;;_ : Defun: ;;;###autoload (defun allout-mode (&optional toggle) ;;;_ . Doc string: "Toggle minor mode for controlling exposure and editing of text outlines. +\\<allout-mode-map> Optional arg forces mode to re-initialize iff arg is positive num or symbol. Allout outline mode always runs as a minor mode. @@ -1244,62 +1245,69 @@ \\[allout-forward-current-level] allout-forward-current-level | \\[allout-show-current-entry] allout-show-current-entry \\[allout-backward-current-level] allout-backward-current-level | \\[allout-show-all] allout-show-all \\[allout-end-of-entry] allout-end-of-entry -\\[allout-beginning-of-current-entry,] allout-beginning-of-current-entry, alternately, goes to hot-spot +\\[allout-beginning-of-current-entry] allout-beginning-of-current-entry, alternately, goes to hot-spot Topic Header Production: ----------------------- -\\[allout-open-sibtopic] allout-open-sibtopic Create a new sibling after current topic. -\\[allout-open-subtopic] allout-open-subtopic ... an offspring of current topic. -\\[allout-open-supertopic] allout-open-supertopic ... a sibling of the current topic's parent. +\\[allout-open-sibtopic] allout-open-sibtopic Create a new sibling after current topic. +\\[allout-open-subtopic] allout-open-subtopic ... an offspring of current topic. +\\[allout-open-supertopic] allout-open-supertopic ... a sibling of the current topic's parent. Topic Level and Prefix Adjustment: --------------------------------- -\\[allout-shift-in] allout-shift-in Shift current topic and all offspring deeper. -\\[allout-shift-out] allout-shift-out ... less deep. -\\[allout-rebullet-current-heading] allout-rebullet-current-heading Prompt for alternate bullet for +\\[allout-shift-in] allout-shift-in Shift current topic and all offspring deeper. +\\[allout-shift-out] allout-shift-out ... less deep. +\\[allout-rebullet-current-heading] allout-rebullet-current-heading Prompt for alternate bullet for current topic. \\[allout-rebullet-topic] allout-rebullet-topic Reconcile bullets of topic and its offspring - distinctive bullets are not changed, others alternated according to nesting depth. -\\[allout-number-siblings] allout-number-siblings Number bullets of topic and siblings - the +\\[allout-number-siblings] allout-number-siblings Number bullets of topic and siblings - the offspring are not affected. With repeat count, revoke numbering. Topic-oriented Killing and Yanking: ---------------------------------- -\\[allout-kill-topic] allout-kill-topic Kill current topic, including offspring. -\\[allout-kill-line] allout-kill-line Like kill-line, but reconciles numbering, etc. -\\[allout-yank] allout-yank Yank, adjusting depth of yanked topic to +\\[allout-kill-topic] allout-kill-topic Kill current topic, including offspring. +\\[allout-kill-line] allout-kill-line Like kill-line, but reconciles numbering, etc. +\\[allout-yank] allout-yank Yank, adjusting depth of yanked topic to depth of heading if yanking into bare topic heading (ie, prefix sans text). -\\[allout-yank-pop] allout-yank-pop Is to allout-yank as yank-pop is to yank +\\[allout-yank-pop] allout-yank-pop Is to allout-yank as yank-pop is to yank + + Topic-oriented Encryption: + ------------------------- +\\[allout-toggle-current-subtree-encryption] allout-toggle-current-subtree-encryption Encrypt/Decrypt topic content Misc commands: ------------- M-x outlineify-sticky Activate outline mode for current buffer, and establish a default file-var setting for `allout-layout'. -\\[allout-mark-topic] allout-mark-topic +\\[allout-mark-topic] allout-mark-topic \\[allout-copy-exposed-to-buffer] allout-copy-exposed-to-buffer Duplicate outline, sans concealed text, to buffer with name derived from derived from that of current buffer - \"*BUFFERNAME exposed*\". -\\[allout-flatten-exposed-to-buffer] allout-flatten-exposed-to-buffer +\\[allout-flatten-exposed-to-buffer] allout-flatten-exposed-to-buffer Like above 'copy-exposed', but convert topic prefixes to section.subsection... numeric format. -ESC ESC (allout-init t) Setup Emacs session for outline mode +\\[eval-expression] (allout-init t) Setup Emacs session for outline mode auto-activation. - Encrypted Entries - -Outline mode supports easily togglable gpg encryption of topics, with -niceties like support for symmetric and key-pair modes, passphrase timeout, -passphrase consistency checking, user-provided hinting for symmetric key -mode, and auto-encryption of topics pending encryption on save. The aim is -to enable reliable topic privacy while preventing accidents like neglected -encryption, encryption with a mistaken passphrase, forgetting which -passphrase was used, and other practical pitfalls. + Topic Encryption + +Outline mode supports gpg encryption of topics, with support for +symmetric and key-pair modes, passphrase timeout, passphrase +consistency checking, user-provided hinting for symmetric key +mode, and auto-encryption of topics pending encryption on save. +\(Topics pending encryption are, by default, automatically +encrypted during file saves; if you're editing the contents of +such a topic, it is automatically decrypted for continued +editing.) The aim is reliable topic privacy while preventing +accidents like neglected encryption before saves, forgetting +which passphrase was used, and other practical pitfalls. See `allout-toggle-current-subtree-encryption' function docstring and `allout-encrypt-unencrypted-on-saves' customization variable for details. @@ -1309,22 +1317,21 @@ Hot-spot operation provides a means for easy, single-keystroke outline navigation and exposure control. -\\<allout-mode-map> When the text cursor is positioned directly on the bullet character of a topic, regular characters (a to z) invoke the commands of the corresponding allout-mode keymap control chars. For example, \"f\" -would invoke the command typically bound to \"C-c C-f\" +would invoke the command typically bound to \"C-c<space>C-f\" \(\\[allout-forward-current-level] `allout-forward-current-level'). -Thus, by positioning the cursor on a topic bullet, you can execute -the outline navigation and manipulation commands with a single -keystroke. Non-literal chars never get this special translation, so -you can use them to get away from the hot-spot, and back to normal -operation. +Thus, by positioning the cursor on a topic bullet, you can +execute the outline navigation and manipulation commands with a +single keystroke. Regular navigation keys (eg, \\[forward-char], \\[next-line]) never get +this special translation, so you can use them to get out of the +hot-spot and back to normal operation. Note that the command `allout-beginning-of-current-entry' \(\\[allout-beginning-of-current-entry]\) will move to the hot-spot when the cursor is already located at the -beginning of the current entry, so you can simply hit \\[allout-beginning-of-current-entry] +beginning of the current entry, so you usually can hit \\[allout-beginning-of-current-entry] twice in a row to get to the hot-spot. Terminology @@ -1332,7 +1339,7 @@ Topic hierarchy constituents - TOPICS and SUBTOPICS: TOPIC: A basic, coherent component of an Emacs outline. It can - contain other topics, and it can be subsumed by other topics, + contain and be contained by other topics. CURRENT topic: The visible topic most immediately containing the cursor. DEPTH: The degree of nesting of a topic; it increases with @@ -1376,13 +1383,13 @@ docstring for more detail. PREFIX-PADDING: Spaces or asterisks which separate the prefix-lead and the - bullet, according to the depth of the topic. + bullet, determining the depth of the topic. BULLET: A character at the end of the topic prefix, it must be one of the characters listed on `allout-plain-bullets-string' or `allout-distinctive-bullets-string'. (See the documentation for these variables for more details.) The default choice of - bullet when generating varies in a cycle with the depth of the - topic. + bullet when generating topics varies in a cycle with the depth of + the topic. ENTRY: The text contained in a topic before any offspring. BODY: Same as ENTRY. @@ -1393,7 +1400,6 @@ CONCEALED: Topics and entry text whose display is inhibited. Contiguous units of concealed text is represented by `...' ellipses. - (Ref the `selective-display' var.) Concealed topics are effectively collapsed within an ancestor. CLOSED: A topic whose immediate offspring and body-text is concealed. @@ -1415,9 +1421,11 @@ ;; allout-mode already called once during this complex command? (same-complex-command (eq allout-v18/19-file-var-hack (car command-history))) - (write-file-hook-var-name (if (boundp 'write-file-functions) - 'write-file-functions - 'local-write-file-hooks)) + (write-file-hook-var-name (cond ((boundp 'write-file-functions) + 'write-file-functions) + ((boundp 'write-file-hooks) + 'write-file-hooks) + (t 'local-write-file-hooks))) do-layout ) @@ -1465,9 +1473,8 @@ (progn (allout-resumptions 'allout-primary-bullet) (allout-resumptions 'allout-old-style-prefixes))) - (allout-resumptions 'selective-display) - (if (and (boundp 'before-change-functions) before-change-functions) - (allout-resumptions 'before-change-functions)) + ;;(allout-resumptions 'selective-display) + (remove-from-invisibility-spec '(allout . t)) (set write-file-hook-var-name (delq 'allout-write-file-hook-handler (symbol-value write-file-hook-var-name))) @@ -1476,9 +1483,8 @@ auto-save-hook)) (allout-resumptions 'paragraph-start) (allout-resumptions 'paragraph-separate) - (allout-resumptions (if (string-match "^18" emacs-version) - 'auto-fill-hook - 'auto-fill-function)) + (allout-resumptions 'auto-fill-function) + (allout-resumptions 'normal-auto-fill-function) (allout-resumptions 'allout-former-auto-filler) (setq allout-mode nil)) @@ -1490,6 +1496,8 @@ (allout-resumptions 'allout-primary-bullet '("*")) (allout-resumptions 'allout-old-style-prefixes '(())))) + (allout-set-overlay-category) ; Doesn't hurt to redo this. + (allout-infer-header-lead) (allout-infer-body-reindent) @@ -1525,25 +1533,24 @@ (current-local-map))) ) - ; selective-display is the - ; emacs conditional exposure - ; mechanism: - (allout-resumptions 'selective-display '(t)) + (add-to-invisibility-spec '(allout . t)) + (make-local-variable 'line-move-ignore-invisible) + (setq line-move-ignore-invisible t) (add-hook 'pre-command-hook 'allout-pre-command-business) (add-hook 'post-command-hook 'allout-post-command-business) + (add-hook 'isearch-mode-end-hook 'allout-isearch-end-handler) (add-hook write-file-hook-var-name 'allout-write-file-hook-handler) (add-hook 'auto-save-hook 'allout-auto-save-hook-handler) ; Custom auto-fill func, to support ; respect for topic headline, ; hanging-indents, etc: - (let* ((fill-func-var (if (string-match "^18" emacs-version) - 'auto-fill-hook - 'auto-fill-function)) - (fill-func (symbol-value fill-func-var))) - ;; Register prevailing fill func for use by allout-auto-fill: - (allout-resumptions 'allout-former-auto-filler (list fill-func)) - ;; Register allout-auto-fill to be used if filling is active: - (allout-resumptions fill-func-var '(allout-auto-fill))) + ;; Register prevailing fill func for use by allout-auto-fill: + (allout-resumptions 'allout-former-auto-filler (list auto-fill-function)) + ;; Register allout-auto-fill to be used if filling is active: + (allout-resumptions 'auto-fill-function '(allout-auto-fill)) + (allout-resumptions 'allout-outside-normal-auto-fill-function + (list normal-auto-fill-function)) + (allout-resumptions 'normal-auto-fill-function '(allout-auto-fill)) ;; Paragraphs are broken by topic headlines. (make-local-variable 'paragraph-start) (allout-resumptions 'paragraph-start @@ -1563,10 +1570,6 @@ (if allout-layout (setq do-layout t)) - (if (and allout-isearch-dynamic-expose - (not (fboundp 'allout-real-isearch-abort))) - (allout-enwrap-isearch)) - (run-hooks 'allout-mode-hook) (setq allout-mode t)) @@ -1602,9 +1605,92 @@ allout-mode ) ; let* ) ; defun + +;;;_ - Position Assessment +;;;_ > allout-hidden-p (&optional pos) +(defsubst allout-hidden-p (&optional pos) + "Non-nil if the character after point is invisible." + (get-char-property (or pos (point)) 'invisible)) + ;;;_ > allout-minor-mode (defalias 'allout-minor-mode 'allout-mode) +;;;_ > allout-overlay-insert-in-front-handler (ol after beg end +;;; &optional prelen) +(defun allout-overlay-insert-in-front-handler (ol after beg end + &optional prelen) + "Shift the overlay so stuff inserted in front of it are excluded." + (if after + (move-overlay ol (1+ beg) (overlay-end ol)))) +;;;_ > allout-overlay-interior-modification-handler (ol after beg end +;;; &optional prelen) +(defun allout-overlay-interior-modification-handler (ol after beg end + &optional prelen) + "Get confirmation before making arbitrary changes to invisible text. + +We expose the invisible text and ask for confirmation. Refusal or +keyboard-quit abandons the changes, with keyboard-quit additionally +reclosing the opened text. + +No confirmation is necessary when inhibit-read-only is set - eg, allout +internal functions use this feature cohesively bunch changes." + + (when (and (not inhibit-read-only) (not after)) + (let ((start (point)) + (ol-start (overlay-start ol)) + (ol-end (overlay-end ol)) + (msg "Change within concealed text disallowed.") + opened + first) + (goto-char beg) + (while (< (point) end) + (when (allout-hidden-p) + (allout-show-to-offshoot) + (if (allout-hidden-p) + (save-excursion (forward-char 1) + (allout-show-to-offshoot))) + (when (not first) + (setq opened t) + (setq first (point)))) + (goto-char (if (featurep 'xemacs) + (next-property-change (1+ (point)) nil end) + (next-char-property-change (1+ (point)) end)))) + (when first + (goto-char first) + (condition-case nil + (if (not + (yes-or-no-p + (substitute-command-keys + (concat "Modify this concealed text? (\"no\" aborts," + " \\[keyboard-quit] also reconceals) ")))) + (progn (goto-char start) + (error "Concealed-text change refused."))) + (quit (allout-flag-region ol-start ol-end nil) + (allout-flag-region ol-start ol-end t) + (error "Concealed-text change abandoned, text reconcealed.")))) + (goto-char start)))) +;;;_ > allout-before-change-handler (beg end) +(defun allout-before-change-handler (beg end) + "Protect against changes to invisible text. + +See allout-overlay-interior-modification-handler for details. + +This before-change handler is used only where modification-hooks +overlay property is not supported." + (if (not allout-mode) + nil + (allout-overlay-interior-modification-handler nil nil beg end nil))) +;;;_ > allout-isearch-end-handler (&optional overlay) +(defun allout-isearch-end-handler (&optional overlay) + "Reconcile allout outline exposure on arriving in hidden text after isearch. + +Optional OVERLAY parameter is for when this function is used by +`isearch-open-invisible' overlay property. It is otherwise unused, so this +function can also be used as an `isearch-mode-end-hook'." + + (if (and (allout-mode-p) (allout-hidden-p)) + (allout-show-to-offshoot))) + ;;;_ #3 Internal Position State-Tracking - "allout-recent-*" funcs ;;; All the basic outline functions that directly do string matches to ;;; evaluate heading prefix location set the variables @@ -1667,7 +1753,6 @@ ;;;_ #4 Navigation -;;;_ - Position Assessment ;;;_ : Location Predicates ;;;_ > allout-on-current-heading-p () (defun allout-on-current-heading-p () @@ -1675,7 +1760,7 @@ Actually, returns prefix beginning point." (save-excursion - (beginning-of-line) + (allout-beginning-of-current-line) (and (looking-at allout-regexp) (allout-prefix-data (match-beginning 0) (match-end 0))))) ;;;_ > allout-on-heading-p () @@ -1686,39 +1771,36 @@ (and (save-excursion (beginning-of-line) (looking-at allout-regexp)) (= (point)(save-excursion (allout-end-of-prefix)(point))))) -;;;_ > allout-hidden-p () -(defmacro allout-hidden-p () - "True if point is in hidden text." - '(save-excursion - (and (re-search-backward "[\n\r]" () t) - (= ?\r (following-char))))) -;;;_ > allout-visible-p () -(defmacro allout-visible-p () - "True if point is not in hidden text." - (interactive) - '(not (allout-hidden-p))) ;;;_ : Location attributes ;;;_ > allout-depth () -(defsubst allout-depth () - "Like `allout-current-depth', but respects hidden as well as visible topics." +(defun allout-depth () + "Return depth of topic most immediately containing point. + +Return zero if point is not within any topic. + +Like `allout-current-depth', but respects hidden as well as visible topics." (save-excursion - (if (allout-goto-prefix) - (allout-recent-depth) - (progn - ;; Oops, no prefix, zero prefix data: - (allout-prefix-data (point)(point)) - ;; ... and return 0: - 0)))) + (let ((start-point (point))) + (if (and (allout-goto-prefix) + (not (< start-point (point)))) + (allout-recent-depth) + (progn + ;; Oops, no prefix, zero prefix data: + (allout-prefix-data (point)(point)) + ;; ... and return 0: + 0))))) ;;;_ > allout-current-depth () -(defmacro allout-current-depth () - "Return nesting depth of visible topic most immediately containing point." - '(save-excursion - (if (allout-back-to-current-heading) - (max 1 - (- allout-recent-prefix-end - allout-recent-prefix-beginning - allout-header-subtraction)) - 0))) +(defun allout-current-depth () + "Return depth of visible topic most immediately containing point. + +Return zero if point is not within any topic." + (save-excursion + (if (allout-back-to-current-heading) + (max 1 + (- allout-recent-prefix-end + allout-recent-prefix-beginning + allout-header-subtraction)) + 0))) ;;;_ > allout-get-current-prefix () (defun allout-get-current-prefix () "Topic prefix of the current topic." @@ -1734,7 +1816,7 @@ ;;;_ > allout-current-bullet () (defun allout-current-bullet () "Return bullet of current (visible) topic heading, or none if none found." - (condition-case err + (condition-case nil (save-excursion (allout-back-to-current-heading) (buffer-substring (- allout-recent-prefix-end 1) @@ -1783,7 +1865,31 @@ rev-sibls) ) -;;;_ - Navigation macros +;;;_ - Navigation routines +;;;_ > allout-beginning-of-current-line () +(defun allout-beginning-of-current-line () + "Like beginning of line, but to visible text." + + ;; XXX We would use `(move-beginning-of-line 1)', but it gets + ;; stuck on some hidden newlines, eg at column 80, as of GNU Emacs 22.0.50. + ;; Conversely, `beginning-of-line' can make no progress in other + ;; situations. Both are necessary, in the order used below. + (move-beginning-of-line 1) + (beginning-of-line) + (while (or (not (bolp)) (allout-hidden-p)) + (beginning-of-line) + (if (or (allout-hidden-p) (not (bolp))) + (forward-char -1)))) +;;;_ > allout-end-of-current-line () +(defun allout-end-of-current-line () + "Move to the end of line, past concealed text if any." + ;; XXX This is for symmetry with `allout-beginning-of-current-line' - + ;; `move-end-of-line' doesn't suffer the same problem as + ;; `move-beginning-of-line'. + (end-of-line) + (while (allout-hidden-p) + (end-of-line) + (if (allout-hidden-p) (forward-char 1)))) ;;;_ > allout-next-heading () (defsubst allout-next-heading () "Move to the heading for the topic \(possibly invisible) before this one. @@ -1798,7 +1904,7 @@ (goto-char (or (match-beginning 2) allout-recent-prefix-beginning)) (or (match-end 2) allout-recent-prefix-end)))) -;;;_ : allout-this-or-next-heading +;;;_ > allout-this-or-next-heading (defun allout-this-or-next-heading () "Position cursor on current or next heading." ;; A throwaway non-macro that is defined after allout-next-heading @@ -1822,6 +1928,21 @@ (goto-char (or (match-beginning 2) allout-recent-prefix-beginning)) (or (match-end 2) allout-recent-prefix-end)))))) +;;;_ > allout-get-invisibility-overlay () +(defun allout-get-invisibility-overlay () + "Return the overlay at point that dictates allout invisibility." + (let ((overlays (overlays-at (point))) + got) + (while (and overlays (not got)) + (if (equal (overlay-get (car overlays) 'invisible) 'allout) + (setq got (car overlays)))) + got)) +;;;_ > allout-back-to-visible-text () +(defun allout-back-to-visible-text () + "Move to most recent prior character that is visible, and return point." + (if (allout-hidden-p) + (goto-char (overlay-start (allout-get-invisibility-overlay)))) + (point)) ;;;_ - Subtree Charting ;;;_ " These routines either produce or assess charts, which are @@ -1912,11 +2033,11 @@ ; the original level. Position ; to the end of it: (progn (and (not (eobp)) (forward-char -1)) - (and (memq (preceding-char) '(?\n ?\r)) - (memq (aref (buffer-substring (max 1 (- (point) 3)) - (point)) - 1) - '(?\n ?\r)) + (and (= (preceding-char) ?\n) + (= (aref (buffer-substring (max 1 (- (point) 3)) + (point)) + 1) + ?\n) (forward-char -1)) (setq allout-recent-end-of-subtree (point)))) @@ -1954,7 +2075,7 @@ (if further (setq result (append further result))) (setq chart (cdr chart))) (goto-char here) - (if (= (preceding-char) ?\r) + (if (allout-hidden-p) (setq result (cons here result))) (setq chart (cdr chart)))) result)) @@ -2003,7 +2124,7 @@ (let (done) (while (and (not done) - (re-search-backward "[\n\r]" nil 1)) + (search-backward "\n" nil 1)) (forward-char 1) (if (looking-at allout-regexp) (setq done (allout-prefix-data (match-beginning 0) @@ -2042,19 +2163,30 @@ (1- (match-end 0)))) ;;;_ > allout-back-to-current-heading () (defun allout-back-to-current-heading () - "Move to heading line of current topic, or beginning if already on the line." - - (beginning-of-line) - (prog1 (or (allout-on-current-heading-p) - (and (re-search-backward (concat "^\\(" allout-regexp "\\)") - nil - 'move) - (allout-prefix-data (match-beginning 1)(match-end 1)))) - (if (interactive-p) (allout-end-of-prefix)))) + "Move to heading line of current topic, or beginning if already on the line. + +Return value of point, unless we started outside of (before any) topics, +in which case we return nil." + + (allout-beginning-of-current-line) + (if (or (allout-on-current-heading-p) + (and (re-search-backward (concat "^\\(" allout-regexp "\\)") + nil 'move) + (progn (while (allout-hidden-p) + (allout-beginning-of-current-line) + (if (not (looking-at allout-regexp)) + (re-search-backward (concat + "^\\(" allout-regexp "\\)") + nil 'move))) + (allout-prefix-data (match-beginning 1) + (match-end 1))))) + (if (interactive-p) + (allout-end-of-prefix) + (point)))) ;;;_ > allout-back-to-heading () (defalias 'allout-back-to-heading 'allout-back-to-current-heading) -;;;_ > allout-pre-next-preface () -(defun allout-pre-next-preface () +;;;_ > allout-pre-next-prefix () +(defun allout-pre-next-prefix () "Skip forward to just before the next heading line. Returns that character position." @@ -2062,12 +2194,16 @@ (if (re-search-forward allout-line-boundary-regexp nil 'move) (prog1 (goto-char (match-beginning 0)) (allout-prefix-data (match-beginning 2)(match-end 2))))) -;;;_ > allout-end-of-subtree (&optional current) -(defun allout-end-of-subtree (&optional current) +;;;_ > allout-end-of-subtree (&optional current include-trailing-blank) +(defun allout-end-of-subtree (&optional current include-trailing-blank) "Put point at the end of the last leaf in the containing topic. -If optional CURRENT is true (default false), then put point at the end of -the containing visible topic. +Optional CURRENT means put point at the end of the containing +visible topic. + +Optional INCLUDE-TRAILING-BLANK means include a trailing blank line, if +any, as part of the subtree. Otherwise, that trailing blank will be +excluded as delimiting whitespace between topics. Returns the value of point." (interactive "P") @@ -2080,18 +2216,21 @@ (> (allout-recent-depth) level)) (allout-next-heading)) (and (not (eobp)) (forward-char -1)) - (and (memq (preceding-char) '(?\n ?\r)) - (memq (aref (buffer-substring (max 1 (- (point) 3)) (point)) 1) - '(?\n ?\r)) + (if (and (not include-trailing-blank) (= ?\n (preceding-char))) (forward-char -1)) (setq allout-recent-end-of-subtree (point)))) -;;;_ > allout-end-of-current-subtree () -(defun allout-end-of-current-subtree () +;;;_ > allout-end-of-current-subtree (&optional include-trailing-blank) +(defun allout-end-of-current-subtree (&optional include-trailing-blank) + "Put point at end of last leaf in currently visible containing topic. +Optional INCLUDE-TRAILING-BLANK means include a trailing blank line, if +any, as part of the subtree. Otherwise, that trailing blank will be +excluded as delimiting whitespace between topics. + Returns the value of point." (interactive) - (allout-end-of-subtree t)) + (allout-end-of-subtree t include-trailing-blank)) ;;;_ > allout-beginning-of-current-entry () (defun allout-beginning-of-current-entry () "When not already there, position point at beginning of current topic header. @@ -2104,18 +2243,23 @@ (if (and (interactive-p) (= (point) start-point)) (goto-char (allout-current-bullet-pos))))) -;;;_ > allout-end-of-entry () -(defun allout-end-of-entry () - "Position the point at the end of the current topics' entry." +;;;_ > allout-end-of-entry (&optional inclusive) +(defun allout-end-of-entry (&optional inclusive) + "Position the point at the end of the current topics' entry. + +Optional INCLUSIVE means also include trailing empty line, if any. When +unset, whitespace between items separates them even when the items are +collapsed." (interactive) - (prog1 (allout-pre-next-preface) - (if (and (not (bobp))(looking-at "^$")) - (forward-char -1)))) + (allout-pre-next-prefix) + (if (and (not inclusive) (not (bobp)) (= ?\n (preceding-char))) + (forward-char -1)) + (point)) ;;;_ > allout-end-of-current-heading () (defun allout-end-of-current-heading () (interactive) (allout-beginning-of-current-entry) - (re-search-forward "[\n\r]" nil t) + (search-forward "\n" nil t) (forward-char -1)) (defalias 'allout-end-of-heading 'allout-end-of-current-heading) ;;;_ > allout-get-body-text () @@ -2123,13 +2267,13 @@ "Return the unmangled body text of the topic immediately containing point." (save-excursion (allout-end-of-prefix) - (if (not (re-search-forward "[\n\r]" nil t)) + (if (not (search-forward "\n" nil t)) nil (backward-char 1) (let ((pre-body (point))) (if (not pre-body) nil - (allout-end-of-entry) + (allout-end-of-entry t) (if (not (= pre-body (point))) (buffer-substring-no-properties (1+ pre-body) (point)))) ) @@ -2189,8 +2333,7 @@ (allout-back-to-current-heading) (let ((present-level (allout-recent-depth)) (last-good (point)) - failed - return) + failed) ;; Loop for iterating arg: (while (and (> (allout-recent-depth) 1) (> arg 0) @@ -2260,11 +2403,9 @@ (if (or (bobp) (eobp)) nil (forward-char -1)) - (if (or (bobp) (not (memq (preceding-char) '(?\n ?\r)))) + (if (or (bobp) (not (= ?\n (preceding-char)))) nil - (forward-char -1) - (if (or (bobp) (not (memq (preceding-char) '(?\n ?\r)))) - (forward-char -1))) + (forward-char -1)) (point)) ;;;_ > allout-beginning-of-level () (defun allout-beginning-of-level () @@ -2282,19 +2423,19 @@ (defun allout-next-visible-heading (arg) "Move to the next ARG'th visible heading line, backward if arg is negative. -Move as far as possible in indicated direction \(beginning or end of -buffer) if headings are exhausted." +Move to buffer limit in indicated direction if headings are exhausted." (interactive "p") (let* ((backward (if (< arg 0) (setq arg (* -1 arg)))) (step (if backward -1 1)) - (start-point (point)) prev got) (while (> arg 0) ; limit condition (while (and (not (if backward (bobp)(eobp))) ; boundary condition ;; Move, skipping over all those concealed lines: - (< -1 (forward-line step)) + (prog1 (condition-case nil (or (line-move step) t) + (error nil)) + (allout-beginning-of-current-line)) (not (setq got (looking-at allout-regexp))))) ;; Register this got, it may be the last: (if got (setq prev got)) @@ -2323,7 +2464,6 @@ Returns resulting position, else nil if none found." (interactive "p") (let ((start-depth (allout-current-depth)) - (start-point (point)) (start-arg arg) (backward (> 0 arg)) last-depth @@ -2386,51 +2526,17 @@ - Implement (and clear) `allout-post-goto-bullet', for hot-spot outline commands. -- Decrypt topic currently being edited if it was encrypted for a save. - -- Massage buffer-undo-list so successive, standard character self-inserts are - aggregated. This kludge compensates for lack of undo bunching when - before-change-functions is used." +- Decrypt topic currently being edited if it was encrypted for a save." ; Apply any external change func: (if (not (allout-mode-p)) ; In allout-mode. nil - (if allout-isearch-dynamic-expose - (allout-isearch-rectification)) - ;; Undo bunching business: - (if (and (listp buffer-undo-list) ; Undo history being kept. - (equal this-command 'self-insert-command) - (equal last-command 'self-insert-command)) - (let* ((prev-stuff (cdr buffer-undo-list)) - (before-prev-stuff (cdr (cdr prev-stuff))) - cur-cell cur-from cur-to - prev-cell prev-from prev-to) - (if (and before-prev-stuff ; Goes back far enough to bother, - (not (car prev-stuff)) ; and break before current, - (not (car before-prev-stuff)) ; !and break before prev! - (setq prev-cell (car (cdr prev-stuff))) ; contents now, - (setq cur-cell (car buffer-undo-list)) ; contents prev. - - ;; cur contents denote a single char insertion: - (numberp (setq cur-from (car cur-cell))) - (numberp (setq cur-to (cdr cur-cell))) - (= 1 (- cur-to cur-from)) - - ;; prev contents denote fewer than aggregate-limit - ;; insertions: - (numberp (setq prev-from (car prev-cell))) - (numberp (setq prev-to (cdr prev-cell))) - ; Below threshold: - (> allout-undo-aggregation (- prev-to prev-from))) - (setq buffer-undo-list - (cons (cons prev-from cur-to) - (cdr (cdr (cdr buffer-undo-list)))))))) (if (and (boundp 'allout-after-save-decrypt) allout-after-save-decrypt) (allout-after-saves-handler)) - ;; Implement -post-goto-bullet, if set: (must be after undo business) + ;; Implement -post-goto-bullet, if set: (if (and allout-post-goto-bullet (allout-current-bullet-pos)) (progn (goto-char (allout-current-bullet-pos)) @@ -2456,10 +2562,6 @@ (if (not (allout-mode-p)) ;; Shouldn't be invoked if not in allout-mode, but just in case: nil - ;; Register isearch status: - (if (and (boundp 'isearch-mode) isearch-mode) - (setq allout-pre-was-isearching t) - (setq allout-pre-was-isearching nil)) ;; Hot-spot navigation provisions: (if (and (eq this-command 'self-insert-command) (eq (point)(allout-current-bullet-pos))) @@ -2499,110 +2601,6 @@ (not (allout-mode-p)) allout-layout) (allout-mode t))) -;;;_ > allout-isearch-rectification -(defun allout-isearch-rectification () - "Rectify outline exposure before, during, or after isearch. - -Called as part of `allout-post-command-business'." - - (let ((isearching (and (boundp 'isearch-mode) isearch-mode))) - (cond ((and isearching (not allout-pre-was-isearching)) - (allout-isearch-expose 'start)) - ((and isearching allout-pre-was-isearching) - (allout-isearch-expose 'continue)) - ((and (not isearching) allout-pre-was-isearching) - (allout-isearch-expose 'final)) - ;; Not and wasn't isearching: - (t (setq allout-isearch-prior-pos nil) - (setq allout-isearch-did-quit nil))))) -;;;_ = allout-isearch-was-font-lock -(defvar allout-isearch-was-font-lock - (and (boundp 'font-lock-mode) font-lock-mode)) -;;;_ > allout-isearch-expose (mode) -(defun allout-isearch-expose (mode) - "MODE is either 'clear, 'start, 'continue, or 'final." - ;; allout-isearch-prior-pos encodes exposure status of prior pos: - ;; (pos was-vis header-pos end-pos) - ;; pos - point of concern - ;; was-vis - t, else 'topic if entire topic was exposed, 'entry otherwise - ;; Do reclosure or prior pos, as necessary: - (if (eq mode 'start) - (setq allout-isearch-was-font-lock (and (boundp 'font-lock-mode) - font-lock-mode) - font-lock-mode nil) - (if (eq mode 'final) - (setq font-lock-mode allout-isearch-was-font-lock)) - (if (and allout-isearch-prior-pos - (listp allout-isearch-prior-pos)) - ;; Conceal prior peek: - (allout-flag-region (car (cdr allout-isearch-prior-pos)) - (car (cdr (cdr allout-isearch-prior-pos))) - ?\r))) - (if (allout-visible-p) - (setq allout-isearch-prior-pos nil) - (if (not (eq mode 'final)) - (setq allout-isearch-prior-pos (cons (point) (allout-show-entry))) - (if allout-isearch-did-quit - nil - (setq allout-isearch-prior-pos nil) - (allout-show-children)))) - (setq allout-isearch-did-quit nil)) -;;;_ > allout-enwrap-isearch () -(defun allout-enwrap-isearch () - "Impose `allout-mode' isearch-abort wrapper for dynamic exposure in isearch. - -The function checks to ensure that the rebinding is done only once." - - (add-hook 'isearch-mode-end-hook 'allout-isearch-rectification) - (if (fboundp 'allout-real-isearch-abort) - ;; - nil - ; Ensure load of isearch-mode: - (if (or (and (fboundp 'isearch-mode) - (fboundp 'isearch-abort)) - (condition-case error - (load-library "isearch-mode") - ('file-error (message - "Skipping isearch-mode provisions - %s '%s'" - (car (cdr error)) - (car (cdr (cdr error)))) - (sit-for 1) - ;; Inhibit subsequent tries and return nil: - (setq allout-isearch-dynamic-expose nil)))) - ;; Isearch-mode loaded, encapsulate specific entry points for - ;; outline dynamic-exposure business: - (progn - ;; stash crucial isearch-mode funcs under known, private - ;; names, then register wrapper functions under the old - ;; names, in their stead: - (fset 'allout-real-isearch-abort (symbol-function 'isearch-abort)) - (fset 'isearch-abort 'allout-isearch-abort))))) -;;;_ > allout-isearch-abort () -(defun allout-isearch-abort () - "Wrapper for allout-real-isearch-abort \(which see), to register -actual quits." - (interactive) - (setq allout-isearch-did-quit nil) - (condition-case what - (allout-real-isearch-abort) - ('quit (setq allout-isearch-did-quit t) - (signal 'quit nil)))) - -;;; Prevent unnecessary font-lock while isearching! -(defvar isearch-was-font-locking nil) -(defun isearch-inhibit-font-lock () - "Inhibit `font-lock' while isearching - for use on `isearch-mode-hook'." - (if (and (allout-mode-p) (boundp 'font-lock-mode) font-lock-mode) - (setq isearch-was-font-locking t - font-lock-mode nil))) -(add-hook 'isearch-mode-hook 'isearch-inhibit-font-lock) -(defun isearch-reenable-font-lock () - "Reenable font-lock after isearching - for use on `isearch-mode-end-hook'." - (if (and (boundp 'font-lock-mode) font-lock-mode) - (if (and (allout-mode-p) isearch-was-font-locking) - (setq isearch-was-font-locking nil - font-lock-mode t)))) -(add-hook 'isearch-mode-end-hook 'isearch-reenable-font-lock) ;;;_ - Topic Format Assessment ;;;_ > allout-solicit-alternate-bullet (depth &optional current-bullet) @@ -2807,15 +2805,20 @@ ((allout-sibling-index)))))) ) ) -;;;_ > allout-open-topic (relative-depth &optional before use_recent_bullet) -(defun allout-open-topic (relative-depth &optional before use_recent_bullet) +;;;_ > allout-open-topic (relative-depth &optional before offer-recent-bullet) +(defun allout-open-topic (relative-depth &optional before offer-recent-bullet) "Open a new topic at depth DEPTH. New topic is situated after current one, unless optional flag BEFORE -is non-nil, or unless current line is complete empty (not even -whitespace), in which case open is done on current line. - -If USE_RECENT_BULLET is true, offer to use the bullet of the prior sibling. +is non-nil, or unless current line is completely empty - lacking even +whitespace - in which case open is done on the current line. + +When adding an offspring, it will be added immediately after the parent if +the other offspring are exposed, or after the last child if the offspring +are hidden. \(The intervening offspring will be exposed in the latter +case.) + +If OFFER-RECENT-BULLET is true, offer to use the bullet of the prior sibling. Nuances: @@ -2839,12 +2842,12 @@ having to go to its preceding sibling, and then open forward from there." + (allout-beginning-of-current-line) (let* ((depth (+ (allout-current-depth) relative-depth)) (opening-on-blank (if (looking-at "^\$") (not (setq before nil)))) ;; bunch o vars set while computing ref-topic opening-numbered - opening-encrypted ref-depth ref-bullet (ref-topic (save-excursion @@ -2864,13 +2867,6 @@ (allout-descend-to-depth depth)) (if (allout-numbered-type-prefix) allout-numbered-bullet)))) - (setq opening-encrypted - (save-excursion - (and allout-topic-encryption-bullet - (or (<= relative-depth 0) - (allout-descend-to-depth depth)) - (if (allout-numbered-type-prefix) - allout-numbered-bullet)))) (point))) dbl-space doing-beginning) @@ -2891,122 +2887,98 @@ (save-excursion ;; succeeded by a blank line? (allout-end-of-current-subtree) - (bolp))) + (looking-at "\n\n"))) (and (= ref-depth 1) (or before (= depth 1) (save-excursion ;; Don't already have following ;; vertical padding: - (not (allout-pre-next-preface))))))) - - ; Position to prior heading, - ; if inserting backwards, and - ; not going outwards: + (not (allout-pre-next-prefix))))))) + + ;; Position to prior heading, if inserting backwards, and not + ;; going outwards: (if (and before (>= relative-depth 0)) (progn (allout-back-to-current-heading) (setq doing-beginning (bobp)) (if (not (bobp)) (allout-previous-heading))) (if (and before (bobp)) - (allout-unprotected (allout-open-line-not-read-only)))) + (open-line 1))) (if (<= relative-depth 0) ;; Not going inwards, don't snug up: (if doing-beginning - (allout-unprotected - (if (not dbl-space) - (allout-open-line-not-read-only) - (allout-open-line-not-read-only) - (allout-open-line-not-read-only))) + (if (not dbl-space) + (open-line 1) + (open-line 2)) (if before (progn (end-of-line) - (allout-pre-next-preface) - (while (= ?\r (following-char)) + (allout-pre-next-prefix) + (while (and (= ?\n (following-char)) + (save-excursion + (forward-char 1) + (allout-hidden-p))) (forward-char 1)) (if (not (looking-at "^$")) - (allout-unprotected - (allout-open-line-not-read-only)))) - (allout-end-of-current-subtree))) - ;; Going inwards - double-space if first offspring is, - ;; otherwise snug up. - (end-of-line) ; So we skip any concealed progeny. - (allout-pre-next-preface) + (open-line 1))) + (allout-end-of-current-subtree) + (if (looking-at "\n\n") (forward-char 1)))) + ;; Going inwards - double-space if first offspring is + ;; double-spaced, otherwise snug up. + (allout-end-of-entry) + (line-move 1) + (allout-beginning-of-current-line) + (backward-char 1) (if (bolp) ;; Blank lines between current header body and next ;; header - get to last substantive (non-white-space) ;; line in body: - (re-search-backward "[^ \t\n]" nil t)) + (progn (setq dbl-space t) + (re-search-backward "[^ \t\n]" nil t))) + (if (looking-at "\n\n") + (setq dbl-space t)) (if (save-excursion (allout-next-heading) - (if (> (allout-recent-depth) ref-depth) - ;; This is an offspring. - (progn (forward-line -1) - (looking-at "^\\s-*$")))) + (when (> (allout-recent-depth) ref-depth) + ;; This is an offspring. + (forward-line -1) + (looking-at "^\\s-*$"))) (progn (forward-line 1) - (allout-unprotected - (allout-open-line-not-read-only)) + (open-line 1) (forward-line 1))) - (end-of-line)) + (allout-end-of-current-line)) + ;;(if doing-beginning (goto-char doing-beginning)) (if (not (bobp)) ;; We insert a newline char rather than using open-line to ;; avoid rear-stickiness inheritence of read-only property. (progn (if (and (not (> depth ref-depth)) (not before)) - (allout-unprotected - (allout-open-line-not-read-only)) - (if (> depth ref-depth) - (allout-unprotected - (allout-open-line-not-read-only)) + (open-line 1) + (if (and (not dbl-space) (> depth ref-depth)) + (newline 1) (if dbl-space - (allout-unprotected - (allout-open-line-not-read-only)) + (open-line 1) (if (not before) - (allout-unprotected (newline 1)))))) - (if dbl-space - (allout-unprotected (newline 1))) + (newline 1))))) + (if (and dbl-space (not (> relative-depth 0))) + (newline 1)) (if (and (not (eobp)) (not (bolp))) (forward-char 1)))) )) - (insert (concat (allout-make-topic-prefix opening-numbered - t - depth) - " ")) - - ;;(if doing-beginning (save-excursion (newline (if dbl-space 2 1)))) - - - (allout-rebullet-heading (and use_recent_bullet ;;; solicit - ref-bullet) - depth ;;; depth - nil ;;; number-control - nil ;;; index - t) + (insert (concat (allout-make-topic-prefix opening-numbered t depth) + " ")) + + (allout-rebullet-heading (and offer-recent-bullet ref-bullet) + depth nil nil t) + (if (> relative-depth 0) + (save-excursion (goto-char ref-topic) + (allout-show-children))) (end-of-line) ) ) -;;;_ . open-topic contingencies -;;;_ ; base topic - one from which open was issued -;;;_ , beginning char -;;;_ , amount of space before will be used, unless opening in place -;;;_ , end char will be used, unless opening before (and it still may) -;;;_ ; absolute depth of new topic -;;;_ ! insert in place - overrides most stuff -;;;_ ; relative depth of new re base -;;;_ ; before or after base topic -;;;_ ; spacing around topic, if any, prior to new topic and at same depth -;;;_ ; buffer boundaries - special provisions for beginning and end ob -;;;_ ; level 1 topics have special provisions also - double space. -;;;_ ; location of new topic -;;;_ > allout-open-line-not-read-only () -(defun allout-open-line-not-read-only () - "Open line and remove inherited read-only text prop from new char, if any." - (open-line 1) - (if (plist-get (text-properties-at (point)) 'read-only) - (allout-unprotected - (remove-text-properties (point) (+ 1 (point)) '(read-only nil))))) ;;;_ > allout-open-subtopic (arg) (defun allout-open-subtopic (arg) "Open new topic header at deeper level than the current one. @@ -3055,9 +3027,12 @@ ;; length of topic prefix: (make-string (progn (allout-end-of-prefix) (current-column)) - ?\ )))))) + ?\ ))))) + (use-auto-fill-function (or allout-outside-normal-auto-fill-function + auto-fill-function + 'do-auto-fill))) (if (or allout-former-auto-filler allout-use-hanging-indents) - (do-auto-fill)))) + (funcall use-auto-fill-function)))) ;;;_ > allout-reindent-body (old-depth new-depth &optional number) (defun allout-reindent-body (old-depth new-depth &optional number) "Reindent body lines which were indented at OLD-DEPTH to NEW-DEPTH. @@ -3071,7 +3046,6 @@ (allout-end-of-prefix) (let* ((new-margin (current-column)) excess old-indent-begin old-indent-end - curr-ind ;; We want the column where the header-prefix text started ;; *before* the prefix was changed, so we infer it relative ;; to the new margin and the shift in depth: @@ -3081,7 +3055,7 @@ (allout-unprotected (save-match-data (while - (and (re-search-forward "[\n\r]\\(\\s-*\\)" + (and (re-search-forward "\n\\(\\s-*\\)" nil t) ;; Register the indent data, before we reset the @@ -3231,8 +3205,7 @@ With repeat count, shift topic depth by that amount." (interactive "P") - (let ((start-col (current-column)) - (was-eol (eolp))) + (let ((start-col (current-column))) (save-excursion ;; Normalize arg: (cond ((null arg) (setq arg 0)) @@ -3414,8 +3387,8 @@ (if (and (> predecessor-depth 0) (> (+ current-depth arg) (1+ predecessor-depth))) - (error (concat "May not shift deeper than offspring depth" - " of previous topic"))))))) + (error (concat "Disallowed shift deeper than" + " containing topic's children."))))))) (allout-rebullet-topic arg)) ;;;_ > allout-shift-out (arg) (defun allout-shift-out (arg) @@ -3436,84 +3409,72 @@ (interactive "*P") - (let ((start-point (point)) - (leading-kill-ring-entry (car kill-ring)) - binding) - - (condition-case err - - (if (not (and (allout-mode-p) ; active outline mode, - allout-numbered-bullet ; numbers may need adjustment, - (bolp) ; may be clipping topic head, - (looking-at allout-regexp))) ; are clipping topic head. - ;; Above conditions do not obtain - just do a regular kill: - (kill-line arg) - ;; Ah, have to watch out for adjustments: - (let* ((depth (allout-depth)) - (start-point (point)) - binding) - ; Do the kill, presenting option - ; for read-only text: - (kill-line arg) + (if (or (not (allout-mode-p)) + (not (bolp)) + (not (looking-at allout-regexp))) + ;; Above conditions do not obtain - just do a regular kill: + (kill-line arg) + ;; Ah, have to watch out for adjustments: + (let* ((beg (point)) + (beg-hidden (allout-hidden-p)) + (end-hidden (save-excursion (allout-end-of-current-line) + (allout-hidden-p))) + (depth (allout-depth)) + (collapsed (allout-current-topic-collapsed-p))) + + (if collapsed + (put-text-property beg (1+ beg) 'allout-was-collapsed t) + (remove-text-properties beg (1+ beg) '(allout-was-collapsed t))) + + (if (and (not beg-hidden) (not end-hidden)) + (allout-unprotected (kill-line arg)) + (kill-line arg)) ; Provide some feedback: - (sit-for 0) - (save-excursion - ; Start with the topic - ; following killed line: + (sit-for 0) + (if allout-numbered-bullet + (save-excursion ; Renumber subsequent topics if needed: (if (not (looking-at allout-regexp)) (allout-next-heading)) - (allout-renumber-to-depth depth)))) - ;; condition case handler: - (text-read-only - (goto-char start-point) - (setq binding (where-is-internal 'allout-kill-topic nil t)) - (cond ((not binding) (setq binding "")) - ((arrayp binding) - (setq binding (mapconcat 'key-description (list binding) ", "))) - (t (setq binding (format "%s" binding)))) - ;; ensure prior kill-ring leader is properly restored: - (if (eq leading-kill-ring-entry (cadr kill-ring)) - ;; Aborted kill got pushed on front - ditch it: - (let ((got (car kill-ring))) - (setq kill-ring (cdr kill-ring)) - got) - ;; Aborted kill got appended to prior - resurrect prior: - (setcar kill-ring leading-kill-ring-entry)) - ;; make last-command skip this failed command, so kill-appending - ;; conditions track: - (setq this-command last-command) - (error (concat "read-only text hit - use %s allout-kill-topic to" - " discard collapsed stuff") - binding))) - ) - ) + (allout-renumber-to-depth depth)))))) ;;;_ > allout-kill-topic () (defun allout-kill-topic () "Kill topic together with subtopics. -Leaves primary topic's trailing vertical whitespace, if any." +Trailing whitespace is killed with a topic if that whitespace: + + - would separate the topic from a subsequent sibling + - would separate the topic from the end of buffer + - would not be added to whitespace already separating the topic from the + previous one. + +Completely collapsed topics are marked as such, for re-collapse +when yank with allout-yank into an outline as a heading." ;; Some finagling is done to make complex topic kills appear faster ;; than they actually are. A redisplay is performed immediately - ;; after the region is disposed of, though the renumbering process + ;; after the region is deleted, though the renumbering process ;; has yet to be performed. This means that there may appear to be - ;; a lag *after* the kill has been performed. + ;; a lag *after* a kill has been performed. (interactive) - (let* ((beg (prog1 (allout-back-to-current-heading)(beginning-of-line))) + (let* ((collapsed (allout-current-topic-collapsed-p)) + (beg (prog1 (allout-back-to-current-heading) (beginning-of-line))) (depth (allout-recent-depth))) (allout-end-of-current-subtree) + (if (and (/= (current-column) 0) (not (eobp))) + (forward-char 1)) (if (not (eobp)) - (if (or (not (looking-at "^$")) - ;; A blank line - cut it with this topic *unless* this - ;; is the last topic at this level, in which case - ;; we'll leave the blank line as part of the - ;; containing topic: - (save-excursion - (and (allout-next-heading) - (>= (allout-recent-depth) depth)))) + (if (and (looking-at "\n") + (or (save-excursion + (or (not (allout-next-heading)) + (= depth (allout-recent-depth)))) + (and (> (- beg (point-min)) 3) + (string= (buffer-substring (- beg 2) beg) "\n\n")))) (forward-char 1))) + (if collapsed + (put-text-property beg (1+ beg) 'allout-was-collapsed t) + (remove-text-properties beg (1+ beg) '(allout-was-collapsed t))) (allout-unprotected (kill-region beg (point))) (sit-for 0) (save-excursion @@ -3521,7 +3482,7 @@ ;;;_ > allout-yank-processing () (defun allout-yank-processing (&optional arg) - "Incidental outline-specific business to be done just after text yanks. + "Incidental allout-specific business to be done just after text yanks. Does depth adjustment of yanked topics, when: @@ -3542,10 +3503,12 @@ (interactive "*P") ; Get to beginning, leaving ; region around subject: - (if (< (my-mark-marker t) (point)) + (if (< (allout-mark-marker t) (point)) (exchange-point-and-mark)) (let* ((subj-beg (point)) - (subj-end (my-mark-marker t)) + (into-bol (bolp)) + (subj-end (allout-mark-marker t)) + (was-collapsed (get-text-property subj-beg 'allout-was-collapsed)) ;; 'resituate' if yanking an entire topic into topic header: (resituate (and (allout-e-o-prefix-p) (looking-at (concat "\\(" allout-regexp "\\)")) @@ -3554,7 +3517,7 @@ ;; `rectify-numbering' if resituating (where several topics may ;; be resituating) or yanking a topic into a topic slot (bol): (rectify-numbering (or resituate - (and (bolp) (looking-at allout-regexp))))) + (and into-bol (looking-at allout-regexp))))) (if resituate ; The yanked stuff is a topic: (let* ((prefix-len (- (match-end 1) subj-beg)) @@ -3575,7 +3538,6 @@ (allout-prefix-data (match-beginning 0) (match-end 0))) (allout-recent-depth)))) - done (more t)) (setq rectify-numbering allout-numbered-bullet) (if adjust-to-depth @@ -3616,7 +3578,7 @@ (progn (beginning-of-line) (delete-region (point) subj-beg) - (set-marker (my-mark-marker t) subj-end) + (set-marker (allout-mark-marker t) subj-end) (goto-char subj-beg) (allout-end-of-prefix)) ; Delete base subj prefix, @@ -3643,6 +3605,9 @@ nil ;;; index t)) (message "")))) + (when (and (or into-bol resituate) was-collapsed) + (remove-text-properties subj-beg (1+ subj-beg) '(allout-was-collapsed)) + (allout-hide-current-subtree)) (if (not resituate) (exchange-point-and-mark)))) ;;;_ > allout-yank (&optional arg) @@ -3678,7 +3643,8 @@ (setq this-command 'yank) (yank arg) (if (allout-mode-p) - (allout-yank-processing))) + (allout-yank-processing)) +) ;;;_ > allout-yank-pop (&optional arg) (defun allout-yank-pop (&optional arg) "Yank-pop like `allout-yank' when popping to bare outline prefixes. @@ -3736,93 +3702,51 @@ ;;;_ - Fundamental ;;;_ > allout-flag-region (from to flag) (defun allout-flag-region (from to flag) - "Hide or show lines from FROM to TO, via Emacs selective-display FLAG char. -Ie, text following flag C-m \(carriage-return) is hidden until the -next C-j (newline) char. - -Returns the endpoint of the region." - ;; "OFR-" prefixes to avoid collisions with vars in code calling the macro. - ;; ie, elisp macro vars are not 'hygenic', so distinct names are necessary. - (let ((was-inhibit-r-o inhibit-read-only) - (was-undo-list buffer-undo-list) - (was-modified (buffer-modified-p)) - trans) - (unwind-protect - (save-excursion - (setq inhibit-read-only t) - (setq buffer-undo-list t) - (if (> from to) - (setq trans from from to to trans)) - (subst-char-in-region from to - (if (= flag ?\n) ?\r ?\n) - flag t) - ;; adjust character read-protection on all the affected lines. - ;; we handle the region line-by-line. - (goto-char to) - (end-of-line) - (setq to (min (+ 2 (point)) (point-max))) - (goto-char from) - (beginning-of-line) - (while (< (point) to) - ;; handle from start of exposed to beginning of hidden, or eol: - (remove-text-properties (point) - (progn (if (re-search-forward "[\r\n]" - nil t) - (forward-char -1)) - (point)) - '(read-only nil)) - ;; handle from start of hidden, if any, to eol: - (if (and (not (eobp)) (= (char-after (point)) ?\r)) - (put-text-property (point) (progn (end-of-line) (point)) - 'read-only t)) - ;; Handle the end-of-line to beginning of next line: - (if (not (eobp)) - (progn (forward-char 1) - (remove-text-properties (1- (point)) (point) - '(read-only nil))))) - ) - (if (not was-modified) - (set-buffer-modified-p nil)) - (setq inhibit-read-only was-inhibit-r-o) - (setq buffer-undo-list was-undo-list) - ) - ) - ) + "Conceal text from FROM to TO if FLAG is non-nil, else reveal it. + +Text is shown if flag is nil and hidden otherwise." + ;; We use outline invisibility spec. + (remove-overlays from to 'category 'allout-overlay-category) + (when flag + (let ((o (make-overlay from to))) + (overlay-put o 'category 'allout-overlay-category) + (when (featurep 'xemacs) + (let ((props (symbol-plist 'allout-overlay-category))) + (while props + (overlay-put o (pop props) (pop props))))))) + (run-hooks 'allout-view-change-hook)) ;;;_ > allout-flag-current-subtree (flag) (defun allout-flag-current-subtree (flag) - "Hide or show subtree of currently-visible topic. - -See `allout-flag-region' for more details." + "Conceal currently-visible topic's subtree if FLAG non-nil, else reveal it." (save-excursion (allout-back-to-current-heading) - (let ((from (point)) - (to (progn (allout-end-of-current-subtree) (1- (point))))) - (allout-flag-region from to flag)))) + (end-of-line) + (allout-flag-region (point) + ;; Exposing must not leave trailing blanks hidden, + ;; but can leave them exposed when hiding, so we + ;; can use flag's inverse as the + ;; include-trailing-blank cue: + (allout-end-of-current-subtree (not flag)) + flag))) ;;;_ - Topic-specific -;;;_ > allout-show-entry () -(defun allout-show-entry () +;;;_ > allout-show-entry (&optional inclusive) +(defun allout-show-entry (&optional inclusive) "Like `allout-show-current-entry', reveals entries nested in hidden topics. This is a way to give restricted peek at a concealed locality without the expense of exposing its context, but can leave the outline with aberrant -exposure. `allout-hide-current-entry-completely' or `allout-show-offshoot' -should be used after the peek to rectify the exposure." +exposure. `allout-show-offshoot' should be used after the peek to rectify +the exposure." (interactive) (save-excursion - (let ((at (point)) - beg end) + (let (beg end) (allout-goto-prefix) - (setq beg (if (= (preceding-char) ?\r) (1- (point)) (point))) - (re-search-forward "[\n\r]" nil t) - (setq end (1- (if (< at (point)) - ;; We're on topic head line - show only it: - (point) - ;; or we're in body - include it: - (max beg (or (allout-pre-next-preface) (point)))))) - (allout-flag-region beg end ?\n) + (setq beg (if (allout-hidden-p) (1- (point)) (point))) + (setq end (allout-pre-next-prefix)) + (allout-flag-region beg end nil) (list beg end)))) ;;;_ > allout-show-children (&optional level strict) (defun allout-show-children (&optional level strict) @@ -3843,67 +3767,59 @@ point of non-opened subtree?)" (interactive "p") - (let (max-pos) + (let ((start-point (point))) (if (and (not strict) - (allout-hidden-p)) - - (progn (allout-show-to-offshoot) ; Point's concealed, open to - ; expose it. - ;; Then recurse, but with "strict" set so we don't - ;; infinite regress: - (setq max-pos (allout-show-children level t))) + (allout-hidden-p)) + + (progn (allout-show-to-offshoot) ; Point's concealed, open to + ; expose it. + ;; Then recurse, but with "strict" set so we don't + ;; infinite regress: + (allout-show-children level t)) (save-excursion - (save-restriction - (let* ((start-pt (point)) - (chart (allout-chart-subtree (or level 1))) - (to-reveal (allout-chart-to-reveal chart (or level 1)))) - (goto-char start-pt) - (if (and strict (= (preceding-char) ?\r)) - ;; Concealed root would already have been taken care of, - ;; unless strict was set. - (progn - (allout-flag-region (point) (allout-snug-back) ?\n) - (if allout-show-bodies - (progn (goto-char (car to-reveal)) - (allout-show-current-entry))))) - (while to-reveal - (goto-char (car to-reveal)) - (allout-flag-region (point) (allout-snug-back) ?\n) - (if allout-show-bodies - (progn (goto-char (car to-reveal)) - (allout-show-current-entry))) - (setq to-reveal (cdr to-reveal))))))))) -;;;_ > allout-hide-point-reconcile () -(defun allout-hide-reconcile () - "Like `allout-hide-current-entry'; hides completely if within hidden region. - -Specifically intended for aberrant exposure states, like entries that were -exposed by `allout-show-entry' but are within otherwise concealed regions." - (interactive) - (save-excursion - (allout-goto-prefix) - (allout-flag-region (if (not (bobp)) (1- (point)) (point)) - (progn (allout-pre-next-preface) - (if (= ?\r (following-char)) - (point) - (1- (point)))) - ?\r))) + (allout-beginning-of-current-line) + (save-restriction + (let* ((chart (allout-chart-subtree (or level 1))) + (to-reveal (allout-chart-to-reveal chart (or level 1)))) + (goto-char start-point) + (when (and strict (allout-hidden-p)) + ;; Concealed root would already have been taken care of, + ;; unless strict was set. + (allout-flag-region (point) (allout-snug-back) nil) + (when allout-show-bodies + (goto-char (car to-reveal)) + (allout-show-current-entry))) + (while to-reveal + (goto-char (car to-reveal)) + (allout-flag-region (save-excursion (allout-snug-back) (point)) + (progn (search-forward "\n" nil t) + (1- (point))) + nil) + (when allout-show-bodies + (goto-char (car to-reveal)) + (allout-show-current-entry)) + (setq to-reveal (cdr to-reveal))))))) + ;; Compensate for `save-excursion's maintenance of point + ;; within invisible text: + (goto-char start-point))) ;;;_ > allout-show-to-offshoot () (defun allout-show-to-offshoot () "Like `allout-show-entry', but reveals all concealed ancestors, as well. -As with `allout-hide-current-entry-completely', useful for rectifying -aberrant exposure states produced by `allout-show-entry'." - +Useful for coherently exposing to a random point in a hidden region." (interactive) (save-excursion (let ((orig-pt (point)) (orig-pref (allout-goto-prefix)) (last-at (point)) bag-it) - (while (or bag-it (= (preceding-char) ?\r)) - (beginning-of-line) + (while (or bag-it (allout-hidden-p)) + (while (allout-hidden-p) + ;; XXX We would use `(move-beginning-of-line 1)', but it gets + ;; stuck on hidden newlines at column 80, as of GNU Emacs 22.0.50. + (beginning-of-line) + (if (allout-hidden-p) (forward-char -1))) (if (= last-at (setq last-at (point))) ;; Oops, we're not making any progress! Show the current ;; topic completely, and bag this try. @@ -3926,38 +3842,24 @@ (interactive) (allout-back-to-current-heading) (save-excursion - (allout-flag-region (point) + (end-of-line) + (allout-flag-region (point) (progn (allout-end-of-entry) (point)) - ?\r))) + t))) ;;;_ > allout-show-current-entry (&optional arg) (defun allout-show-current-entry (&optional arg) - "Show body following current heading, or hide the entry if repeat count." + "Show body following current heading, or hide entry with universal argument." (interactive "P") (if arg (allout-hide-current-entry) + (save-excursion (allout-show-to-offshoot)) (save-excursion (allout-flag-region (point) - (progn (allout-end-of-entry) (point)) - ?\n) + (progn (allout-end-of-entry t) (point)) + nil) ))) -;;;_ > allout-hide-current-entry-completely () -; ... allout-hide-current-entry-completely also for isearch dynamic exposure: -(defun allout-hide-current-entry-completely () - "Like `allout-hide-current-entry', but conceal topic completely. - -Specifically intended for aberrant exposure states, like entries that were -exposed by `allout-show-entry' but are within otherwise concealed regions." - (interactive) - (save-excursion - (allout-goto-prefix) - (allout-flag-region (if (not (bobp)) (1- (point)) (point)) - (progn (allout-pre-next-preface) - (if (= ?\r (following-char)) - (point) - (1- (point)))) - ?\r))) ;;;_ > allout-show-current-subtree (&optional arg) (defun allout-show-current-subtree (&optional arg) "Show everything within the current topic. With a repeat-count, @@ -3970,11 +3872,27 @@ (error "No topics") ;; got to first, outermost topic - set to expose it and siblings: (message "Above outermost topic - exposing all.") - (allout-flag-region (point-min)(point-max) ?\n)) + (allout-flag-region (point-min)(point-max) nil)) + (allout-beginning-of-current-line) (if (not arg) - (allout-flag-current-subtree ?\n) + (allout-flag-current-subtree nil) (allout-beginning-of-level) (allout-expose-topic '(* :)))))) +;;;_ > allout-current-topic-collapsed-p (&optional include-single-liners) +(defun allout-current-topic-collapsed-p (&optional include-single-liners) + "True if the currently visible containing topic is already collapsed. + +If optional INCLUDE-SINGLE-LINERS is true, then include single-line +topics \(which intrinsically can be considered both collapsed and +not\), as collapsed. Otherwise they are considered uncollapsed." + (save-excursion + (and + (= (progn (allout-back-to-current-heading) + (move-end-of-line 1) + (point)) + (allout-end-of-current-subtree)) + (or include-single-liners + (progn (backward-char 1) (allout-hidden-p)))))) ;;;_ > allout-hide-current-subtree (&optional just-close) (defun allout-hide-current-subtree (&optional just-close) "Close the current topic, or containing topic if this one is already closed. @@ -3982,35 +3900,21 @@ If this topic is closed and it's a top level topic, close this topic and its siblings. -If optional arg JUST-CLOSE is non-nil, do not treat the parent or +If optional arg JUST-CLOSE is non-nil, do not close the parent or siblings, even if the target topic is already closed." (interactive) - (let ((from (point)) - (orig-eol (progn (end-of-line) - (if (not (allout-goto-prefix)) - (error "No topics found") - (end-of-line)(point))))) - (allout-flag-current-subtree ?\r) - (goto-char from) - (if (and (= orig-eol (progn (goto-char orig-eol) - (end-of-line) - (point))) - (not just-close) - ;; Structure didn't change - try hiding current level: - (goto-char from) - (if (allout-up-current-level 1 t) - t - (goto-char 0) - (let ((msg - "Top-level topic already closed - closing siblings...")) - (message msg) - (allout-expose-topic '(0 :)) - (message (concat msg " Done."))) - nil) - (/= (allout-recent-depth) 0)) - (allout-hide-current-subtree)) - (goto-char from))) + (let* ((from (point)) + (sibs-msg "Top-level topic already closed - closing siblings...") + (current-exposed (not (allout-current-topic-collapsed-p t)))) + (cond (current-exposed (allout-flag-current-subtree t)) + (just-close nil) + ((allout-up-current-level 1 t) (allout-hide-current-subtree)) + (t (goto-char 0) + (message sibs-msg) + (allout-expose-topic '(0 :)) + (message (concat sibs-msg " Done.")))) + (goto-char from))) ;;;_ > allout-show-current-branches () (defun allout-show-current-branches () "Show all subheadings of this heading, but not their bodies." @@ -4031,7 +3935,7 @@ "Show all of the text in the buffer." (interactive) (message "Exposing entire buffer...") - (allout-flag-region (point-min) (point-max) ?\n) + (allout-flag-region (point-min) (point-max) nil) (message "Exposing entire buffer... Done.")) ;;;_ > allout-hide-bodies () (defun allout-hide-bodies () @@ -4046,11 +3950,11 @@ (narrow-to-region start end) (goto-char (point-min)) (while (not (eobp)) - (allout-flag-region (point) - (progn (allout-pre-next-preface) (point)) ?\r) + (end-of-line) + (allout-flag-region (point) (allout-end-of-entry) t) (if (not (eobp)) (forward-char - (if (looking-at "[\n\r][\n\r]") + (if (looking-at "\n\n") 2 1))))))) ;;;_ > allout-expose-topic (spec) @@ -4117,9 +4021,7 @@ (let ((depth (allout-depth)) (max-pos 0) prev-elem curr-elem - stay done - snug-back - ) + stay) (while spec (setq prev-elem curr-elem curr-elem (car spec) @@ -4147,7 +4049,7 @@ (setq spec (append (make-list residue prev-elem) spec))))))) ((numberp curr-elem) - (if (and (>= 0 curr-elem) (allout-visible-p)) + (if (and (>= 0 curr-elem) (not (allout-hidden-p))) (save-excursion (allout-hide-current-subtree t) (if (> 0 curr-elem) nil @@ -4207,7 +4109,6 @@ (interactive "xExposure spec: ") (let ((depth (allout-current-depth)) - done max-pos) (cond ((null spec) nil) ((symbolp spec) @@ -4387,7 +4288,7 @@ (save-excursion (let* ;; state vars: - (strings prefix pad result depth new-depth out gone-out bullet beg + (strings prefix result depth new-depth out gone-out bullet beg next done) (goto-char start) @@ -4419,16 +4320,11 @@ beg ;To hidden text or end of line: (progn - (search-forward "\r" - (save-excursion (end-of-line) - (point)) - 1) - (if (= (preceding-char) ?\r) - (1- (point)) - (point)))) + (end-of-line) + (allout-back-to-visible-text))) strings)) - (if (< (point) next) ; Resume from after hid text, if any. - (forward-line 1)) + (when (< (point) next) ; Resume from after hid text, if any. + (line-move 1)) (setq beg (point))) ;; Accumulate list for this topic: (setq strings (nreverse strings)) @@ -4488,7 +4384,7 @@ ;;;_ > allout-process-exposed (&optional func from to frombuf ;;; tobuf format) (defun allout-process-exposed (&optional func from to frombuf tobuf - format &optional start-num) + format start-num) "Map function on exposed parts of current topic; results to another buffer. All args are options; default values itemized below. @@ -4694,13 +4590,6 @@ (page-numbering (if allout-number-pages "\\pagestyle{empty}\n" "")) - (linesdef (concat "\\def\\beginlines{" - "\\par\\begingroup\\nobreak\\medskip" - "\\parindent=0pt\n" - " \\kern1pt\\nobreak \\obeylines \\obeyspaces " - "\\everypar{\\strut}}\n" - "\\def\\endlines{" - "\\kern1pt\\endgroup\\medbreak\\noindent}\n")) (titlecmd (format "\\newcommand{\\titlecmd}[1]{{%s #1}}\n" allout-title-style)) (labelcmd (format "\\newcommand{\\labelcmd}[1]{{%s #1}}\n" @@ -4733,7 +4622,7 @@ (title (format "%s%s%s%s" "\\titlecmd{" (allout-latex-verb-quote (if allout-title - (condition-case err + (condition-case nil (eval allout-title) ('error "<unnamed buffer>")) "Unnamed Outline")) @@ -4913,7 +4802,7 @@ (interactive "P") (save-excursion (allout-back-to-current-heading) - (allout-toggle-subtree-encryption) + (allout-toggle-subtree-encryption fetch-pass) ) ) ;;;_ > allout-toggle-subtree-encryption (&optional fetch-pass) @@ -4948,20 +4837,23 @@ (progn (if (= (point-max) after-bullet-pos) (error "no body to encrypt")) (allout-encrypted-topic-p))) - (was-collapsed (if (not (re-search-forward "[\n\r]" nil t)) + (was-collapsed (if (not (search-forward "\n" nil t)) nil (backward-char 1) - (looking-at "\r"))) + (allout-hidden-p))) (subtree-beg (1+ (point))) (subtree-end (allout-end-of-subtree)) (subject-text (buffer-substring-no-properties subtree-beg subtree-end)) (subtree-end-char (char-after (1- subtree-end))) - (subtree-trailling-char (char-after subtree-end)) - (place-holder (if (or (string= "" subject-text) - (string= "\n" subject-text)) - (error "No topic contents to %scrypt" - (if was-encrypted "de" "en")))) + (subtree-trailing-char (char-after subtree-end)) + ;; kluge - result-text needs to be nil, but we also want to + ;; check for the error condition + (result-text (if (or (string= "" subject-text) + (string= "\n" subject-text)) + (error "No topic contents to %scrypt" + (if was-encrypted "de" "en")) + nil)) ;; Assess key parameters: (key-info (or ;; detect the type by which it is already encrypted @@ -4972,8 +4864,7 @@ '(symmetric nil))) (for-key-type (car key-info)) (for-key-identity (cadr key-info)) - (fetch-pass (and fetch-pass (member fetch-pass '(16 (16))))) - result-text) + (fetch-pass (and fetch-pass (member fetch-pass '(16 (16)))))) (setq result-text (allout-encrypt-string subject-text was-encrypted @@ -4987,12 +4878,12 @@ (delete-region subtree-beg subtree-end) (insert result-text) (if was-collapsed - (allout-flag-region subtree-beg (1- (point)) ?\r)) - ;; adjust trailling-blank-lines to preserve topic spacing: + (allout-flag-region (1- subtree-beg) (point) t)) + ;; adjust trailing-blank-lines to preserve topic spacing: (if (not was-encrypted) - (if (and (member subtree-end-char '(?\r ?\n)) - (member subtree-trailling-char '(?\r ?\n))) - (insert subtree-trailling-char))) + (if (and (= subtree-end-char ?\n) + (= subtree-trailing-char ?\n)) + (insert subtree-trailing-char))) ;; Ensure that the item has an encrypted-entry bullet: (if (not (string= (buffer-substring-no-properties (1- after-bullet-pos) after-bullet-pos) @@ -5060,8 +4951,7 @@ target-prompt-id (or (buffer-file-name allout-buffer) target-prompt-id)))) - (comment "Processed by allout driving pgg") - work-buffer result result-text status) + result-text status) (if (and fetch-pass (not passphrase)) ;; Force later fetch by evicting passphrase from the cache. @@ -5083,7 +4973,7 @@ retried fetch-pass))) (with-temp-buffer - (insert (subst-char-in-string ?\r ?\n text)) + (insert text) (cond @@ -5319,7 +5209,7 @@ (require 'pgg-parse) (save-excursion (with-temp-buffer - (insert (subst-char-in-string ?\r ?\n text)) + (insert text) (let* ((parsed-armor (pgg-parse-armor-region (point-min) (point-max))) (type (if (pgg-gpg-symmetric-key-p parsed-armor) 'symmetric @@ -5442,21 +5332,21 @@ (while (not done) (if (not (re-search-forward - (format "\\(\\`\\|[\n\r]\\)%s *%s[^*]" + (format "\\(\\`\\|\n\\)%s *%s[^*]" (regexp-quote allout-header-prefix) (regexp-quote allout-topic-encryption-bullet)) nil t)) (setq got nil done t) (goto-char (setq got (match-beginning 0))) - (if (looking-at "[\n\r]") + (if (looking-at "\n") (forward-char 1)) (setq got (point))) (cond ((not got) (setq done t)) - ((not (re-search-forward "[\n\r]")) + ((not (search-forward "\n")) (setq got nil done t)) @@ -5498,26 +5388,28 @@ (interactive "p") (save-excursion - (let ((current-mark (point-marker)) - was-modified - bo-subtree - editing-topic editing-point) + (let* ((current-mark (point-marker)) + (current-mark-position (marker-position current-mark)) + was-modified + bo-subtree + editing-topic editing-point) (goto-char (point-min)) (while (allout-next-topic-pending-encryption except-mark) (setq was-modified (buffer-modified-p)) - (if (save-excursion - (and (boundp 'allout-encrypt-unencrypted-on-saves) - allout-encrypt-unencrypted-on-saves - (setq bo-subtree (re-search-forward "[\n\r]")) - ;; Not collapsed: - (string= (match-string 0) "\n") - (>= current-mark (point)) - (allout-end-of-current-subtree) - (<= current-mark (point)))) + (when (save-excursion + (and (boundp 'allout-encrypt-unencrypted-on-saves) + allout-encrypt-unencrypted-on-saves + (setq bo-subtree (re-search-forward "$")) + (not (allout-hidden-p)) + (>= current-mark (point)) + (allout-end-of-current-subtree) + (<= current-mark (point)))) (setq editing-topic (point) ;; we had to wait for this 'til now so prior topics are ;; encrypted, any relevant text shifts are in place: - editing-point (marker-position current-mark))) + editing-point (- current-mark-position + (count-trailing-whitespace-region + bo-subtree current-mark-position)))) (allout-toggle-subtree-encryption) (if (not was-modified) (set-buffer-modified-p nil)) @@ -5579,11 +5471,11 @@ (setq beg (- (point) 16)) (setq suffix (buffer-substring-no-properties (point) - (progn (if (re-search-forward "[\n\r]" nil t) + (progn (if (search-forward "\n" nil t) (forward-char -1)) (point)))) (setq prefix (buffer-substring-no-properties - (progn (if (re-search-backward "[\n\r]" nil t) + (progn (if (search-backward "\n" nil t) (forward-char 1)) (point)) beg)) @@ -5639,7 +5531,7 @@ (allout-show-to-offshoot) (if (search-forward (concat "\n" prefix varname ":") nil t) (let* ((value-beg (point)) - (line-end (progn (if (re-search-forward "[\n\r]" nil t) + (line-end (progn (if (search-forward "\n" nil t) (forward-char -1)) (point))) (value-end (- line-end (length suffix)))) @@ -5710,26 +5602,29 @@ (regexp-sans-escapes (substring regexp 1))) ;; Exclude first char, but maintain count: (regexp-sans-escapes (substring regexp 1) successive-backslashes)))) -;;;_ - add-hook definition for divergent emacsen -;;;_ > add-hook (hook function &optional append) -(if (not (fboundp 'add-hook)) - (defun add-hook (hook function &optional append) - "Add to the value of HOOK the function FUNCTION unless already present. -\(It becomes the first hook on the list unless optional APPEND is non-nil, in -which case it becomes the last). HOOK should be a symbol, and FUNCTION may be -any valid function. HOOK's value should be a list of functions, not a single -function. If HOOK is void, it is first set to nil." - (or (boundp hook) (set hook nil)) - (or (if (consp function) - ;; Clever way to tell whether a given lambda-expression - ;; is equal to anything in the hook. - (let ((tail (assoc (cdr function) (symbol-value hook)))) - (equal function tail)) - (memq function (symbol-value hook))) - (set hook - (if append - (nconc (symbol-value hook) (list function)) - (cons function (symbol-value hook))))))) +;;;_ > count-trailing-whitespace-region (beg end) +(defun count-trailing-whitespace-region (beg end) + "Return number of trailing whitespace chars between BEG and END. + +If BEG is bigger than END we return 0." + (if (> beg end) + 0 + (save-excursion + (goto-char beg) + (let ((count 0)) + (while (re-search-forward "[ ][ ]*$" end t) + (goto-char (1+ (match-beginning 0))) + (setq count (1+ count))) + count)))) +;;;_ > allout-mark-marker to accommodate divergent emacsen: +(defun allout-mark-marker (&optional force buffer) + "Accommodate the different signature for `mark-marker' across Emacsen. + +XEmacs takes two optional args, while mainline GNU Emacs does not, +so pass them along when appropriate." + (if (featurep 'xemacs) + (apply 'mark-marker force buffer) + (mark-marker))) ;;;_ > subst-char-in-string if necessary (if (not (fboundp 'subst-char-in-string)) (defun subst-char-in-string (fromchar tochar string &optional inplace) @@ -5742,17 +5637,159 @@ (if (eq (aref newstr i) fromchar) (aset newstr i tochar))) newstr))) -;;;_ : my-mark-marker to accommodate divergent emacsen: -(defun my-mark-marker (&optional force buffer) - "Accommodate the different signature for `mark-marker' across Emacsen. - -XEmacs takes two optional args, while mainline GNU Emacs does not, -so pass them along when appropriate." - (if (featurep 'xemacs) - (apply 'mark-marker force buffer) - (mark-marker))) - -;;;_ #10 Under development +;;;_ > wholenump if necessary +(if (not (fboundp 'wholenump)) + (defalias 'wholenump 'natnump)) +;;;_ > remove-overlays if necessary +(if (not (fboundp 'remove-overlays)) + (defun remove-overlays (&optional beg end name val) + "Clear BEG and END of overlays whose property NAME has value VAL. +Overlays might be moved and/or split. +BEG and END default respectively to the beginning and end of buffer." + (unless beg (setq beg (point-min))) + (unless end (setq end (point-max))) + (if (< end beg) + (setq beg (prog1 end (setq end beg)))) + (save-excursion + (dolist (o (overlays-in beg end)) + (when (eq (overlay-get o name) val) + ;; Either push this overlay outside beg...end + ;; or split it to exclude beg...end + ;; or delete it entirely (if it is contained in beg...end). + (if (< (overlay-start o) beg) + (if (> (overlay-end o) end) + (progn + (move-overlay (copy-overlay o) + (overlay-start o) beg) + (move-overlay o end (overlay-end o))) + (move-overlay o (overlay-start o) beg)) + (if (> (overlay-end o) end) + (move-overlay o end (overlay-end o)) + (delete-overlay o))))))) + ) +;;;_ > copy-overlay if necessary - xemacs ~ 21.4 +(if (not (fboundp 'copy-overlay)) + (defun copy-overlay (o) + "Return a copy of overlay O." + (let ((o1 (make-overlay (overlay-start o) (overlay-end o) + ;; FIXME: there's no easy way to find the + ;; insertion-type of the two markers. + (overlay-buffer o))) + (props (overlay-properties o))) + (while props + (overlay-put o1 (pop props) (pop props))) + o1))) +;;;_ > add-to-invisibility-spec if necessary - xemacs ~ 21.4 +(if (not (fboundp 'add-to-invisibility-spec)) + (defun add-to-invisibility-spec (element) + "Add ELEMENT to `buffer-invisibility-spec'. +See documentation for `buffer-invisibility-spec' for the kind of elements +that can be added." + (if (eq buffer-invisibility-spec t) + (setq buffer-invisibility-spec (list t))) + (setq buffer-invisibility-spec + (cons element buffer-invisibility-spec)))) +;;;_ > remove-from-invisibility-spec if necessary - xemacs ~ 21.4 +(if (not (fboundp 'remove-from-invisibility-spec)) + (defun remove-from-invisibility-spec (element) + "Remove ELEMENT from `buffer-invisibility-spec'." + (if (consp buffer-invisibility-spec) + (setq buffer-invisibility-spec (delete element + buffer-invisibility-spec))))) +;;;_ > move-beginning-of-line if necessary - older emacs, xemacs +(if (not (fboundp 'move-beginning-of-line)) + (defun move-beginning-of-line (arg) + "Move point to beginning of current line as displayed. +\(This disregards invisible newlines such as those +which are part of the text that an image rests on.) + +With argument ARG not nil or 1, move forward ARG - 1 lines first. +If point reaches the beginning or end of buffer, it stops there. +To ignore intangibility, bind `inhibit-point-motion-hooks' to t. + +This function does not move point across a field boundary unless that +would move point to a different line than the original, unconstrained +result. If N is nil or 1, and a front-sticky field starts at point, +the point does not move. To ignore field boundaries bind +`inhibit-field-text-motion' to t." + (interactive "p") + (or arg (setq arg 1)) + (if (/= arg 1) + (condition-case nil (line-move (1- arg)) (error nil))) + + (let ((orig (point))) + ;; Move to beginning-of-line, ignoring fields and invisibles. + (skip-chars-backward "^\n") + (while (and (not (bobp)) (line-move-invisible-p (1- (point)))) + (goto-char (if (featurep 'xemacs) + (previous-property-change (point)) + (previous-char-property-change (point)))) + (skip-chars-backward "^\n")) + (vertical-motion 0) + (if (/= orig (point)) + (goto-char (constrain-to-field (point) orig (/= arg 1) t nil))))) +) +;;;_ > move-end-of-line if necessary - older emacs, xemacs +(if (not (fboundp 'move-end-of-line)) + (defun move-end-of-line (arg) + "Move point to end of current line as displayed. +\(This disregards invisible newlines such as those +which are part of the text that an image rests on.) + +With argument ARG not nil or 1, move forward ARG - 1 lines first. +If point reaches the beginning or end of buffer, it stops there. +To ignore intangibility, bind `inhibit-point-motion-hooks' to t. + +This function does not move point across a field boundary unless that +would move point to a different line than the original, unconstrained +result. If N is nil or 1, and a rear-sticky field ends at point, +the point does not move. To ignore field boundaries bind +`inhibit-field-text-motion' to t." + (interactive "p") + (or arg (setq arg 1)) + (let ((orig (point)) + done) + (while (not done) + (let ((newpos + (save-excursion + (let ((goal-column 0)) + (and (condition-case nil + (or (line-move arg) t) + (error nil)) + (not (bobp)) + (progn + (while (and (not (bobp)) (line-move-invisible-p (1- (point)))) + (goto-char (previous-char-property-change (point)))) + (backward-char 1))) + (point))))) + (goto-char newpos) + (if (and (> (point) newpos) + (eq (preceding-char) ?\n)) + (backward-char 1) + (if (and (> (point) newpos) (not (eobp)) + (not (eq (following-char) ?\n))) + ;; If we skipped something intangible + ;; and now we're not really at eol, + ;; keep going. + (setq arg 1) + (setq done t))))) + (if (/= orig (point)) + (goto-char (constrain-to-field (point) orig (/= arg 1) t + nil))))) + ) +;;;_ > line-move-invisible-p if necessary +(if (not (fboundp 'line-move-invisible-p)) + (defun line-move-invisible-p (pos) + "Return non-nil if the character after POS is currently invisible." + (let ((prop + (get-char-property pos 'invisible))) + (if (eq buffer-invisibility-spec t) + prop + (or (memq prop buffer-invisibility-spec) + (assq prop buffer-invisibility-spec)))))) + + +;;;_ #10 Unfinished ;;;_ > allout-bullet-isearch (&optional bullet) (defun allout-bullet-isearch (&optional bullet) "Isearch \(regexp) for topic with bullet BULLET." @@ -5769,8 +5806,9 @@ bullet))) (isearch-repeat 'forward) (isearch-mode t))) -;;;_ ? Re hooking up with isearch - use isearch-op-fun rather than -;;; wrapping the isearch functions. + +;;;_ #11 Provide +(provide 'allout) ;;;_* Local emacs vars. ;;; The following `allout-layout' local variable setting:
--- a/lisp/buff-menu.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/buff-menu.el Mon Feb 20 16:30:15 2006 +0000 @@ -706,9 +706,9 @@ list desired-point) (when Buffer-menu-use-header-line (let ((pos 0)) - ;; Turn spaces in the header into stretch specs so they work - ;; regardless of the header-line face. - (while (string-match "[ \t]+" header pos) + ;; Turn whitespace chars in the header into stretch specs so + ;; they work regardless of the header-line face. + (while (string-match "[ \t\n]+" header pos) (setq pos (match-end 0)) (put-text-property (match-beginning 0) pos 'display ;; Assume fixed-size chars in the buffer. @@ -726,6 +726,7 @@ (erase-buffer) (setq standard-output (current-buffer)) (unless Buffer-menu-use-header-line + ;; Use U+2014 (EM DASH) to underline if possible, else U+002D (HYPHEN-MINUS) (let ((underline (if (char-displayable-p ?—) ?— ?-))) (insert header (apply 'string
--- a/lisp/calendar/icalendar.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/calendar/icalendar.el Mon Feb 20 16:30:15 2006 +0000 @@ -705,7 +705,7 @@ "Export diary file to iCalendar format. All diary entries in the file DIARY-FILENAME are converted to iCalendar format. The result is appended to the file ICAL-FILENAME." - (interactive "FExport diary data from file: + (interactive "FExport diary data from file: Finto iCalendar file: ") (save-current-buffer (set-buffer (find-file diary-filename)) @@ -1449,8 +1449,8 @@ Argument DIARY-FILENAME input `diary-file'. Optional argument NON-MARKING determines whether events are created as non-marking or not." - (interactive "fImport iCalendar data from file: -Finto diary file: + (interactive "fImport iCalendar data from file: +Finto diary file: p") ;; clean up the diary file (save-current-buffer
--- a/lisp/cus-edit.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/cus-edit.el Mon Feb 20 16:30:15 2006 +0000 @@ -932,6 +932,7 @@ "Set customized value for %s to: " current-prefix-arg)) (custom-load-symbol variable) + (custom-push-theme 'theme-value variable 'user 'set (custom-quote value)) (funcall (or (get variable 'custom-set) 'set-default) variable value) (put variable 'customized-value (list (custom-quote value))) (cond ((string= comment "") @@ -4166,7 +4167,9 @@ (mapatoms (lambda (symbol) (if (and (get symbol 'saved-value) - (eq 'user (car (car-safe (get symbol 'theme-value))))) + ;; ignore theme values + (or (null (get symbol 'theme-value)) + (eq 'user (caar (get symbol 'theme-value))))) (nconc saved-list (list symbol))))) (setq saved-list (sort (cdr saved-list) 'string<)) (unless (bolp)
--- a/lisp/custom.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/custom.el Mon Feb 20 16:30:15 2006 +0000 @@ -690,7 +690,9 @@ (not (equal value (condition-case nil (eval (car old)) (error nil))))) - (put symbol 'customized-value (list (custom-quote value))) + (progn (put symbol 'customized-value (list (custom-quote value))) + (custom-push-theme 'theme-value symbol 'user 'set + (custom-quote value))) (put symbol 'customized-value nil)) ;; Changed? (not (equal customized (get symbol 'customized-value)))))
--- a/lisp/ediff-diff.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/ediff-diff.el Mon Feb 20 16:30:15 2006 +0000 @@ -26,7 +26,6 @@ ;;; Code: -(provide 'ediff-diff) ;; compiler pacifier (defvar ediff-default-variant) @@ -129,13 +128,33 @@ (defcustom ediff-diff-options "" "*Options to pass to `ediff-diff-program'. -If Unix diff is used as `ediff-diff-program', then the most useful options are +If Unix diff is used as `ediff-diff-program', then a useful option is `-w', to ignore space, and `-i', to ignore case of letters. -At present, the option `-c' is not allowed." +Options `-c' and `-i' are not allowed. Case sensitivity can be toggled +interactively using [ediff-toggle-ignore-case]" :set 'ediff-reset-diff-options :type 'string :group 'ediff-diff) +(ediff-defvar-local ediff-ignore-case nil + "*If t, skip over difference regions that differ only in letter case. +This variable can be set either in .emacs or toggled interactively. +Use `setq-default' if setting it in .emacs") + +(defcustom ediff-ignore-case-option "-i" + "*Option that causes the diff program to ignore case of letters." + :type 'string + :group 'ediff-diff) + +(defcustom ediff-ignore-case-option3 "" + "*Option that causes the diff3 program to ignore case of letters. +GNU diff3 doesn't have such an option." + :type 'string + :group 'ediff-diff) + +;; the actual options used in comparison +(ediff-defvar-local ediff-actual-diff-options "" "") + (defcustom ediff-custom-diff-program ediff-diff-program "*Program to use for generating custom diff output for saving it in a file. This output is not used by Ediff internally." @@ -155,6 +174,10 @@ :set 'ediff-reset-diff-options :type 'string :group 'ediff-diff) + +;; the actual options used in comparison +(ediff-defvar-local ediff-actual-diff3-options "" "") + (defcustom ediff-diff3-ok-lines-regexp "^\\([1-3]:\\|====\\| \\|.*Warning *:\\|.*No newline\\|.*missing newline\\|^\C-m$\\)" "*Regexp that matches normal output lines from `ediff-diff3-program'. @@ -182,7 +205,7 @@ This variable can be set either in .emacs or toggled interactively. Use `setq-default' if setting it in .emacs") -(ediff-defvar-local ediff-auto-refine-limit 1400 +(ediff-defvar-local ediff-auto-refine-limit 14000 "*Auto-refine only the regions of this size \(in bytes\) or less.") ;;; General @@ -227,9 +250,9 @@ ;; ediff-setup-diff-regions-function, which can also have the value ;; ediff-setup-diff-regions3, which takes 4 arguments. (defun ediff-setup-diff-regions (file-A file-B file-C) - ;; looking either for '-c' or a 'c' in a set of clustered non-long options - (if (string-match "^-c\\| -c\\|-[^- ]+c" ediff-diff-options) - (error "Option `-c' is not allowed in `ediff-diff-options'")) + ;; looking for '-c', '-i', or a 'c', 'i' among clustered non-long options + (if (string-match "^-[ci]\\| -[ci]\\|-[^- ]+[ci]" ediff-diff-options) + (error "Options `-c' and `-i' are not allowed in `ediff-diff-options'")) ;; create, if it doesn't exist (or (ediff-buffer-live-p ediff-diff-buffer) @@ -266,7 +289,7 @@ (ediff-exec-process ediff-diff-program diff-buffer 'synchronize - ediff-diff-options file1 file2) + ediff-actual-diff-options file1 file2) (message "") (ediff-with-current-buffer diff-buffer (buffer-size)))))) @@ -284,7 +307,9 @@ (let (diff3-job diff-program diff-options ok-regexp diff-list) (setq diff3-job ediff-3way-job diff-program (if diff3-job ediff-diff3-program ediff-diff-program) - diff-options (if diff3-job ediff-diff3-options ediff-diff-options) + diff-options (if diff3-job + ediff-actual-diff3-options + ediff-actual-diff-options) ok-regexp (if diff3-job ediff-diff3-ok-lines-regexp ediff-diff-ok-lines-regexp)) @@ -366,11 +391,14 @@ (B-buffer ediff-buffer-B) (C-buffer ediff-buffer-C) (a-prev 1) ; this is needed to set the first diff line correctly + (a-prev-pt nil) (b-prev 1) + (b-prev-pt nil) (c-prev 1) + (c-prev-pt nil) diff-list shift-A shift-B ) - + ;; diff list contains word numbers, unless changed later (setq diff-list (cons (if word-mode 'words 'points) diff-list)) @@ -382,7 +410,7 @@ shift-B (ediff-overlay-start (ediff-get-value-according-to-buffer-type 'B bounds)))) - + ;; reset point in buffers A/B/C (ediff-with-current-buffer A-buffer (goto-char (if shift-A shift-A (point-min)))) @@ -466,11 +494,13 @@ ;; we must disable and then restore longlines-mode (if (eq longlines-mode-val 1) (longlines-mode 0)) + (goto-char (or a-prev-pt shift-A (point-min))) (forward-line (- a-begin a-prev)) (setq a-begin-pt (point)) (forward-line (- a-end a-begin)) (setq a-end-pt (point) - a-prev a-end) + a-prev a-end + a-prev-pt a-end-pt) (if (eq longlines-mode-val 1) (longlines-mode longlines-mode-val)) )) @@ -479,11 +509,13 @@ (if (and (boundp 'longlines-mode) longlines-mode) 1 0))) (if (eq longlines-mode-val 1) (longlines-mode 0)) + (goto-char (or b-prev-pt shift-B (point-min))) (forward-line (- b-begin b-prev)) (setq b-begin-pt (point)) (forward-line (- b-end b-begin)) (setq b-end-pt (point) - b-prev b-end) + b-prev b-end + b-prev-pt b-end-pt) (if (eq longlines-mode-val 1) (longlines-mode longlines-mode-val)) )) @@ -493,11 +525,13 @@ (if (and (boundp 'longlines-mode) longlines-mode) 1 0))) (if (eq longlines-mode-val 1) (longlines-mode 0)) + (goto-char (or c-prev-pt (point-min))) (forward-line (- c-begin c-prev)) (setq c-begin-pt (point)) (forward-line (- c-end c-begin)) (setq c-end-pt (point) - c-prev c-end) + c-prev c-end + c-prev-pt c-end-pt) (if (eq longlines-mode-val 1) (longlines-mode longlines-mode-val)) ))) @@ -987,8 +1021,11 @@ (C-buffer ediff-buffer-C) (anc-buffer ediff-ancestor-buffer) (a-prev 1) ; needed to set the first diff line correctly + (a-prev-pt nil) (b-prev 1) + (b-prev-pt nil) (c-prev 1) + (c-prev-pt nil) (anc-prev 1) diff-list shift-A shift-B shift-C ) @@ -1089,11 +1126,13 @@ ;; we must disable and then restore longlines-mode (if (eq longlines-mode-val 1) (longlines-mode 0)) + (goto-char (or a-prev-pt shift-A (point-min))) (forward-line (- a-begin a-prev)) (setq a-begin-pt (point)) (forward-line (- a-end a-begin)) (setq a-end-pt (point) - a-prev a-end) + a-prev a-end + a-prev-pt a-end-pt) (if (eq longlines-mode-val 1) (longlines-mode longlines-mode-val)) )) @@ -1102,11 +1141,13 @@ (if (and (boundp 'longlines-mode) longlines-mode) 1 0))) (if (eq longlines-mode-val 1) (longlines-mode 0)) + (goto-char (or b-prev-pt shift-B (point-min))) (forward-line (- b-begin b-prev)) (setq b-begin-pt (point)) (forward-line (- b-end b-begin)) (setq b-end-pt (point) - b-prev b-end) + b-prev b-end + b-prev-pt b-end-pt) (if (eq longlines-mode-val 1) (longlines-mode longlines-mode-val)) )) @@ -1115,11 +1156,13 @@ (if (and (boundp 'longlines-mode) longlines-mode) 1 0))) (if (eq longlines-mode-val 1) (longlines-mode 0)) + (goto-char (or c-prev-pt shift-C (point-min))) (forward-line (- c-begin c-prev)) (setq c-begin-pt (point)) (forward-line (- c-end c-begin)) (setq c-end-pt (point) - c-prev c-end) + c-prev c-end + c-prev-pt c-end-pt) (if (eq longlines-mode-val 1) (longlines-mode longlines-mode-val)) )) @@ -1171,13 +1214,17 @@ ;; File-C is either the third file to compare (in case of 3-way comparison) ;; or it is the ancestor file. (defun ediff-setup-diff-regions3 (file-A file-B file-C) + ;; looking for '-i' or a 'i' among clustered non-long options + (if (string-match "^-i\\| -i\\|-[^- ]+i" ediff-diff-options) + (error "Option `-i' is not allowed in `ediff-diff3-options'")) + (or (ediff-buffer-live-p ediff-diff-buffer) (setq ediff-diff-buffer (get-buffer-create (ediff-unique-buffer-name "*ediff-diff" "*")))) (message "Computing differences ...") (ediff-exec-process ediff-diff3-program ediff-diff-buffer 'synchronize - ediff-diff3-options file-A file-B file-C) + ediff-actual-diff3-options file-A file-B file-C) (ediff-prepare-error-list ediff-diff3-ok-lines-regexp ediff-diff-buffer) ;;(message "Computing differences ... done") @@ -1471,6 +1518,35 @@ (setq file-list-list (cdr file-list-list))) (reverse result))) +;; Ignore case handling - some ideas from drew.adams@@oracle.com +(defun ediff-toggle-ignore-case () + (interactive) + (ediff-barf-if-not-control-buffer) + (setq ediff-ignore-case (not ediff-ignore-case)) + (cond (ediff-ignore-case + (setq ediff-actual-diff-options + (concat ediff-diff-options " " ediff-ignore-case-option) + ediff-actual-diff3-options + (concat ediff-diff3-options " " ediff-ignore-case-option3)) + (message "Ignoring regions that differ only in case")) + (t + (setq ediff-actual-diff-options ediff-diff-options + ediff-actual-diff3-options ediff-diff3-options) + (message "Ignoring case differences turned OFF"))) + (cond (ediff-merge-job + (message "Ignoring letter case is too dangerous in merge jobs")) + ((and ediff-diff3-job (string= ediff-ignore-case-option3 "")) + (message "Ignoring letter case is not supported by this diff3 program")) + ((and (not ediff-3way-job) (string= ediff-ignore-case-option "")) + (message "Ignoring letter case is not supported by this diff program")) + (t + (sit-for 1) + (ediff-update-diffs))) + ) + + +(provide 'ediff-diff) + ;;; Local Variables: ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
--- a/lisp/ediff-help.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/ediff-help.el Mon Feb 20 16:30:15 2006 +0000 @@ -26,7 +26,6 @@ ;;; Code: -(provide 'ediff-help) ;; Compiler pacifier start (defvar ediff-multiframe) @@ -61,8 +60,8 @@ p,DEL -previous diff | | -vert/horiz split | xy -copy buf X's region to Y n,SPC -next diff | h -hilighting | rx -restore buf X's old diff j -jump to diff | @ -auto-refinement | * -refine current region - gx -goto X's point| | ! -update diff regions - C-l -recenter | ## -ignore whitespace | + gx -goto X's point| ## -ignore whitespace | ! -update diff regions + C-l -recenter | #c -ignore case | v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X </> -scroll lt/rt | X -read-only in buf X | wd -save diff output ~ -rotate buffers| m -wide display | @@ -75,8 +74,8 @@ p,DEL -previous diff | | -vert/horiz split |a/b -copy A/B's region to B/A n,SPC -next diff | h -hilighting | rx -restore buf X's old diff j -jump to diff | @ -auto-refinement | * -refine current region - gx -goto X's point| | ! -update diff regions - C-l -recenter | ## -ignore whitespace | + gx -goto X's point| ## -ignore whitespace | ! -update diff regions + C-l -recenter | #c -ignore case | v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X </> -scroll lt/rt | X -read-only in buf X | wd -save diff output ~ -swap variants | m -wide display | @@ -89,8 +88,8 @@ p,DEL -previous diff | | -vert/horiz split |a/b -copy A/B's region to B/A n,SPC -next diff | h -hilighting | rx -restore buf X's old diff j -jump to diff | @ -auto-refinement | * -refine current region - gx -goto X's point| % -narrow/widen buffs | ! -update diff regions - C-l -recenter | ## -ignore whitespace | + gx -goto X's point| ## -ignore whitespace | ! -update diff regions + C-l -recenter | #c -ignore case | % -narrow/widen buffs v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X </> -scroll lt/rt | X -read-only in buf X | wd -save diff output ~ -swap variants | m -wide display | @@ -103,8 +102,8 @@ p,DEL -previous diff | | -vert/horiz split | xy -copy buf X's region to Y n,SPC -next diff | h -hilighting | rx -restore buf X's old diff j -jump to diff | | - gx -goto X's point| % -narrow/widen buffs | ! -recompute diffs - C-l -recenter | | + gx -goto X's point| % -narrow/widen buffs | ! -recompute diffs + C-l -recenter | #c -ignore case | v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X </> -scroll lt/rt | X -read-only in buf X | wd -save diff output ~ -swap variants | m -wide display | @@ -228,6 +227,7 @@ ((string= cmd "r") (re-search-forward "^`r'")) ((string= cmd "rx") (re-search-forward "^`ra'")) ((string= cmd "##") (re-search-forward "^`##'")) + ((string= cmd "#c") (re-search-forward "^`#c'")) ((string= cmd "#f/#h") (re-search-forward "^`#f'")) ((string= cmd "X") (re-search-forward "^`A'")) ((string= cmd "v/V") (re-search-forward "^`v'")) @@ -325,5 +325,8 @@ (customize-group "ediff")) +(provide 'ediff-help) + + ;;; arch-tag: 05659813-7fcf-4274-964f-d2f577431a9d ;;; ediff-help.el ends here
--- a/lisp/ediff-hook.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/ediff-hook.el Mon Feb 20 16:30:15 2006 +0000 @@ -371,5 +371,6 @@ (provide 'ediff-hook) + ;;; arch-tag: 512f8656-8a4b-4789-af5d-5c6144498df3 ;;; ediff-hook.el ends here
--- a/lisp/ediff-init.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/ediff-init.el Mon Feb 20 16:30:15 2006 +0000 @@ -1867,6 +1867,7 @@ (set-buffer ,old-buffer) (set-syntax-table ,old-table))))))) + (provide 'ediff-init)
--- a/lisp/ediff-merg.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/ediff-merg.el Mon Feb 20 16:30:15 2006 +0000 @@ -26,7 +26,6 @@ ;;; Code: -(provide 'ediff-merg) ;; compiler pacifier (defvar ediff-window-A) @@ -390,6 +389,9 @@ ))) +(provide 'ediff-merg) + + ;;; Local Variables: ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun) ;;; eval: (put 'ediff-with-current-buffer 'lisp-indent-hook 1)
--- a/lisp/ediff-mult.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/ediff-mult.el Mon Feb 20 16:30:15 2006 +0000 @@ -104,7 +104,6 @@ ;;; Code: -(provide 'ediff-mult) (defgroup ediff-mult nil "Multi-file and multi-buffer processing in Ediff." @@ -123,7 +122,6 @@ ;; end pacifier (require 'ediff-init) -(require 'ediff-util) ;; meta-buffer (ediff-defvar-local ediff-meta-buffer nil "") @@ -1473,6 +1471,7 @@ (ediff-overlay-put overl 'highlight t)) (ediff-overlay-put overl 'ediff-meta-info prop) (ediff-overlay-put overl 'invisible hidden) + (ediff-overlay-put overl 'follow-link t) (if (numberp session-number) (ediff-overlay-put overl 'ediff-meta-session-number session-number)))) @@ -2384,6 +2383,8 @@ )) +(provide 'ediff-mult) + ;;; Local Variables: ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
--- a/lisp/ediff-ptch.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/ediff-ptch.el Mon Feb 20 16:30:15 2006 +0000 @@ -26,7 +26,6 @@ ;;; Code: -(provide 'ediff-ptch) (defgroup ediff-ptch nil "Ediff patch support." @@ -844,6 +843,8 @@ +(provide 'ediff-ptch) + ;;; Local Variables: ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
--- a/lisp/ediff-util.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/ediff-util.el Mon Feb 20 16:30:15 2006 +0000 @@ -26,7 +26,6 @@ ;;; Code: -(provide 'ediff-util) ;; Compiler pacifier (defvar ediff-patch-diagnostics) @@ -49,6 +48,7 @@ (eval-when-compile (let ((load-path (cons (expand-file-name ".") load-path))) + (provide 'ediff-util) ; to break recursive load cycle (or (featurep 'ediff-init) (load "ediff-init.el" nil nil 'nosuffix)) (or (featurep 'ediff-help) @@ -234,6 +234,7 @@ (define-key ediff-mode-map "#" nil) (define-key ediff-mode-map "#h" 'ediff-toggle-regexp-match) (define-key ediff-mode-map "#f" 'ediff-toggle-regexp-match) + (define-key ediff-mode-map "#c" 'ediff-toggle-ignore-case) (or ediff-word-mode (define-key ediff-mode-map "##" 'ediff-toggle-skip-similar)) (define-key ediff-mode-map "o" nil) @@ -1133,7 +1134,7 @@ ;; )) -(defsubst ediff-file-checked-out-p (file) +(defun ediff-file-checked-out-p (file) (or (not (featurep 'vc-hooks)) (and (vc-backend file) (if (fboundp 'vc-state) @@ -1143,7 +1144,7 @@ (vc-locking-user file)) ))) -(defsubst ediff-file-checked-in-p (file) +(defun ediff-file-checked-in-p (file) (and (featurep 'vc-hooks) ;; CVS files are considered not checked in (not (memq (vc-backend file) '(nil CVS))) @@ -3079,7 +3080,7 @@ ))) -(defsubst ediff-highlight-diff (n) +(defun ediff-highlight-diff (n) "Put face on diff N. Invoked for X displays only." (ediff-highlight-diff-in-one-buffer n 'A) (ediff-highlight-diff-in-one-buffer n 'B) @@ -3088,7 +3089,7 @@ ) -(defsubst ediff-unhighlight-diff () +(defun ediff-unhighlight-diff () "Remove overlays from buffers A, B, and C." (ediff-unhighlight-diff-in-one-buffer 'A) (ediff-unhighlight-diff-in-one-buffer 'B) @@ -3097,7 +3098,7 @@ ) ;; delete highlighting overlays, restore faces to their original form -(defsubst ediff-unhighlight-diffs-totally () +(defun ediff-unhighlight-diffs-totally () (ediff-unhighlight-diffs-totally-in-one-buffer 'A) (ediff-unhighlight-diffs-totally-in-one-buffer 'B) (ediff-unhighlight-diffs-totally-in-one-buffer 'C) @@ -3686,7 +3687,7 @@ (>= (point) end)))))) -(defsubst ediff-get-region-contents (n buf-type ctrl-buf &optional start end) +(defun ediff-get-region-contents (n buf-type ctrl-buf &optional start end) (ediff-with-current-buffer (ediff-with-current-buffer ctrl-buf (ediff-get-buffer buf-type)) (buffer-substring @@ -3945,6 +3946,7 @@ (ediff-device-type (ediff-device-type)) varlist salutation buffer-name) (setq varlist '(ediff-diff-program ediff-diff-options + ediff-diff3-program ediff-diff3-options ediff-patch-program ediff-patch-options ediff-shell ediff-use-faces @@ -4300,6 +4302,8 @@ (run-hooks 'ediff-load-hook) +(provide 'ediff-util) + ;;; Local Variables: ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
--- a/lisp/ediff-vers.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/ediff-vers.el Mon Feb 20 16:30:15 2006 +0000 @@ -311,6 +311,7 @@ (provide 'ediff-vers) + ;;; Local Variables: ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun) ;;; eval: (put 'ediff-with-current-buffer 'lisp-indent-hook 1)
--- a/lisp/ediff-wind.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/ediff-wind.el Mon Feb 20 16:30:15 2006 +0000 @@ -26,7 +26,6 @@ ;;; Code: -(provide 'ediff-wind) ;; Compiler pacifier (defvar icon-title-format) @@ -1314,6 +1313,9 @@ ediff-wide-display-p))))))) +(provide 'ediff-wind) + + ;;; Local Variables: ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun) ;;; eval: (put 'ediff-with-current-buffer 'lisp-indent-hook 1)
--- a/lisp/ediff.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/ediff.el Mon Feb 20 16:30:15 2006 +0000 @@ -7,8 +7,8 @@ ;; Created: February 2, 1994 ;; Keywords: comparing, merging, patching, tools, unix -(defconst ediff-version "2.80.1" "The current version of Ediff") -(defconst ediff-date "November 25, 2005" "Date of last update") +(defconst ediff-version "2.81" "The current version of Ediff") +(defconst ediff-date "February 18, 2006" "Date of last update") ;; This file is part of GNU Emacs. @@ -107,7 +107,6 @@ ;;; Code: -(provide 'ediff) ;; Compiler pacifier (defvar cvs-cookie-handle) @@ -121,6 +120,7 @@ (load "pcl-cvs" 'noerror))) (eval-when-compile (let ((load-path (cons (expand-file-name ".") load-path))) + (provide 'ediff) ; to break recursive load cycle (or (featurep 'ediff-init) (load "ediff-init.el" nil nil 'nosuffix)) (or (featurep 'ediff-mult) @@ -1374,7 +1374,7 @@ patch-buf (read-buffer "Which buffer to patch? " - (current-buffer)))) + (ediff-other-buffer patch-buf)))) ;;;###autoload @@ -1533,6 +1533,9 @@ (run-hooks 'ediff-load-hook) +(provide 'ediff) + + ;;; Local Variables: ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun) ;;; eval: (put 'ediff-with-current-buffer 'lisp-indent-hook 1)
--- a/lisp/emulation/viper-cmd.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/emulation/viper-cmd.el Mon Feb 20 16:30:15 2006 +0000 @@ -196,6 +196,15 @@ (viper-save-cursor-color 'before-insert-mode)) ;; set insert mode cursor color (viper-change-cursor-color viper-insert-state-cursor-color))) + (if (eq viper-current-state 'emacs-state) + (let ((has-saved-cursor-color-in-emacs-mode + (stringp (viper-get-saved-cursor-color-in-emacs-mode)))) + (or has-saved-cursor-color-in-emacs-mode + (string= (viper-get-cursor-color) viper-emacs-state-cursor-color) + ;; save current color, if not already saved + (viper-save-cursor-color 'before-emacs-mode)) + ;; set emacs mode cursor color + (viper-change-cursor-color viper-emacs-state-cursor-color))) (if (and (memq this-command '(dabbrev-expand hippie-expand)) (integerp viper-pre-command-point) @@ -643,10 +652,13 @@ (indent-to-left-margin)) (viper-add-newline-at-eob-if-necessary) (viper-adjust-undo) + + (if (eq viper-current-state 'emacs-state) + (viper-restore-cursor-color 'after-emacs-mode) + (viper-restore-cursor-color 'after-insert-mode)) + (viper-change-state 'vi-state) - (viper-restore-cursor-color 'after-insert-mode) - ;; Protect against user errors in hooks (condition-case conds (run-hooks 'viper-vi-state-hook) @@ -709,9 +721,17 @@ (or (viper-overlay-p viper-replace-overlay) (viper-set-replace-overlay (point-min) (point-min))) (viper-hide-replace-overlay) + + (let ((has-saved-cursor-color-in-emacs-mode + (stringp (viper-get-saved-cursor-color-in-emacs-mode)))) + (or has-saved-cursor-color-in-emacs-mode + (string= (viper-get-cursor-color) viper-emacs-state-cursor-color) + (viper-save-cursor-color 'before-emacs-mode)) + (viper-change-cursor-color viper-emacs-state-cursor-color)) + (viper-change-state 'emacs-state) - ;; Protect agains user errors in hooks + ;; Protect against user errors in hooks (condition-case conds (run-hooks 'viper-emacs-state-hook) (error @@ -820,12 +840,12 @@ ;; The next cmd and viper-set-unread-command-events ;; are intended to prevent the input method ;; from swallowing ^M, ^Q and other special characters - (setq ch (read-char)) + (setq ch (read-char-exclusive)) ;; replace ^M with the newline (if (eq ch ?\C-m) (setq ch ?\n)) ;; Make sure ^V and ^Q work as quotation chars (if (memq ch '(?\C-v ?\C-q)) - (setq ch (read-char))) + (setq ch (read-char-exclusive))) (viper-set-unread-command-events ch) (quail-input-method nil) @@ -842,12 +862,12 @@ ;; same as above but for XEmacs, which doesn't have ;; quail-input-method (let (unread-command-events) - (setq ch (read-char)) + (setq ch (read-char-exclusive)) ;; replace ^M with the newline (if (eq ch ?\C-m) (setq ch ?\n)) ;; Make sure ^V and ^Q work as quotation chars (if (memq ch '(?\C-v ?\C-q)) - (setq ch (read-char))) + (setq ch (read-char-exclusive))) (viper-set-unread-command-events ch) (quail-start-translation nil) @@ -867,12 +887,12 @@ (setq ch (aref (read-key-sequence nil) 0))) (insert ch)) (t - (setq ch (read-char)) + (setq ch (read-char-exclusive)) ;; replace ^M with the newline (if (eq ch ?\C-m) (setq ch ?\n)) ;; Make sure ^V and ^Q work as quotation chars (if (memq ch '(?\C-v ?\C-q)) - (setq ch (read-char))) + (setq ch (read-char-exclusive))) (insert ch)) ) (setq last-command-event @@ -2131,7 +2151,7 @@ Remove this function from `viper-minibuffer-exit-hook', if this causes problems." (if (viper-is-in-minibuffer) - (progn + (let ((inhibit-field-text-motion t)) (goto-char (viper-minibuffer-real-start)) (end-of-line) (delete-region (point) (point-max)))))
--- a/lisp/emulation/viper-init.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/emulation/viper-init.el Mon Feb 20 16:30:15 2006 +0000 @@ -434,6 +434,13 @@ (if (fboundp 'make-variable-frame-local) (make-variable-frame-local 'viper-insert-state-cursor-color)) +(defcustom viper-emacs-state-cursor-color "Magenta" + "Cursor color when Viper is in emacs state." + :type 'string + :group 'viper) +(if (fboundp 'make-variable-frame-local) + (make-variable-frame-local 'viper-emacs-state-cursor-color)) + ;; internal var, used to remember the default cursor color of emacs frames (defvar viper-vi-state-cursor-color nil) (if (fboundp 'make-variable-frame-local)
--- a/lisp/emulation/viper-util.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/emulation/viper-util.el Mon Feb 20 16:30:15 2006 +0000 @@ -175,9 +175,12 @@ (selected-frame) (list (cons - (if (eq before-which-mode 'before-replace-mode) - 'viper-saved-cursor-color-in-replace-mode - 'viper-saved-cursor-color-in-insert-mode) + (cond ((eq before-which-mode 'before-replace-mode) + 'viper-saved-cursor-color-in-replace-mode) + ((eq before-which-mode 'before-emacs-mode) + 'viper-saved-cursor-color-in-emacs-mode) + (t + 'viper-saved-cursor-color-in-insert-mode)) color))) )))) @@ -188,7 +191,9 @@ (if viper-emacs-p 'frame-parameter 'frame-property) (selected-frame) 'viper-saved-cursor-color-in-replace-mode) - viper-vi-state-cursor-color)) + (if (eq viper-current-state 'emacs-mode) + viper-emacs-state-cursor-color + viper-vi-state-cursor-color))) (defsubst viper-get-saved-cursor-color-in-insert-mode () (or @@ -196,15 +201,27 @@ (if viper-emacs-p 'frame-parameter 'frame-property) (selected-frame) 'viper-saved-cursor-color-in-insert-mode) + (if (eq viper-current-state 'emacs-mode) + viper-emacs-state-cursor-color + viper-vi-state-cursor-color))) + +(defsubst viper-get-saved-cursor-color-in-emacs-mode () + (or + (funcall + (if viper-emacs-p 'frame-parameter 'frame-property) + (selected-frame) + 'viper-saved-cursor-color-in-emacs-mode) viper-vi-state-cursor-color)) ;; restore cursor color from replace overlay (defun viper-restore-cursor-color(after-which-mode) (if (viper-overlay-p viper-replace-overlay) (viper-change-cursor-color - (if (eq after-which-mode 'after-replace-mode) - (viper-get-saved-cursor-color-in-replace-mode) - (viper-get-saved-cursor-color-in-insert-mode)) + (cond ((eq after-which-mode 'after-replace-mode) + (viper-get-saved-cursor-color-in-replace-mode)) + ((eq after-which-mode 'after-emacs-mode) + (viper-get-saved-cursor-color-in-emacs-mode)) + (t (viper-get-saved-cursor-color-in-insert-mode))) )))
--- a/lisp/emulation/viper.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/emulation/viper.el Mon Feb 20 16:30:15 2006 +0000 @@ -9,7 +9,7 @@ ;; Author: Michael Kifer <kifer@cs.stonybrook.edu> ;; Keywords: emulations -(defconst viper-version "3.11.5 of November 25, 2005" +(defconst viper-version "3.12 of February 18, 2006" "The current version of Viper") ;; This file is part of GNU Emacs.
--- a/lisp/erc/ChangeLog Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/erc/ChangeLog Mon Feb 20 16:30:15 2006 +0000 @@ -1,5 +1,21 @@ +2006-02-19 Michael Olson <mwolson@gnu.org> + + * erc-capab.el (erc-capab-send-identify-messages): Make sure some + parameters are strings before using them. Thanks to Alejandro + Benitez for the report. + + * erc.el (erc-version-string): Release ERC 5.1.2. + +2006-02-19 Diane Murray <disumu@x3y2z1.net> + + * erc-button.el (erc-button-keymap): Bind `erc-button-previous' to + <C-tab>. + (erc-button-previous): New function. + 2006-02-15 Michael Olson <mwolson@gnu.org> + * NEWS: Add category for ERC 5.2. + * erc.el (erc): Move to the end of the buffer when a continued session is detected. Thanks to e1f and indio for the report and testing a potential fix. @@ -150,7 +166,7 @@ * erc-stamp.el: Use new arch tagline, since the other one wasn't being treated properly. - * erc.el (erc-version-string): Release ERC 5.1.1 + * erc.el (erc-version-string): Release ERC 5.1.1. 2006-02-03 Zhang Wei <id.brep@gmail.com> (tiny change)
--- a/lisp/erc/erc-button.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/erc/erc-button.el Mon Feb 20 16:30:15 2006 +0000 @@ -216,6 +216,7 @@ (define-key map (kbd "<button2>") 'erc-button-click-button) (define-key map (kbd "<mouse-2>") 'erc-button-click-button)) (define-key map (kbd "TAB") 'erc-button-next) + (define-key map (kbd "<C-tab>") 'erc-button-previous) (set-keymap-parent map erc-mode-map) map) "Local keymap for ERC buttons.") @@ -427,6 +428,22 @@ (error "No next button")) t))) +(defun erc-button-previous () + "Go to the previous button in this buffer." + (interactive) + (let ((here (point))) + (when (< here (erc-beg-of-input-line)) + (while (and (get-text-property here 'erc-callback) + (not (= here (point-min)))) + (setq here (1- here))) + (while (and (not (get-text-property here 'erc-callback)) + (not (= here (point-min)))) + (setq here (1- here))) + (if (> here (point-min)) + (goto-char here) + (error "No previous button")) + t))) + (defun erc-browse-emacswiki (thing) "Browse to thing in the emacs-wiki." (browse-url (concat erc-emacswiki-url thing)))
--- a/lisp/erc/erc.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/erc/erc.el Mon Feb 20 16:30:15 2006 +0000 @@ -66,7 +66,7 @@ ;;; Code: -(defconst erc-version-string "Version 5.1.1" +(defconst erc-version-string "Version 5.1.2" "ERC version. This is used by function `erc-version'.") (eval-when-compile (require 'cl))
--- a/lisp/ffap.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/ffap.el Mon Feb 20 16:30:15 2006 +0000 @@ -1255,7 +1255,8 @@ (abbreviate-file-name (expand-file-name guess)) )) (setq dir (file-name-directory guess)))) - (let ((minibuffer-completing-file-name t)) + (let ((minibuffer-completing-file-name t) + (completion-ignore-case read-file-name-completion-ignore-case)) (setq guess (completing-read prompt @@ -1321,6 +1322,12 @@ (defvar ffap-highlight t "If non-nil, ffap highlights the current buffer substring.") +(defface ffap + '((t :inherit highlight)) + "Face used to highlight the current buffer substring." + :group 'ffap + :version "22.1") + (defvar ffap-highlight-overlay nil "Overlay used by `ffap-highlight'.") @@ -1344,8 +1351,7 @@ (t (setq ffap-highlight-overlay (apply 'make-overlay ffap-string-at-point-region)) - (overlay-put ffap-highlight-overlay 'face - (if (facep 'ffap) 'ffap 'highlight))))) + (overlay-put ffap-highlight-overlay 'face 'ffap)))) ;;; Main Entrance (`find-file-at-point' == `ffap'):
--- a/lisp/files.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/files.el Mon Feb 20 16:30:15 2006 +0000 @@ -2218,6 +2218,130 @@ (setq end (point)) (goto-char beg) end)))) + +;;; Handling file local variables + +(defvar ignored-local-variables + '(ignored-local-variables safe-local-variable-values) + "Variables to be ignored in a file's local variable spec.") + +(defvar hack-local-variables-hook nil + "Normal hook run after processing a file's local variables specs. +Major modes can use this to examine user-specified local variables +in order to initialize other data structure based on them.") + +(defcustom safe-local-variable-values nil + "List variable-value pairs that are considered safe. +Each element is a cons cell (VAR . VAL), where VAR is a variable +symbol and VAL is a value that is considered safe." + :group 'find-file + :type 'alist) + +(defcustom safe-local-eval-forms nil + "*Expressions that are considered safe in an `eval:' local variable. +Add expressions to this list if you want Emacs to evaluate them, when +they appear in an `eval' local variable specification, without first +asking you for confirmation." + :group 'find-file + :version "22.1" + :type '(repeat sexp)) + +;; Risky local variables: +(mapc (lambda (var) (put var 'risky-local-variable t)) + '(after-load-alist + auto-mode-alist + buffer-auto-save-file-name + buffer-file-name + buffer-file-truename + buffer-undo-list + dabbrev-case-fold-search + dabbrev-case-replace + debugger + default-text-properties + display-time-string + enable-local-eval + eval + exec-directory + exec-path + file-name-handler-alist + font-lock-defaults + format-alist + frame-title-format + global-mode-string + header-line-format + icon-title-format + ignored-local-variables + imenu--index-alist + imenu-generic-expression + inhibit-quit + input-method-alist + load-path + max-lisp-eval-depth + max-specpdl-size + minor-mode-alist + minor-mode-map-alist + minor-mode-overriding-map-alist + mode-line-buffer-identification + mode-line-format + mode-line-client + mode-line-modes + mode-line-modified + mode-line-mule-info + mode-line-position + mode-line-process + mode-name + outline-level + overriding-local-map + overriding-terminal-local-map + parse-time-rules + process-environment + rmail-output-file-alist + save-some-buffers-action-alist + special-display-buffer-names + standard-input + standard-output + unread-command-events + vc-mode)) + +;; Safe local variables: +;; +;; For variables defined by minor modes, put the safety declarations +;; here, not in the file defining the minor mode (when Emacs visits a +;; file specifying that local variable, the minor mode file may not be +;; loaded yet). For variables defined by major modes, the safety +;; declarations can go into the major mode's file, since that will be +;; loaded before file variables are processed. + +(let ((string-or-null (lambda (a) (or (stringp a) (null a))))) + (eval + `(mapc (lambda (pair) + (put (car pair) 'safe-local-variable (cdr pair))) + '((byte-compile-dynamic . t) + (c-basic-offset . integerp) + (c-file-style . stringp) + (c-indent-level . integerp) + (comment-column . integerp) + (compile-command . ,string-or-null) + (fill-column . integerp) + (fill-prefix . ,string-or-null) + (indent-tabs-mode . t) + (ispell-check-comments . (lambda (a) + (memq a '(nil t exclusive)))) + (ispell-local-dictionary . ,string-or-null) + (kept-new-versions . integerp) + (no-byte-compile . t) + (no-update-autoloads . t) + (outline-regexp . ,string-or-null) + (page-delimiter . ,string-or-null) + (paragraph-start . ,string-or-null) + (paragraph-separate . ,string-or-null) + (sentence-end . ,string-or-null) + (sentence-end-double-space . t) + (tab-width . integerp) + (truncate-lines . t) + (version-control . t))))) + +(put 'c-set-style 'safe-local-eval-function t) (defun hack-local-variables-confirm (vars unsafe-vars risky-vars) (if noninteractive @@ -2346,18 +2470,6 @@ mode-specified result)))) -(defvar hack-local-variables-hook nil - "Normal hook run after processing a file's local variables specs. -Major modes can use this to examine user-specified local variables -in order to initialize other data structure based on them.") - -(defcustom safe-local-variable-values nil - "List variable-value pairs that are considered safe. -Each element is a cons cell (VAR . VAL), where VAR is a variable -symbol and VAL is a value that is considered safe." - :group 'find-file - :type 'alist) - (defun hack-local-variables (&optional mode-only) "Parse and put into effect this buffer's local variables spec. If MODE-ONLY is non-nil, all we do is check whether the major mode @@ -2479,93 +2591,6 @@ (hack-one-local-variable (car elt) (cdr elt))))) (run-hooks 'hack-local-variables-hook)))))) -(defvar ignored-local-variables - '(ignored-local-variables safe-local-variable-values) - "Variables to be ignored in a file's local variable spec.") - -;; Get confirmation before setting these variables as locals in a file. -(put 'debugger 'risky-local-variable t) -(put 'enable-local-eval 'risky-local-variable t) -(put 'ignored-local-variables 'risky-local-variable t) -(put 'ignored-local-variables 'safe-local-variable-values t) -(put 'eval 'risky-local-variable t) -(put 'file-name-handler-alist 'risky-local-variable t) -(put 'inhibit-quit 'risky-local-variable t) -(put 'minor-mode-alist 'risky-local-variable t) -(put 'minor-mode-map-alist 'risky-local-variable t) -(put 'minor-mode-overriding-map-alist 'risky-local-variable t) -(put 'overriding-local-map 'risky-local-variable t) -(put 'overriding-terminal-local-map 'risky-local-variable t) -(put 'auto-mode-alist 'risky-local-variable t) -(put 'after-load-alist 'risky-local-variable t) -(put 'buffer-file-name 'risky-local-variable t) -(put 'buffer-undo-list 'risky-local-variable t) -(put 'buffer-auto-save-file-name 'risky-local-variable t) -(put 'buffer-file-truename 'risky-local-variable t) -(put 'default-text-properties 'risky-local-variable t) -(put 'exec-path 'risky-local-variable t) -(put 'load-path 'risky-local-variable t) -(put 'exec-directory 'risky-local-variable t) -(put 'process-environment 'risky-local-variable t) -(put 'dabbrev-case-fold-search 'risky-local-variable t) -(put 'dabbrev-case-replace 'risky-local-variable t) -;; Don't wait for outline.el to be loaded, for the sake of outline-minor-mode. -(put 'outline-level 'risky-local-variable t) -(put 'rmail-output-file-alist 'risky-local-variable t) -(put 'font-lock-defaults 'risky-local-variable t) -(put 'special-display-buffer-names 'risky-local-variable t) -(put 'frame-title-format 'risky-local-variable t) -(put 'global-mode-string 'risky-local-variable t) -(put 'header-line-format 'risky-local-variable t) -(put 'icon-title-format 'risky-local-variable t) -(put 'input-method-alist 'risky-local-variable t) -(put 'format-alist 'risky-local-variable t) -(put 'vc-mode 'risky-local-variable t) -(put 'imenu-generic-expression 'risky-local-variable t) -(put 'imenu--index-alist 'risky-local-variable t) -(put 'standard-input 'risky-local-variable t) -(put 'standard-output 'risky-local-variable t) -(put 'unread-command-events 'risky-local-variable t) -(put 'max-lisp-eval-depth 'risky-local-variable t) -(put 'max-specpdl-size 'risky-local-variable t) -(put 'mode-line-format 'risky-local-variable t) -(put 'mode-line-modified 'risky-local-variable t) -(put 'mode-line-mule-info 'risky-local-variable t) -(put 'mode-line-client 'risky-local-variable t) -(put 'mode-line-buffer-identification 'risky-local-variable t) -(put 'mode-line-modes 'risky-local-variable t) -(put 'mode-line-position 'risky-local-variable t) -(put 'mode-line-process 'risky-local-variable t) -(put 'mode-name 'risky-local-variable t) -(put 'display-time-string 'risky-local-variable t) -(put 'parse-time-rules 'risky-local-variable t) - -;; Commonly-encountered local variables that are safe: -(let ((string-or-null (lambda (a) (or (stringp a) (null a))))) - (eval - `(mapc (lambda (pair) - (put (car pair) 'safe-local-variable (cdr pair))) - '((byte-compile-dynamic . t) - (c-basic-offset . integerp) - (c-file-style . stringp) - (c-indent-level . integerp) - (comment-column . integerp) - (compile-command . ,string-or-null) - (fill-column . integerp) - (fill-prefix . ,string-or-null) - (indent-tabs-mode . t) - (kept-new-versions . integerp) - (no-byte-compile . t) - (no-update-autoloads . t) - (outline-regexp . ,string-or-null) - (page-delimiter . ,string-or-null) - (paragraph-start . ,string-or-null) - (paragraph-separate . ,string-or-null) - (sentence-end . ,string-or-null) - (sentence-end-double-space . t) - (tab-width . integerp) - (version-control . t))))) - (defun safe-local-variable-p (sym val) "Non-nil if SYM is safe as a file-local variable with value VAL. It is safe if any of these conditions are met: @@ -2603,17 +2628,6 @@ -[0-9]+$\\|font-lock-syntactic-keywords$\\|-frame-alist$\\|-mode-alist$\\|\ -map$\\|-map-alist$" (symbol-name sym)))) -(defcustom safe-local-eval-forms nil - "*Expressions that are considered \"safe\" in an `eval:' local variable. -Add expressions to this list if you want Emacs to evaluate them, when -they appear in an `eval' local variable specification, without first -asking you for confirmation." - :group 'find-file - :version "22.1" - :type '(repeat sexp)) - -(put 'c-set-style 'safe-local-eval-function t) - (defun hack-one-local-variable-quotep (exp) (and (consp exp) (eq (car exp) 'quote) (consp (cdr exp)))) @@ -3631,7 +3645,6 @@ (?d diff-buffer-with-file "view changes in file")) "ACTION-ALIST argument used in call to `map-y-or-n-p'.") -(put 'save-some-buffers-action-alist 'risky-local-variable t) (defvar buffer-save-without-query nil "Non-nil means `save-some-buffers' should save this buffer without asking.")
--- a/lisp/gnus/ChangeLog Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/gnus/ChangeLog Mon Feb 20 16:30:15 2006 +0000 @@ -7,6 +7,44 @@ * gnus-cus.el: Revert 2005-10-17 change. +2006-02-17 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-art.el (article-strip-banner): Call + article-really-strip-banner only when the regexp match is made. + +2006-02-16 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-art.el (article-strip-banner): Use + gnus-extract-address-components instead of + mail-header-parse-addresses to make it work with non-ASCII text. + + * rfc2231.el (rfc2231-parse-string): Attempt to parse parameter + values which are surrounded with \"...\"; make it never cause a + Lisp error; give up parsing of parameters if it failed in + extracting type. + +2006-02-15 Katsumi Yamaoka <yamaoka@jpl.org> + + * mm-util.el (mm-make-temp-file): Import the Emacs 22 version of + make-temp-file; make it work with Emacs 20 and XEmacs as well. + + * mm-decode.el (mm-display-external): Use the 3rd arg of + mm-make-temp-file. + (mm-create-image-xemacs): Ditto. + +2006-02-14 Katsumi Yamaoka <yamaoka@jpl.org> + + * gnus-draft.el (gnus-draft-send): Replace message-narrow-to-head + with message-narrow-to-headers. + (gnus-draft-setup): Narrow to header to run message-fetch-field. + (gnus-draft-check-draft-articles): New function. + (gnus-draft-edit-message, gnus-draft-send-message): Use it. + +2006-02-13 Katsumi Yamaoka <yamaoka@jpl.org> + + * nnoo.el (nnoo-declare): Don't generate duplicate entries when + re-loading nn* modules. + 2006-02-10 Reiner Steib <Reiner.Steib@gmx.de> * gnus.el: Remove bogus comment.
--- a/lisp/gnus/gnus-art.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/gnus/gnus-art.el Mon Feb 20 16:30:15 2006 +0000 @@ -2608,18 +2608,22 @@ (article-really-strip-banner (gnus-parameter-banner gnus-newsgroup-name))) (when gnus-article-address-banner-alist - (article-really-strip-banner - (let ((from (save-restriction - (widen) - (article-narrow-to-head) - (mail-fetch-field "from")))) - (when (and from - (setq from - (caar (mail-header-parse-addresses from)))) - (catch 'found - (dolist (pair gnus-article-address-banner-alist) - (when (string-match (car pair) from) - (throw 'found (cdr pair))))))))))))) + ;; Note that the From header is decoded here, so it is + ;; required that the *-extract-address-components function + ;; supports non-ASCII text. + (let ((from (save-restriction + (widen) + (article-narrow-to-head) + (mail-fetch-field "from")))) + (when (and from + (setq from + (cadr (funcall gnus-extract-address-components + from)))) + (catch 'found + (dolist (pair gnus-article-address-banner-alist) + (when (string-match (car pair) from) + (throw 'found + (article-really-strip-banner (cdr pair))))))))))))) (defun article-really-strip-banner (banner) "Strip the banner specified by the argument."
--- a/lisp/gnus/gnus-draft.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/gnus/gnus-draft.el Mon Feb 20 16:30:15 2006 +0000 @@ -98,6 +98,7 @@ (interactive) (let ((article (gnus-summary-article-number)) (group gnus-newsgroup-name)) + (gnus-draft-check-draft-articles (list article)) (gnus-summary-mark-as-read article gnus-canceled-mark) (gnus-draft-setup article group t) (set-buffer-modified-p t) @@ -122,6 +123,7 @@ (let* ((articles (gnus-summary-work-articles n)) (total (length articles)) article) + (gnus-draft-check-draft-articles articles) (while (setq article (pop articles)) (gnus-summary-remove-process-mark article) (unless (memq article gnus-newsgroup-unsendable) @@ -152,7 +154,7 @@ ;; We read the meta-information that says how and where ;; this message is to be sent. (save-restriction - (message-narrow-to-head) + (message-narrow-to-headers) (when (re-search-forward (concat "^" (regexp-quote gnus-agent-target-move-group-header) ":") nil t) @@ -258,9 +260,12 @@ (goto-char (point-min)) (search-forward "\n\n") (forward-char -1) + (save-restriction + (narrow-to-region (point-min) (point)) + (setq ga + (message-fetch-field gnus-draft-meta-information-header))) (insert mail-header-separator) (forward-line 1) - (setq ga (message-fetch-field gnus-draft-meta-information-header)) (message-set-auto-save-file-name)))) (gnus-backlog-remove-article group narticle) (when (and ga @@ -285,6 +290,32 @@ "Say whether ARTICLE is sendable." (not (memq article gnus-newsgroup-unsendable))) +(defun gnus-draft-check-draft-articles (articles) + "Check whether the draft articles ARTICLES are under edit." + (when (equal gnus-newsgroup-name "nndraft:drafts") + (let ((buffers (buffer-list)) + file buffs buff) + (save-current-buffer + (while (and articles + (not buff)) + (setq file (nndraft-article-filename (pop articles)) + buffs buffers) + (while buffs + (set-buffer (setq buff (pop buffs))) + (if (and buffer-file-name + (string-equal (file-truename buffer-file-name) + (file-truename file)) + (buffer-modified-p)) + (setq buffs nil) + (setq buff nil))))) + (when buff + (let* ((window (get-buffer-window buff t)) + (frame (and window (window-frame window)))) + (if frame + (gnus-select-frame-set-input-focus frame) + (pop-to-buffer buff t))) + (error "The draft %s is under edit" file))))) + (provide 'gnus-draft) ;;; arch-tag: 3d92af58-8c97-4a5c-9db4-a98e85198022
--- a/lisp/gnus/mm-decode.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/gnus/mm-decode.el Mon Feb 20 16:30:15 2006 +0000 @@ -769,19 +769,18 @@ (gnus-map-function mm-file-name-rewrite-functions (file-name-nondirectory filename)) dir)) - (setq file (mm-make-temp-file (expand-file-name "mm." dir))) - (let ((newname - ;; Use nametemplate (defined in RFC1524) if it is - ;; specified in mailcap. - (if (assoc "nametemplate" mime-info) - (format (cdr (assoc "nametemplate" mime-info)) file) - ;; Add a suffix according to `mailcap-mime-extensions'. - (concat file (car (rassoc (mm-handle-media-type handle) - mailcap-mime-extensions)))))) - (unless (string-equal file newname) - (when (file-exists-p file) - (rename-file file newname)) - (setq file newname)))) + ;; Use nametemplate (defined in RFC1524) if it is specified + ;; in mailcap. + (let ((suffix (cdr (assoc "nametemplate" mime-info)))) + (if (and suffix + (string-match "\\`%s\\(\\..+\\)\\'" suffix)) + (setq suffix (match-string 1 suffix)) + ;; Otherwise, use a suffix according to + ;; `mailcap-mime-extensions'. + (setq suffix (car (rassoc (mm-handle-media-type handle) + mailcap-mime-extensions)))) + (setq file (mm-make-temp-file (expand-file-name "mm." dir) + nil suffix)))) (let ((coding-system-for-write mm-binary-coding-system)) (write-region (point-min) (point-max) file nil 'nomesg)) (message "Viewing with %s" method) @@ -1312,8 +1311,8 @@ ;; out to a file, and then create a file ;; specifier. (let ((file (mm-make-temp-file - (expand-file-name "emm.xbm" - mm-tmp-directory)))) + (expand-file-name "emm" mm-tmp-directory) + nil ".xbm"))) (unwind-protect (progn (write-region (point-min) (point-max) file)
--- a/lisp/gnus/mm-util.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/gnus/mm-util.el Mon Feb 20 16:30:15 2006 +0000 @@ -99,16 +99,6 @@ (lambda (ch) (mm-string-as-multibyte (char-to-string ch))) string ""))) (multibyte-string-p . ignore) - ;; It is not a MIME function, but some MIME functions use it. - (make-temp-file . (lambda (prefix &optional dir-flag) - (let ((file (expand-file-name - (make-temp-name prefix) - (if (fboundp 'temp-directory) - (temp-directory) - temporary-file-directory)))) - (if dir-flag - (make-directory file)) - file))) (insert-byte . insert-char) (multibyte-char-to-unibyte . identity)))) @@ -971,6 +961,77 @@ inhibit-file-name-handlers))) (write-region start end filename append visit lockname))) +;; It is not a MIME function, but some MIME functions use it. +(if (and (fboundp 'make-temp-file) + (ignore-errors + (let ((def (symbol-function 'make-temp-file))) + (and (byte-code-function-p def) + (setq def (if (fboundp 'compiled-function-arglist) + ;; XEmacs + (eval (list 'compiled-function-arglist def)) + (aref def 0))) + (>= (length def) 4) + (eq (nth 3 def) 'suffix))))) + (defalias 'mm-make-temp-file 'make-temp-file) + ;; Stolen (and modified for Emacs 20 and XEmacs) from Emacs 22. + (defun mm-make-temp-file (prefix &optional dir-flag suffix) + "Create a temporary file. +The returned file name (created by appending some random characters at the end +of PREFIX, and expanding against `temporary-file-directory' if necessary), +is guaranteed to point to a newly created empty file. +You can then use `write-region' to write new data into the file. + +If DIR-FLAG is non-nil, create a new empty directory instead of a file. + +If SUFFIX is non-nil, add that at the end of the file name." + (let ((umask (default-file-modes)) + file) + (unwind-protect + (progn + ;; Create temp files with strict access rights. It's easy to + ;; loosen them later, whereas it's impossible to close the + ;; time-window of loose permissions otherwise. + (set-default-file-modes 448) + (while (condition-case err + (progn + (setq file + (make-temp-name + (expand-file-name + prefix + (if (fboundp 'temp-directory) + ;; XEmacs + (temp-directory) + temporary-file-directory)))) + (if suffix + (setq file (concat file suffix))) + (if dir-flag + (make-directory file) + (if (or (featurep 'xemacs) + (= emacs-major-version 20)) + ;; NOTE: This is unsafe if Emacs 20 + ;; users and XEmacs users don't use + ;; a secure temp directory. + (if (file-exists-p file) + (signal 'file-already-exists + (list "File exists" file)) + (write-region "" nil file nil 'silent)) + (write-region "" nil file nil 'silent + nil 'excl))) + nil) + (file-already-exists t) + ;; The Emacs 20 and XEmacs versions of + ;; `make-directory' issue `file-error'. + (file-error (or (and (or (featurep 'xemacs) + (= emacs-major-version 20)) + (file-exists-p file)) + (signal (car err) (cdr err))))) + ;; the file was somehow created by someone else between + ;; `make-temp-name' and `write-region', let's try again. + nil) + file) + ;; Reset the umask. + (set-default-file-modes umask))))) + (defun mm-image-load-path (&optional package) (let (dir result) (dolist (path load-path (nreverse result))
--- a/lisp/gnus/nnoo.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/gnus/nnoo.el Mon Feb 20 16:30:15 2006 +0000 @@ -61,12 +61,16 @@ (defmacro nnoo-declare (backend &rest parents) `(eval-and-compile - (push (list ',backend - (mapcar (lambda (p) (list p)) ',parents) - nil nil) - nnoo-definition-alist) - (push (list ',backend "*internal-non-initialized-backend*") - nnoo-state-alist))) + (if (assq ',backend nnoo-definition-alist) + (setcar (cdr (assq ',backend nnoo-definition-alist)) + (mapcar 'list ',parents)) + (push (list ',backend + (mapcar 'list ',parents) + nil nil) + nnoo-definition-alist)) + (unless (assq ',backend nnoo-state-alist) + (push (list ',backend "*internal-non-initialized-backend*") + nnoo-state-alist)))) (put 'nnoo-declare 'lisp-indent-function 1) (defun nnoo-parents (backend)
--- a/lisp/gnus/rfc2231.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/gnus/rfc2231.el Mon Feb 20 16:30:15 2006 +0000 @@ -47,15 +47,45 @@ `(name (attribute . value) (attribute . value)...)'. If the optional SIGNAL-ERROR is non-nil, signal an error when this -function fails in parsing of parameters." +function fails in parsing of parameters. Otherwise, this function +must never cause a Lisp error." (with-temp-buffer (let ((ttoken (ietf-drums-token-to-list ietf-drums-text-token)) (stoken (ietf-drums-token-to-list ietf-drums-tspecials)) (ntoken (ietf-drums-token-to-list "0-9")) c type attribute encoded number prev-attribute vals prev-encoded parameters value) - (ietf-drums-init (mail-header-remove-whitespace - (mail-header-remove-comments string))) + (ietf-drums-init + (condition-case nil + (mail-header-remove-whitespace + (mail-header-remove-comments string)) + ;; The most likely cause of an error is unbalanced parentheses + ;; or double-quotes. If all parentheses and double-quotes are + ;; quoted meaninglessly with backslashes, removing them might + ;; make it parseable. Let's try... + (error + (let (mod) + (when (and (string-match "\\\\\"" string) + (not (string-match "\\`\"\\|[^\\]\"" string))) + (setq string (mm-replace-in-string string "\\\\\"" "\"") + mod t)) + (when (and (string-match "\\\\(" string) + (string-match "\\\\)" string) + (not (string-match "\\`(\\|[^\\][()]" string))) + (setq string (mm-replace-in-string string "\\\\\\([()]\\)" "\\1") + mod t)) + (or (and mod + (ignore-errors + (mail-header-remove-whitespace + (mail-header-remove-comments string)))) + ;; Finally, attempt to extract only type. + (if (string-match + (concat "\\`[\t\n ]*\\([^" ietf-drums-tspecials "\t\n ]+" + "\\(/[^" ietf-drums-tspecials + "\t\n ]+\\)?\\)\\([\t\n ;]\\|\\'\\)") + string) + (match-string 1 string) + "")))))) (let ((table (copy-syntax-table ietf-drums-syntax-table))) (modify-syntax-entry ?\' "w" table) (modify-syntax-entry ?* " " table) @@ -67,9 +97,12 @@ (set-syntax-table table)) (setq c (char-after)) (when (and (memq c ttoken) - (not (memq c stoken))) - (setq type (downcase (buffer-substring - (point) (progn (forward-sexp 1) (point))))) + (not (memq c stoken)) + (setq type (ignore-errors + (downcase + (buffer-substring (point) (progn + (forward-sexp 1) + (point))))))) ;; Do the params (condition-case err (progn @@ -180,8 +213,7 @@ ;;(message "%s" (error-message-string err)) ))) - (when type - `(,type ,@(nreverse parameters))))))) + (cons type (nreverse parameters)))))) (defun rfc2231-decode-encoded-string (string) "Decode an RFC2231-encoded string.
--- a/lisp/help-fns.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/help-fns.el Mon Feb 20 16:30:15 2006 +0000 @@ -252,6 +252,7 @@ "\\)" "\\(?:es\\|s\\|th\\)?" ; for ARGth, ARGs "\\(?:-[a-z0-9-]+\\)?" ; for ARG-xxx, ARG-n + "\\(?:-[{([<`\"].*?\\)?"; for ARG-{x}, (x), <x>, [x], `x' "\\>") ; end of word (help-default-arg-highlight arg) doc t t 1)))))
--- a/lisp/icomplete.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/icomplete.el Mon Feb 20 16:30:15 2006 +0000 @@ -146,7 +146,7 @@ (if (commandp func-name) (save-excursion (let* ((sym (intern func-name)) - (buf (other-buffer)) + (buf (other-buffer nil t)) (map (save-excursion (set-buffer buf) (current-local-map))) (keys (where-is-internal sym map))) (if keys
--- a/lisp/info.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/info.el Mon Feb 20 16:30:15 2006 +0000 @@ -622,12 +622,6 @@ (cond ((string= (downcase filename) "dir") (setq found t)) - ((string= filename "apropos") - (setq found 'apropos)) - ((string= filename "history") - (setq found 'history)) - ((string= filename "toc") - (setq found 'toc)) (t (let ((dirs (if (string-match "^\\./" filename) ;; If specified name starts with `./' @@ -673,7 +667,8 @@ (if noerror (setq filename nil) (error "Info file %s does not exist" filename))) - filename))) + filename) + (and (member filename '(apropos history toc)) filename))) (defun Info-find-node (filename nodename &optional no-going-back) "Go to an Info node specified as separate FILENAME and NODENAME. @@ -891,9 +886,6 @@ (setq Info-current-file (cond ((eq filename t) "dir") - ((eq filename 'apropos) "apropos") - ((eq filename 'history) "history") - ((eq filename 'toc) "toc") (t filename))) )) ;; Use string-equal, not equal, to ignore text props. @@ -1409,7 +1401,7 @@ (if (stringp Info-current-file) (replace-regexp-in-string "%" "%%" (file-name-nondirectory Info-current-file)) - "") + (format "*%S*" Info-current-file)) ") " (if Info-current-node (propertize (replace-regexp-in-string @@ -1648,7 +1640,8 @@ ;; Skip Tag Table node (save-excursion (and (search-backward "\^_" nil t) - (looking-at "\^_\nTag Table")))))) + (looking-at + "\^_\n\\(Tag Table\\|Local Variables\\)")))))) (let ((search-spaces-regexp Info-search-whitespace-regexp)) (if (if backward (re-search-backward regexp bound t) @@ -1736,7 +1729,8 @@ ;; Skip Tag Table node (save-excursion (and (search-backward "\^_" nil t) - (looking-at "\^_\nTag Table")))))) + (looking-at + "\^_\n\\(Tag Table\\|Local Variables\\)")))))) (let ((search-spaces-regexp Info-search-whitespace-regexp)) (if (if backward (re-search-backward regexp nil t) @@ -1831,11 +1825,11 @@ (defun Info-isearch-push-state () `(lambda (cmd) - (Info-isearch-pop-state cmd ,Info-current-file ,Info-current-node))) + (Info-isearch-pop-state cmd ',Info-current-file ',Info-current-node))) (defun Info-isearch-pop-state (cmd file node) - (or (and (string= Info-current-file file) - (string= Info-current-node node)) + (or (and (equal Info-current-file file) + (equal Info-current-node node)) (progn (Info-find-node file node) (sit-for 0)))) (defun Info-isearch-start () @@ -1853,7 +1847,7 @@ (forward-line 1) (cond ((re-search-backward (concat name ":" (Info-following-node-name-re)) bound t) - (match-string 1)) + (match-string-no-properties 1)) ((not (eq errorname t)) (error "Node has no %s" (capitalize (or errorname name))))))))) @@ -1875,7 +1869,7 @@ ;;; For compatibility; other files have used this name. (defun Info-following-node-name () (and (looking-at (Info-following-node-name-re)) - (match-string 1))) + (match-string-no-properties 1))) (defun Info-next () "Go to the next node of this node." @@ -1909,7 +1903,8 @@ (Info-goto-node node) (setq p (point)) (goto-char (point-min)) - (if (and (search-forward "\n* Menu:" nil t) + (if (and (stringp old-file) + (search-forward "\n* Menu:" nil t) (re-search-forward (if (string-equal old-node "Top") (concat "\n\\*[^:]+: +(" (file-name-nondirectory old-file) ")") @@ -1977,51 +1972,53 @@ (while hl (let ((file (nth 0 (car hl))) (node (nth 1 (car hl)))) - (if (and (string-equal file curr-file) - (string-equal node curr-node)) + (if (and (equal file curr-file) + (equal node curr-node)) (setq p (point))) - (insert "* " node ": (" - (propertize (or (file-name-directory file) "") 'invisible t) - (file-name-nondirectory file) - ")" node ".\n")) + (if (stringp file) + (insert "* " node ": (" + (propertize (or (file-name-directory file) "") 'invisible t) + (file-name-nondirectory file) + ")" node ".\n"))) (setq hl (cdr hl)))))) - (Info-find-node "history" "Top") + (Info-find-node 'history "Top") (goto-char (or p (point-min))))) (defun Info-toc () "Go to a node with table of contents of the current Info file. Table of contents is created from the tree structure of menus." (interactive) - (let ((curr-file (substring-no-properties Info-current-file)) - (curr-node (substring-no-properties Info-current-node)) - p) - (with-current-buffer (get-buffer-create " *info-toc*") - (let ((inhibit-read-only t) - (node-list (Info-build-toc curr-file))) - (erase-buffer) - (goto-char (point-min)) - (insert "\n\^_\nFile: toc, Node: Top, Up: (dir)\n\n") - (insert "Table of Contents\n*****************\n\n") - (insert "*Note Top: (" curr-file ")Top.\n") - (Info-insert-toc - (nth 2 (assoc "Top" node-list)) ; get Top nodes - node-list 0 curr-file)) - (if (not (bobp)) - (let ((Info-hide-note-references 'hide) - (Info-fontify-visited-nodes nil)) - (Info-mode) - (setq Info-current-file "toc" Info-current-node "Top") - (goto-char (point-min)) - (narrow-to-region (or (re-search-forward "\n[\^_\f]\n" nil t) - (point-min)) - (point-max)) - (Info-fontify-node) - (widen))) - (goto-char (point-min)) - (if (setq p (search-forward (concat "*Note " curr-node ":") nil t)) - (setq p (- p (length curr-node) 2)))) - (Info-find-node "toc" "Top") - (goto-char (or p (point-min))))) + (if (stringp Info-current-file) + (let ((curr-file (substring-no-properties Info-current-file)) + (curr-node (substring-no-properties Info-current-node)) + p) + (with-current-buffer (get-buffer-create " *info-toc*") + (let ((inhibit-read-only t) + (node-list (Info-build-toc curr-file))) + (erase-buffer) + (goto-char (point-min)) + (insert "\n\^_\nFile: toc, Node: Top, Up: (dir)\n\n") + (insert "Table of Contents\n*****************\n\n") + (insert "*Note Top: (" curr-file ")Top.\n") + (Info-insert-toc + (nth 2 (assoc "Top" node-list)) ; get Top nodes + node-list 0 curr-file)) + (if (not (bobp)) + (let ((Info-hide-note-references 'hide) + (Info-fontify-visited-nodes nil)) + (Info-mode) + (setq Info-current-file 'toc Info-current-node "Top") + (goto-char (point-min)) + (narrow-to-region (or (re-search-forward "\n[\^_\f]\n" nil t) + (point-min)) + (point-max)) + (Info-fontify-node) + (widen))) + (goto-char (point-min)) + (if (setq p (search-forward (concat "*Note " curr-node ":") nil t)) + (setq p (- p (length curr-node) 2)))) + (Info-find-node 'toc "Top") + (goto-char (or p (point-min)))))) (defun Info-insert-toc (nodes node-list level curr-file) "Insert table of contents with references to nodes." @@ -2221,16 +2218,18 @@ (setq Info-point-loc (if (match-beginning 5) (string-to-number (match-string 5)) - (buffer-substring (match-beginning 0) (1- (match-beginning 1))))) + (buffer-substring-no-properties + (match-beginning 0) (1- (match-beginning 1))))) ;;; Uncomment next line to use names of cross-references in non-index nodes: ;;; (setq Info-point-loc ;;; (buffer-substring (match-beginning 0) (1- (match-beginning 1)))) ) (replace-regexp-in-string "[ \n]+" " " - (or (match-string 2) + (or (match-string-no-properties 2) ;; If the node name is the menu entry name (using `entry::'). - (buffer-substring (match-beginning 0) (1- (match-beginning 1))))))) + (buffer-substring-no-properties + (match-beginning 0) (1- (match-beginning 1))))))) ;; No one calls this. ;;(defun Info-menu-item-sequence (list) @@ -2684,7 +2683,7 @@ (or file (setq file Info-current-file)) (or (assoc file Info-index-nodes) ;; Skip virtual Info files - (and (member file '("dir" "history" "toc" "apropos")) + (and (member file '("dir" apropos history toc)) (setq Info-index-nodes (cons (cons file nil) Info-index-nodes))) (not (stringp file)) (if Info-file-supports-index-cookies @@ -2926,7 +2925,7 @@ (message "%s" (if (eq (car-safe err) 'error) (nth 1 err) err)) (sit-for 1 t))))) - (Info-goto-node (concat "(" current-file ")" current-node)) + (Info-find-node current-file current-node) (setq Info-history ohist Info-history-list ohist-list) (message "Searching indices...done") @@ -2945,7 +2944,7 @@ (if (nth 3 entry) (concat " (line " (nth 3 entry) ")") ""))))) - (Info-find-node "apropos" "Index") + (Info-find-node 'apropos "Index") (setq Info-complete-cache nil))))) (defun Info-undefined () @@ -3287,10 +3286,14 @@ (interactive "P") (unless Info-current-node (error "No current Info node")) - (let ((node (concat "(" (file-name-nondirectory Info-current-file) ")" - Info-current-node))) + (let ((node (if (stringp Info-current-file) + (concat "(" (file-name-nondirectory Info-current-file) ")" + Info-current-node)))) (if (zerop (prefix-numeric-value arg)) (setq node (concat "(info \"" node "\")"))) + (unless (stringp Info-current-file) + (setq node (format "(Info-find-node '%S '%S)" + Info-current-file Info-current-node))) (kill-new node) (message "%s" node))) @@ -3817,29 +3820,30 @@ "^[ \t]+" "" (replace-regexp-in-string "[ \t\n]+" " " - (or (match-string 5) + (or (match-string-no-properties 5) (and (not (equal (match-string 4) "")) - (match-string 4)) - (match-string 2))))) + (match-string-no-properties 4)) + (match-string-no-properties 2))))) (external-link-p (string-match "(\\([^)]+\\))\\([^)]*\\)" node)) (file (if external-link-p (file-name-nondirectory - (match-string 1 node)) + (match-string-no-properties 1 node)) Info-current-file)) (hl Info-history-list) res) (if external-link-p (setq node (if (equal (match-string 2 node) "") "Top" - (match-string 2 node)))) + (match-string-no-properties 2 node)))) (while hl (if (and (string-equal node (nth 1 (car hl))) - (string-equal - file (if external-link-p - (file-name-nondirectory - (caar hl)) - (caar hl)))) + (equal file + (if (and external-link-p + (stringp (caar hl))) + (file-name-nondirectory + (caar hl)) + (caar hl)))) (setq res (car hl) hl nil) (setq hl (cdr hl)))) res))) 'info-xref-visited 'info-xref)) @@ -3932,26 +3936,28 @@ (if (and Info-fontify-visited-nodes (save-match-data (let* ((node (if (equal (match-string 3) "") - (match-string 1) - (match-string 3))) + (match-string-no-properties 1) + (match-string-no-properties 3))) (external-link-p (string-match "(\\([^)]+\\))\\([^)]*\\)" node)) (file (if external-link-p (file-name-nondirectory - (match-string 1 node)) + (match-string-no-properties 1 node)) Info-current-file)) (hl Info-history-list) res) (if external-link-p (setq node (if (equal (match-string 2 node) "") "Top" - (match-string 2 node)))) + (match-string-no-properties 2 node)))) (while hl (if (and (string-equal node (nth 1 (car hl))) - (string-equal - file (if external-link-p - (file-name-nondirectory (caar hl)) - (caar hl)))) + (equal file + (if (and external-link-p + (stringp (caar hl))) + (file-name-nondirectory + (caar hl)) + (caar hl)))) (setq res (car hl) hl nil) (setq hl (cdr hl)))) res))) 'info-xref-visited 'info-xref))) @@ -4210,8 +4216,8 @@ (defun Info-desktop-buffer-misc-data (desktop-dirname) "Auxiliary information to be saved in desktop file." - (if (not (member Info-current-file '("apropos" "history" "toc"))) - (list Info-current-file Info-current-node))) + (unless (member Info-current-file '(apropos history toc nil)) + (list Info-current-file Info-current-node))) (defun Info-restore-desktop-buffer (desktop-buffer-file-name desktop-buffer-name
--- a/lisp/mh-e/ChangeLog Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/mh-e/ChangeLog Mon Feb 20 16:30:15 2006 +0000 @@ -1,3 +1,68 @@ +2006-02-19 Bill Wohler <wohler@newt.com> + + * mh-alias.el (mh-address-mail-regexp) + (mh-goto-address-find-address-at-point): Delete copies from + goto-addr.el. + (mh-alias-suggest-alias): Use goto-address-mail-regexp instead of + mh-address-mail-regexp. + (mh-alias-add-address-under-point): Use + goto-address-find-address-at-point instead of + mh-goto-address-find-address-at-point. + + * mh-e.el (mh-show-use-goto-addr-flag): Delete. + + * mh-show.el (mh-show-mode): Mention goto-address-highlight-p in + docstring. + (mh-show-addr): Call goto-address unconditionally. User should use + goto-address-highlight-p instead of mh-show-use-goto-addr-flag. + +2006-02-18 Bill Wohler <wohler@newt.com> + + * mh-e.el (Version, mh-version): Add +cvs to version. + +2006-02-18 Bill Wohler <wohler@newt.com> + + Release MH-E version 7.92. + + * mh-e.el (Version, mh-version): Update for release 7.92. + +2006-02-17 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-folder-msg-number): Use purple on low-color, light + backgrounds per Mark's suggestion. + + * mh-utils.el (mh-image-load-path): Fix problem that images on + load-path or image-load-path would win over relative paths (newer + MH-E or Emacs distribution). + +2006-02-16 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-inherit-face-flag): New variable. Non-nil means that + the defface :inherit keyword is available. + (mh-face-data): New variable (contains all face specs) and + function (accessor). + (mh-folder-address, mh-folder-body, mh-folder-cur-msg-number) + (mh-folder-date, mh-folder-deleted, mh-folder-followup) + (mh-folder-msg-number, mh-folder-refiled) + (mh-folder-sent-to-me-hint, mh-folder-sent-to-me-sender) + (mh-folder-subject, mh-folder-tick, mh-folder-to) + (mh-search-folder, mh-letter-header-field, mh-show-cc) + (mh-show-date, mh-show-from) + (mh-show-header, mh-show-pgg-bad, mh-show-pgg-good) + (mh-show-pgg-unknown, mh-show-signature, mh-show-subject) + (mh-show-to, mh-show-xface, mh-speedbar-folder) + (mh-speedbar-folder-with-unseen-messages) + (mh-speedbar-selected-folder) + (mh-speedbar-selected-folder-with-unseen-messages): Use + mh-face-data. + + * mh-utils.el (mh-image-load-path): The variables image-load-path + or load-path would not get updated if user set mh-image-load-path. + Moved tests and add-to-list calls outside of cond so they are + applied consistently, even if they are redundant in some + circumstances. Efficiency isn't a concern here. Made error + messages more user-friendly. + 2006-02-15 Peter S Galbraith <psg@debian.org> * mh-compat.el (mh-image-search-load-path): Compatibility code.
--- a/lisp/mh-e/mh-alias.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/mh-e/mh-alias.el Mon Feb 20 16:30:15 2006 +0000 @@ -35,6 +35,8 @@ (mh-require-cl) +(require 'goto-addr) + (defvar mh-alias-alist 'not-read "Alist of MH aliases.") (defvar mh-alias-blind-alist nil @@ -62,11 +64,6 @@ automatically included. You can update the alias list manually using \\[mh-alias-reload].") -;; Copy of `goto-address-mail-regexp'. -(defvar mh-address-mail-regexp - "[-a-zA-Z0-9._]+@\\([-a-zA-z0-9_]+\\.\\)+[a-zA-Z0-9]+" - "A regular expression probably matching an e-mail address.") - ;;; Alias Loading @@ -343,7 +340,7 @@ ((string-match "^\\(.*\\) +<.*>$" string) ;; Some name <somename@foo.bar> -> recurse -> Some name (mh-alias-suggest-alias (match-string 1 string) no-comma-swap)) - ((string-match (concat mh-address-mail-regexp " +(\\(.*\\))$") string) + ((string-match (concat goto-address-mail-regexp " +(\\(.*\\))$") string) ;; somename@foo.bar (Some name) -> recurse -> Some name (mh-alias-suggest-alias (match-string 1 string) no-comma-swap)) ((string-match "^\\(Dr\\|Prof\\)\\.? +\\(.*\\)" string) @@ -595,24 +592,11 @@ (defun mh-alias-add-address-under-point () "Insert an alias for address under point." (interactive) - (let ((address (mh-goto-address-find-address-at-point))) + (let ((address (goto-address-find-address-at-point))) (if address (mh-alias-add-alias nil address) (message "No email address found under point")))) -;; From goto-addr.el, which we don't want to force-load on users. -(defun mh-goto-address-find-address-at-point () - "Find e-mail address around or before point. - -Then search backwards to beginning of line for the start of an -e-mail address. If no e-mail address found, return nil." - (re-search-backward "[^-_A-z0-9.@]" (mh-line-beginning-position) 'lim) - (if (or (looking-at mh-address-mail-regexp) ; already at start - (and (re-search-forward mh-address-mail-regexp - (mh-line-end-position) 'lim) - (goto-char (match-beginning 0)))) - (mh-match-string-no-properties 0))) - (defun mh-alias-apropos (regexp) "Show all aliases or addresses that match a regular expression REGEXP." (interactive "sAlias regexp: ")
--- a/lisp/mh-e/mh-e.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/mh-e/mh-e.el Mon Feb 20 16:30:15 2006 +0000 @@ -6,7 +6,7 @@ ;; Author: Bill Wohler <wohler@newt.com> ;; Maintainer: Bill Wohler <wohler@newt.com> -;; Version: 7.91+cvs +;; Version: 7.92+cvs ;; Keywords: mail ;; This file is part of GNU Emacs. @@ -121,7 +121,7 @@ ;; Try to keep variables local to a single file. Provide accessors if ;; variables are shared. Use this section as a last resort. -(defconst mh-version "7.91+cvs" "Version number of MH-E.") +(defconst mh-version "7.92+cvs" "Version number of MH-E.") ;; Variants @@ -2615,22 +2615,6 @@ :type 'integer :group 'mh-show) -(defcustom mh-show-use-goto-addr-flag (and (boundp 'goto-address-highlight-p) - goto-address-highlight-p) - "*Non-nil means highlight URLs and email addresses\\<goto-address-highlight-keymap>. - -To send a message using the highlighted email address or to view -the web page for the highlighted URL, use the middle mouse button -or \\[goto-address-at-point]. - -See Info node `(mh-e)Sending Mail' to see how to configure Emacs -to send the message using MH-E. - -The default value of this option comes from the value of -`goto-address-highlight-p'." - :type 'boolean - :group 'mh-show) - (defcustom mh-show-use-xface-flag (>= emacs-major-version 21) "*Non-nil means display face images in MH-show buffers. @@ -2968,6 +2952,8 @@ (if (boundp 'facemenu-unlisted-faces) (add-to-list 'facemenu-unlisted-faces "^mh-")) +;; Temporary function and data structure used for defining faces. +;; These will be unbound after the faces are defined. (defvar mh-min-colors-defined-flag (and (not mh-xemacs-flag) (>= emacs-major-version 22)) "Non-nil means defface supports min-colors display requirement.") @@ -2999,80 +2985,219 @@ (setq new-spec (cons entry new-spec))))) new-spec))) -(defface mh-folder-address '((t (:inherit mh-folder-subject))) +(defvar mh-inherit-face-flag (assq :inherit custom-face-attributes) + "Non-nil means that the `defface' :inherit keyword is available. +The :inherit keyword is available on all supported versions of +GNU Emacs and XEmacs from at least 21.5.23 on.") + +(defvar mh-face-data + '((mh-folder-followup + ((((class color) (background light)) + (:foreground "blue3")) + (((class color) (background dark)) + (:foreground "LightGoldenRod")) + (t + (:bold t)))) + (mh-folder-msg-number + ((((class color) (min-colors 64) (background light)) + (:foreground "snow4")) + (((class color) (min-colors 64) (background dark)) + (:foreground "snow3")) + (((class color) (background light)) + (:foreground "purple")) + (((class color) (background dark)) + (:foreground "cyan")))) + (mh-folder-refiled + ((((class color) (min-colors 64) (background light)) + (:foreground "DarkGoldenrod")) + (((class color) (min-colors 64) (background dark)) + (:foreground "LightGoldenrod")) + (((class color)) + (:foreground "yellow" :weight light)) + (((class grayscale) (background light)) + (:foreground "Gray90" :bold t :italic t)) + (((class grayscale) (background dark)) + (:foreground "DimGray" :bold t :italic t)) + (t + (:bold t :italic t)))) + (mh-folder-subject + ((((class color) (background light)) + (:foreground "blue4")) + (((class color) (background dark)) + (:foreground "yellow")) + (t + (:bold t)))) + (mh-folder-tick + ((((class color) (background light)) + (:background "#dddf7e")) + (((class color) (background dark)) + (:background "#dddf7e")) + (t + (:underline t)))) + (mh-folder-to + ((((class color) (min-colors 64) (background light)) + (:foreground "RosyBrown")) + (((class color) (min-colors 64) (background dark)) + (:foreground "LightSalmon")) + (((class color)) + (:foreground "green")) + (((class grayscale) (background light)) + (:foreground "DimGray" :italic t)) + (((class grayscale) (background dark)) + (:foreground "LightGray" :italic t)) + (t + (:italic t)))) + (mh-letter-header-field + ((((class color) (background light)) + (:background "gray90")) + (((class color) (background dark)) + (:background "gray10")) + (t + (:bold t)))) + (mh-search-folder + ((((class color) (background light)) + (:foreground "dark green" :bold t)) + (((class color) (background dark)) + (:foreground "indian red" :bold t)) + (t + (:bold t)))) + (mh-show-cc + ((((class color) (min-colors 64) (background light)) + (:foreground "DarkGoldenrod")) + (((class color) (min-colors 64) (background dark)) + (:foreground "LightGoldenrod")) + (((class color)) + (:foreground "yellow" :weight light)) + (((class grayscale) (background light)) + (:foreground "Gray90" :bold t :italic t)) + (((class grayscale) (background dark)) + (:foreground "DimGray" :bold t :italic t)) + (t + (:bold t :italic t)))) + (mh-show-date + ((((class color) (min-colors 64) (background light)) + (:foreground "ForestGreen")) + (((class color) (min-colors 64) (background dark)) + (:foreground "PaleGreen")) + (((class color)) + (:foreground "green")) + (((class grayscale) (background light)) + (:foreground "Gray90" :bold t)) + (((class grayscale) (background dark)) + (:foreground "DimGray" :bold t)) + (t + (:bold t :underline t)))) + (mh-show-from + ((((class color) (background light)) + (:foreground "red3")) + (((class color) (background dark)) + (:foreground "cyan")) + (t + (:bold t)))) + (mh-show-header + ((((class color) (min-colors 64) (background light)) + (:foreground "RosyBrown")) + (((class color) (min-colors 64) (background dark)) + (:foreground "LightSalmon")) + (((class color)) + (:foreground "green")) + (((class grayscale) (background light)) + (:foreground "DimGray" :italic t)) + (((class grayscale) (background dark)) + (:foreground "LightGray" :italic t)) + (t + (:italic t)))) + (mh-show-pgg-bad ((t (:bold t :foreground "DeepPink1")))) + (mh-show-pgg-good ((t (:bold t :foreground "LimeGreen")))) + (mh-show-pgg-unknown ((t (:bold t :foreground "DarkGoldenrod2")))) + (mh-show-signature ((t (:italic t)))) + (mh-show-to + ((((class color) (background light)) + (:foreground "SaddleBrown")) + (((class color) (background dark)) + (:foreground "burlywood")) + (((class grayscale) (background light)) + (:foreground "DimGray" :underline t)) + (((class grayscale) (background dark)) + (:foreground "LightGray" :underline t)) + (t (:underline t)))) + (mh-speedbar-folder + ((((class color) (background light)) + (:foreground "blue4")) + (((class color) (background dark)) + (:foreground "light blue")))) + (mh-speedbar-selected-folder + ((((class color) (background light)) + (:foreground "red1" :underline t)) + (((class color) (background dark)) + (:foreground "red1" :underline t)) + (t + (:underline t)))))) + +(defun mh-face-data (face &optional inherit) + "Return spec for FACE. +If INHERIT is non-nil and `defface' supports the :inherit +keyword, return INHERIT literally; otherwise, return spec for FACE. + +This isn't a perfect implementation. In the case that +the :inherit keyword is not supported, any additional attributes +in the inherit parameter are not added to the returned spec." + (if (and inherit mh-inherit-face-flag) + inherit + (mh-defface-compat (cadr (assoc face mh-face-data))))) + +(defface mh-folder-address + (mh-face-data 'mh-folder-subject '((t (:inherit mh-folder-subject)))) "Recipient face." :group 'mh-faces :group 'mh-folder) (defface mh-folder-body - '((((class color)) - (:inherit mh-folder-msg-number)) - (t - (:inherit mh-folder-msg-number :italic t))) + (mh-face-data 'mh-folder-msg-number + '((((class color)) + (:inherit mh-folder-msg-number)) + (t + (:inherit mh-folder-msg-number :italic t)))) "Body text face." :group 'mh-faces :group 'mh-folder) (defface mh-folder-cur-msg-number - '((t - (:inherit mh-folder-msg-number :bold t))) + (mh-face-data 'mh-folder-msg-number + '((t (:inherit mh-folder-msg-number :bold t)))) "Current message number face." :group 'mh-faces :group 'mh-folder) -(defface mh-folder-date '((t (:inherit mh-folder-msg-number))) +(defface mh-folder-date + (mh-face-data 'mh-folder-msg-number '((t (:inherit mh-folder-msg-number)))) "Date face." :group 'mh-faces :group 'mh-folder) -(defface mh-folder-deleted '((t (:inherit mh-folder-msg-number))) +(defface mh-folder-deleted + (mh-face-data 'mh-folder-msg-number '((t (:inherit mh-folder-msg-number)))) "Deleted message face." :group 'mh-faces :group 'mh-folder) -(defface mh-folder-followup - '((((class color) (background light)) - (:foreground "blue3")) - (((class color) (background dark)) - (:foreground "LightGoldenRod")) - (t - (:bold t))) +(defface mh-folder-followup (mh-face-data 'mh-folder-followup) "\"Re:\" face." :group 'mh-faces :group 'mh-folder) -(defface mh-folder-msg-number - (mh-defface-compat - '((((class color) (min-colors 64) (background light)) - (:foreground "snow4")) - (((class color) (min-colors 64) (background dark)) - (:foreground "snow3")) - (((class color)) - (:foreground "cyan")))) - +(defface mh-folder-msg-number (mh-face-data 'mh-folder-msg-number) "Message number face." :group 'mh-faces :group 'mh-folder) -(defface mh-folder-refiled - (mh-defface-compat - '((((class color) (min-colors 64) (background light)) - (:foreground "DarkGoldenrod")) - (((class color) (min-colors 64) (background dark)) - (:foreground "LightGoldenrod")) - (((class color)) - (:foreground "yellow" :weight light)) - (((class grayscale) (background light)) - (:foreground "Gray90" :bold t :italic t)) - (((class grayscale) (background dark)) - (:foreground "DimGray" :bold t :italic t)) - (t - (:bold t :italic t)))) +(defface mh-folder-refiled (mh-face-data 'mh-folder-refiled) "Refiled message face." :group 'mh-faces :group 'mh-folder) -(defface mh-folder-sent-to-me-hint '((t (:inherit mh-folder-date))) +(defface mh-folder-sent-to-me-hint + (mh-face-data 'mh-folder-msg-number '((t (:inherit mh-folder-date)))) "Fontification hint face in messages sent directly to us. The detection of messages sent to us is governed by the scan format `mh-scan-format-nmh' and the regular expression @@ -3080,7 +3205,8 @@ :group 'mh-faces :group 'mh-folder) -(defface mh-folder-sent-to-me-sender '((t (:inherit mh-folder-followup))) +(defface mh-folder-sent-to-me-sender + (mh-face-data 'mh-folder-followup '((t (:inherit mh-folder-followup)))) "Sender face in messages sent directly to us. The detection of messages sent to us is governed by the scan format `mh-scan-format-nmh' and the regular expression @@ -3088,212 +3214,122 @@ :group 'mh-faces :group 'mh-folder) -(defface mh-folder-subject - '((((class color) (background light)) - (:foreground "blue4")) - (((class color) (background dark)) - (:foreground "yellow")) - (t - (:bold t))) +(defface mh-folder-subject (mh-face-data 'mh-folder-subject) "Subject face." :group 'mh-faces :group 'mh-folder) -(defface mh-folder-tick - '((((class color) (background dark)) - (:background "#dddf7e")) - (((class color) (background light)) - (:background "#dddf7e")) - (t - (:underline t))) +(defface mh-folder-tick (mh-face-data 'mh-folder-tick) "Ticked message face." :group 'mh-faces :group 'mh-folder) -(defface mh-folder-to - (mh-defface-compat - '((((class color) (min-colors 64) (background light)) - (:foreground "RosyBrown")) - (((class color) (min-colors 64) (background dark)) - (:foreground "LightSalmon")) - (((class color)) - (:foreground "green")) - (((class grayscale) (background light)) - (:foreground "DimGray" :italic t)) - (((class grayscale) (background dark)) - (:foreground "LightGray" :italic t)) - (t - (:italic t)))) +(defface mh-folder-to (mh-face-data 'mh-folder-to) "\"To:\" face." :group 'mh-faces :group 'mh-folder) -(defface mh-search-folder - '((((class color) (background light)) - (:foreground "dark green" :bold t)) - (((class color) (background dark)) - (:foreground "indian red" :bold t)) - (t - (:bold t))) +(defface mh-letter-header-field (mh-face-data 'mh-letter-header-field) + "Editable header field value face in draft buffers." + :group 'mh-faces + :group 'mh-letter) + +(defface mh-search-folder (mh-face-data 'mh-search-folder) "Folder heading face in MH-Folder buffers created by searches." :group 'mh-faces :group 'mh-search) -(defface mh-letter-header-field - '((((class color) (background light)) - (:background "gray90")) - (((class color) (background dark)) - (:background "gray10")) - (t - (:bold t))) - "Editable header field value face in draft buffers." - :group 'mh-faces - :group 'mh-letter) - -(defface mh-show-cc - (mh-defface-compat - '((((class color) (min-colors 64) (background light)) - (:foreground "DarkGoldenrod")) - (((class color) (min-colors 64) (background dark)) - (:foreground "LightGoldenrod")) - (((class color)) - (:foreground "yellow" :weight light)) - (((class grayscale) (background light)) - (:foreground "Gray90" :bold t :italic t)) - (((class grayscale) (background dark)) - (:foreground "DimGray" :bold t :italic t)) - (t - (:bold t :italic t)))) +(defface mh-show-cc (mh-face-data 'mh-show-cc) "Face used to highlight \"cc:\" header fields." :group 'mh-faces :group 'mh-show) -(defface mh-show-date - (mh-defface-compat - '((((class color) (min-colors 64) (background light)) - (:foreground "ForestGreen")) - (((class color) (min-colors 64) (background dark)) - (:foreground "PaleGreen")) - (((class color)) - (:foreground "green")) - (((class grayscale) (background light)) - (:foreground "Gray90" :bold t)) - (((class grayscale) (background dark)) - (:foreground "DimGray" :bold t)) - (t - (:bold t :underline t)))) +(defface mh-show-date (mh-face-data 'mh-show-date) "Face used to highlight \"Date:\" header fields." :group 'mh-faces :group 'mh-show) -(defface mh-show-from - '((((class color) (background light)) - (:foreground "red3")) - (((class color) (background dark)) - (:foreground "cyan")) - (t - (:bold t))) +(defface mh-show-from (mh-face-data 'mh-show-from) "Face used to highlight \"From:\" header fields." :group 'mh-faces :group 'mh-show) -(defface mh-show-header - (mh-defface-compat - '((((class color) (min-colors 64) (background light)) - (:foreground "RosyBrown")) - (((class color) (min-colors 64) (background dark)) - (:foreground "LightSalmon")) - (((class color)) - (:foreground "green")) - (((class grayscale) (background light)) - (:foreground "DimGray" :italic t)) - (((class grayscale) (background dark)) - (:foreground "LightGray" :italic t)) - (t - (:italic t)))) +(defface mh-show-header (mh-face-data 'mh-show-header) "Face used to deemphasize less interesting header fields." :group 'mh-faces :group 'mh-show) -(defface mh-show-pgg-bad '((t (:bold t :foreground "DeepPink1"))) +(defface mh-show-pgg-bad (mh-face-data 'mh-show-pgg-bad) "Bad PGG signature face." :group 'mh-faces :group 'mh-show) -(defface mh-show-pgg-good '((t (:bold t :foreground "LimeGreen"))) +(defface mh-show-pgg-good (mh-face-data 'mh-show-pgg-good) "Good PGG signature face." :group 'mh-faces :group 'mh-show) -(defface mh-show-pgg-unknown '((t (:bold t :foreground "DarkGoldenrod2"))) +(defface mh-show-pgg-unknown (mh-face-data 'mh-show-pgg-unknown) "Unknown or untrusted PGG signature face." :group 'mh-faces :group 'mh-show) -(defface mh-show-signature '((t (:italic t))) +(defface mh-show-signature (mh-face-data 'mh-show-signature) "Signature face." :group 'mh-faces :group 'mh-show) -(defface mh-show-subject '((t (:inherit mh-folder-subject))) +(defface mh-show-subject + (mh-face-data 'mh-folder-subject '((t (:inherit mh-folder-subject)))) "Face used to highlight \"Subject:\" header fields." :group 'mh-faces :group 'mh-show) -(defface mh-show-to - '((((class color) (background light)) - (:foreground "SaddleBrown")) - (((class color) (background dark)) - (:foreground "burlywood")) - (((class grayscale) (background light)) - (:foreground "DimGray" :underline t)) - (((class grayscale) (background dark)) - (:foreground "LightGray" :underline t)) - (t (:underline t))) +(defface mh-show-to (mh-face-data 'mh-show-to) "Face used to highlight \"To:\" header fields." :group 'mh-faces :group 'mh-show) -(defface mh-show-xface '((t (:inherit (mh-show-from highlight)))) - "X-Face image face. +(defface mh-show-xface + (mh-face-data 'mh-show-from '((t (:inherit (mh-show-from highlight))))) + +"X-Face image face. The background and foreground are used in the image." :group 'mh-faces :group 'mh-show) -(defface mh-speedbar-folder - '((((class color) (background light)) - (:foreground "blue4")) - (((class color) (background dark)) - (:foreground "light blue"))) +(defface mh-speedbar-folder (mh-face-data 'mh-speedbar-folder) "Basic folder face." :group 'mh-faces :group 'mh-speedbar) (defface mh-speedbar-folder-with-unseen-messages - '((t - (:inherit mh-speedbar-folder :bold t))) + (mh-face-data 'mh-speedbar-folder + '((t (:inherit mh-speedbar-folder :bold t)))) "Folder face when folder contains unread messages." :group 'mh-faces :group 'mh-speedbar) (defface mh-speedbar-selected-folder - '((((class color) (background light)) - (:foreground "red1" :underline t)) - (((class color) (background dark)) - (:foreground "red1" :underline t)) - (t - (:underline t))) + (mh-face-data 'mh-speedbar-selected-folder) "Selected folder face." :group 'mh-faces :group 'mh-speedbar) (defface mh-speedbar-selected-folder-with-unseen-messages - '((t - (:inherit mh-speedbar-selected-folder :bold t))) + (mh-face-data 'mh-speedbar-selected-folder + '((t (:inherit mh-speedbar-selected-folder :bold t)))) "Selected folder face when folder contains unread messages." :group 'mh-faces :group 'mh-speedbar) +;; Get rid of temporary functions and data structures. +(fmakunbound 'mh-defface-compat) +(fmakunbound 'mh-face-data) +(makunbound 'mh-face-data) +(makunbound 'mh-inherit-face-flag) +(makunbound 'mh-min-colors-defined-flag) + (provide 'mh-e) ;; Local Variables:
--- a/lisp/mh-e/mh-mime.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/mh-e/mh-mime.el Mon Feb 20 16:30:15 2006 +0000 @@ -1741,9 +1741,9 @@ ("application/x-zip" "\.sxw" "application/vnd.sun.xml.writer") ("application/x-zip" "\.odg" "application/vnd.oasis.opendocument.graphics") ("application/x-zip" "\.odi" "application/vnd.oasis.opendocument.image") - ("application/x-zip" "\.odp" + ("application/x-zip" "\.odp" "application/vnd.oasis.opendocument.presentation") - ("application/x-zip" "\.ods" + ("application/x-zip" "\.ods" "application/vnd.oasis.opendocument.spreadsheet") ("application/x-zip" "\.odt" "application/vnd.oasis.opendocument.text")) "Substitutions to make for Content-Type returned from file command.
--- a/lisp/mh-e/mh-show.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/mh-e/mh-show.el Mon Feb 20 16:30:15 2006 +0000 @@ -36,13 +36,13 @@ (require 'mh-e) (require 'mh-scan) +(require 'font-lock) (require 'gnus-cite) (require 'gnus-util) +(require 'goto-addr) (autoload 'mh-make-buffer-data "mh-mime") ;can't be automatically generated -(require 'font-lock) - ;;; MH-Folder Commands @@ -818,6 +818,13 @@ (define-derived-mode mh-show-mode text-mode "MH-Show" "Major mode for showing messages in MH-E.\\<mh-show-mode-map> +Email addresses and URLs in the message are highlighted if the +option `goto-address-highlight-p' is on, which it is by default. +To view the web page for a highlighted URL or to send a message +using a highlighted email address, use the middle mouse button or +\\[goto-address-at-point]. See Info node `(mh-e)Sending Mail' to +see how to configure Emacs to send the message using MH-E. + The hook `mh-show-mode-hook' is called upon entry to this mode. See also `mh-folder-mode'. @@ -877,10 +884,7 @@ ;;;###mh-autoload (defun mh-show-addr () "Use `goto-address'." - (when mh-show-use-goto-addr-flag - (mh-require 'goto-addr nil t) - (if (fboundp 'goto-address) - (goto-address)))) + (goto-address)) ;;;###mh-autoload (defun mh-gnus-article-highlight-citation ()
--- a/lisp/mh-e/mh-utils.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/mh-e/mh-utils.el Mon Feb 20 16:30:15 2006 +0000 @@ -96,10 +96,11 @@ "Ensure that the MH-E images are accessible by `find-image'. Images for MH-E are found in \"../../etc/images\" relative to the -files in \"lisp/mh-e\". This function saves the actual location -found in the variable `mh-image-load-path'. If the images on your -system are actually located elsewhere, then set the variable -`mh-image-load-path' before starting MH-E. +files in \"lisp/mh-e\", in `image-load-path', or in `load-path'. +This function saves the actual location found in the variable +`mh-image-load-path'. If the images on your system are actually +located elsewhere, then set the variable `mh-image-load-path' +before starting MH-E. If `image-load-path' exists (since Emacs 22), then the contents of the variable `mh-image-load-path' is added to it if isn't @@ -110,40 +111,38 @@ See also variable `mh-image-load-path-called-flag'." (unless mh-image-load-path-called-flag (cond - ((and mh-image-load-path - (file-exists-p (expand-file-name "mh-logo.xpm" - mh-image-load-path)))) - ;; User setting exists. We're done. - ((and mh-image-load-path - (not (file-exists-p (expand-file-name "mh-logo.xpm" - mh-image-load-path)))) - ;; User setting does not exist. - (message "Variable mh-image-load-path %s does not contain MH-E images" - mh-image-load-path)) - ((mh-image-search-load-path "mh-logo.xpm") - ;; Emacs 22 already knows where the images are. - (setq mh-image-load-path - (file-name-directory (mh-image-search-load-path "mh-logo.xpm")))) - ((locate-library "mh-logo.xpm") - ;; Other Emacs already knows where the images are... - (setq mh-image-load-path - (file-name-directory (locate-library "mh-logo.xpm")))) - (t - ;; Guess `mh-image-load-path' if it wasn't provided by the user. - (let (mh-library-name) + (mh-image-load-path) ; user setting exists + ((let (mh-library-name) ; try relative setting ;; First, find mh-e in the load-path. (setq mh-library-name (locate-library "mh-e")) (if (not mh-library-name) (error "Can not find MH-E in load-path")) + ;; And then set mh-image-load-path relative to that. (setq mh-image-load-path (expand-file-name (concat (file-name-directory mh-library-name) - "../../etc/images")))) - (if (not (file-exists-p mh-image-load-path)) - (error "Can not find image directory %s" mh-image-load-path)) - (if (boundp 'image-load-path) - (add-to-list 'image-load-path mh-image-load-path) - (add-to-list 'load-path mh-image-load-path)))) + "../../etc/images"))) + (file-exists-p (expand-file-name "mh-logo.xpm" mh-image-load-path)))) + ((mh-image-search-load-path "mh-logo.xpm") + ;; Images in image-load-path. + (setq mh-image-load-path + (file-name-directory (mh-image-search-load-path "mh-logo.xpm")))) + ((locate-library "mh-logo.xpm") + ;; Images in load-path. + (setq mh-image-load-path + (file-name-directory (locate-library "mh-logo.xpm"))))) + + (if (not (file-exists-p mh-image-load-path)) + (error "Directory %s in mh-image-load-path does not exist" + mh-image-load-path)) + (if (not (file-exists-p + (expand-file-name "mh-logo.xpm" mh-image-load-path))) + (error "Directory %s in mh-image-load-path does not contain MH-E images" + mh-image-load-path)) + (if (boundp 'image-load-path) + (add-to-list 'image-load-path mh-image-load-path) + (add-to-list 'load-path mh-image-load-path)) + (setq mh-image-load-path-called-flag t))) ;;;###mh-autoload
--- a/lisp/net/rcirc.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/net/rcirc.el Mon Feb 20 16:30:15 2006 +0000 @@ -49,7 +49,7 @@ (defgroup rcirc nil "Simple IRC client." :version "22.1" - :prefix "rcirc" + :prefix "rcirc-" :group 'applications) (defcustom rcirc-server "irc.freenode.net" @@ -295,16 +295,23 @@ (defvar rcirc-topic nil) (defvar rcirc-keepalive-timer nil) (defvar rcirc-last-server-message-time nil) -(defun rcirc-connect (server port nick user-name full-name startup-channels) +(defun rcirc-connect (&optional server port nick user-name full-name startup-channels) (add-hook 'window-configuration-change-hook 'rcirc-window-configuration-change) (save-excursion (message "Connecting to %s..." server) (let* ((inhibit-eol-conversion) - (port-number (if (stringp port) - (string-to-number port) - port)) + (port-number (if port + (if (stringp port) + (string-to-number port) + port) + rcirc-port)) + (server (or server rcirc-server)) + (nick (or nick rcirc-nick)) + (user-name (or user-name rcirc-user-name)) + (full-name (or full-name rcirc-user-full-name)) + (startup-channels (or startup-channels (rcirc-startup-channels server))) (process (open-network-stream server nil server port-number))) ;; set up process (set-process-coding-system process 'raw-text 'raw-text) @@ -758,9 +765,9 @@ Create the buffer if it doesn't exist." (let ((buffer (rcirc-get-buffer process target))) (if buffer - (progn + (with-current-buffer buffer (when (not rcirc-target) - (setq rcirc-target target)) + (setq rcirc-target target)) buffer) ;; create the buffer (with-rcirc-process-buffer process @@ -896,20 +903,22 @@ (kill-buffer (current-buffer)) (set-window-configuration rcirc-window-configuration)) -(defun rcirc-get-any-buffer (process) +(defun rcirc-any-buffer (process) "Return a buffer for PROCESS, either the one selected or the process buffer." - (let ((buffer (window-buffer (selected-window)))) - (if (and buffer - (with-current-buffer buffer - (and (eq major-mode 'rcirc-mode) - (eq rcirc-process process)))) - buffer - (process-buffer process)))) + (if rcirc-always-use-server-buffer-flag + (process-buffer process) + (let ((buffer (window-buffer (selected-window)))) + (if (and buffer + (with-current-buffer buffer + (and (eq major-mode 'rcirc-mode) + (eq rcirc-process process)))) + buffer + (process-buffer process))))) (defcustom rcirc-response-formats - '(("PRIVMSG" . "%T<%n> %m") - ("NOTICE" . "%T-%n- %m") - ("ACTION" . "%T[%n] %m") + '(("PRIVMSG" . "%T<%N> %m") + ("NOTICE" . "%T-%N- %m") + ("ACTION" . "%T[%N %m]") ("COMMAND" . "%T%m") ("ERROR" . "%T%fw!!! %m") (t . "%T%fp*** %fs%n %r %m")) @@ -921,7 +930,8 @@ the of the following escape sequences replaced by the described values: %m The message text - %n The sender's nick (with face `rcirc-my-nick' or `rcirc-other-nick') + %n The sender's nick + %N The sender's nick (with face `rcirc-my-nick' or `rcirc-other-nick') %r The response-type %T The timestamp (with face `rcirc-timestamp') %t The target @@ -959,13 +969,20 @@ (cond ((eq key ?%) ;; %% -- literal % character "%") - ((eq key ?n) - ;; %n -- nick - (rcirc-facify (concat (rcirc-abbrev-nick sender) - (and target (concat "," target))) - (if (string= sender (rcirc-nick process)) - 'rcirc-my-nick - 'rcirc-other-nick))) + ((or (eq key ?n) (eq key ?N)) + ;; %n/%N -- nick + (let ((nick (concat (if (string= (with-rcirc-process-buffer + process rcirc-server) + sender) + "" + (rcirc-abbrev-nick sender)) + (and target (concat "," target))))) + (rcirc-facify nick + (if (eq key ?n) + face + (if (string= sender (rcirc-nick process)) + 'rcirc-my-nick + 'rcirc-other-nick))))) ((eq key ?T) ;; %T -- timestamp (rcirc-facify @@ -1015,9 +1032,7 @@ (assert (not (bufferp target))) (with-rcirc-process-buffer process (cond ((not target) - (if rcirc-always-use-server-buffer-flag - (process-buffer process) - (rcirc-get-any-buffer process))) + (rcirc-any-buffer process)) ((not (rcirc-channel-p target)) ;; message from another user (if (string= response "PRIVMSG") @@ -1026,7 +1041,7 @@ sender)) (rcirc-get-buffer process target t))) ((or (rcirc-get-buffer process target) - (rcirc-get-any-buffer process)))))) + (rcirc-any-buffer process)))))) (defvar rcirc-activity-type nil) (make-variable-buffer-local 'rcirc-activity-type) @@ -1069,22 +1084,26 @@ (set-marker-insertion-type rcirc-prompt-start-marker nil) (set-marker-insertion-type rcirc-prompt-end-marker nil) - ;; fill the text we just inserted, maybe - (when (and rcirc-fill-flag - (not (string= response "372"))) ;/motd - (let ((fill-prefix - (or rcirc-fill-prefix - (make-string - (or (next-single-property-change 0 'rcirc-text - fmted-text) - 8) - ?\s))) - (fill-column (cond ((eq rcirc-fill-column 'frame-width) - (1- (frame-width))) - (rcirc-fill-column - rcirc-fill-column) - (t fill-column)))) - (fill-region fill-start rcirc-prompt-start-marker 'left t)))) + (let ((text-start (make-marker))) + (set-marker text-start + (or (next-single-property-change fill-start + 'rcirc-text) + (point-max))) + ;; squeeze spaces out of text before rcirc-text + (fill-region fill-start (1- text-start)) + + ;; fill the text we just inserted, maybe + (when (and rcirc-fill-flag + (not (string= response "372"))) ;/motd + (let ((fill-prefix + (or rcirc-fill-prefix + (make-string (- text-start fill-start) ?\s))) + (fill-column (cond ((eq rcirc-fill-column 'frame-width) + (1- (frame-width))) + (rcirc-fill-column + rcirc-fill-column) + (t fill-column)))) + (fill-region fill-start rcirc-prompt-start-marker 'left t))))) ;; set inserted text to be read-only (when rcirc-read-only-flag @@ -1175,14 +1194,15 @@ (defun rcirc-put-nick-channel (process nick channel) "Add CHANNEL to list associated with NICK." - (with-rcirc-process-buffer process - (let* ((chans (gethash nick rcirc-nick-table)) - (record (assoc-string channel chans t))) - (if record - (setcdr record (current-time)) - (puthash nick (cons (cons channel (current-time)) - chans) - rcirc-nick-table))))) + (let ((nick (rcirc-user-nick nick))) + (with-rcirc-process-buffer process + (let* ((chans (gethash nick rcirc-nick-table)) + (record (assoc-string channel chans t))) + (if record + (setcdr record (current-time)) + (puthash nick (cons (cons channel (current-time)) + chans) + rcirc-nick-table)))))) (defun rcirc-nick-remove (process nick) "Remove NICK from table." @@ -1613,15 +1633,21 @@ (propertize (or string "") 'face face 'rear-nonsticky t)) (defvar rcirc-url-regexp - (rx word-boundary - (or "www." - (and (or "http" "https" "ftp" "file" "gopher" "news" "telnet" "wais" - "mailto") - "://" - (1+ (char "a-zA-Z0-9_.")) - (optional ":" (1+ (char "0-9"))))) - (1+ (char "-a-zA-Z0-9_=!?#$\@~`%&*+|\\/:;.,{}[]")) - (char "-a-zA-Z0-9_=#$\@~`%&*+|\\/:;{}[]")) + (rx-to-string + `(and word-boundary + (or "www." + (and (or "http" "https" "ftp" "file" "gopher" "news" "telnet" + "wais" "mailto") + "://" + (1+ (char "-a-zA-Z0-9_.")) + (optional ":" (1+ (char "0-9")))) + (and (1+ (char "-a-zA-Z0-9_.")) + (or ".com" ".net" ".org") + word-boundary)) + (optional + (and "/" + (1+ (char "-a-zA-Z0-9_=!?#$\@~`%&*+|\\/:;.,{}[]")) + (char "-a-zA-Z0-9_=#$\@~`%&*+|\\/:;{}[]"))))) "Regexp matching URLs. Set to nil to disable URL features in rcirc.") (defun rcirc-browse-url (&optional arg)
--- a/lisp/progmodes/gdb-ui.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/progmodes/gdb-ui.el Mon Feb 20 16:30:15 2006 +0000 @@ -72,8 +72,16 @@ ;; 1) Strings that are watched don't update in the speedbar when their ;; contents change. -;; 2) Watch expressions go out of scope when the inferior is re-run. -;; 3) Cannot handle multiple debug sessions. +;; 2) Cannot handle multiple debug sessions. + +;;; Problems with watch expressions: + +;; 1) They go out of scope when the inferior is re-run. +;; 2) -var-update reports that an out of scope variable has changed: +;; changelist=[{name="var1",in_scope="false"}], but the value can't be accessed. +;; (-var-list-children, in contrast allows you to create variable objects of +;; the children when they are out of scope and get their values). +;; 3) VARNUM increments even when vaiable object is not created (maybe trivial). ;;; TODO: @@ -97,8 +105,12 @@ (defvar gdb-selected-frame nil) (defvar gdb-frame-number nil) (defvar gdb-current-language nil) -(defvar gdb-var-list nil "List of variables in watch window.") -(defvar gdb-var-changed nil "Non-nil means that `gdb-var-list' has changed.") +(defvar gdb-var-list nil + "List of variables in watch window. +Each element has the form (EXPRESSION VARNUM NUMCHILD TYPE VALUE STATUS) where +STATUS is nil (unchanged), `changed' or `out-of-scope'.") +(defvar gdb-force-update t + "Non-nil means that view of watch expressions will be updated in the speedbar.") (defvar gdb-main-file nil "Source file from which program execution begins.") (defvar gdb-overlay-arrow-position nil) (defvar gdb-server-prefix nil) @@ -203,8 +215,8 @@ If `gdb-many-windows' is t, regardless of the value of `gdb-show-main', the layout below will appear unless `gdb-use-separate-io-buffer' is nil when the source buffer -occupies the full width of the frame. Keybindings are given in -relevant buffer. +occupies the full width of the frame. Keybindings are shown in +some of the buffers. Watch expressions appear in the speedbar/slowbar. @@ -217,28 +229,28 @@ detailed description of this mode. -+--------------------------------------------------------------+ -| GDB Toolbar | -+-------------------------------+------------------------------+ -| GUD buffer (I/O of GDB) | Locals buffer | -| | | -| | | -| | | -+-------------------------------+------------------------------+ -| Source buffer | I/O buffer (of inferior) | -| | (comint-mode) | -| | | -| | | -| | | -| | | -| | | -| | | -+-------------------------------+------------------------------+ -| Stack buffer | Breakpoints buffer | -| RET gdb-frames-select | SPC gdb-toggle-breakpoint | -| | RET gdb-goto-breakpoint | -| | d gdb-delete-breakpoint | -+-------------------------------+------------------------------+" ++----------------------------------------------------------------------+ +| GDB Toolbar | ++-----------------------------------+----------------------------------+ +| GUD buffer (I/O of GDB) | Locals buffer | +| | | +| | | +| | | ++-----------------------------------+----------------------------------+ +| Source buffer | I/O buffer (of debugged program) | +| | (comint-mode) | +| | | +| | | +| | | +| | | +| | | +| | | ++-----------------------------------+----------------------------------+ +| Stack buffer | Breakpoints buffer | +| RET gdb-frames-select | SPC gdb-toggle-breakpoint | +| | RET gdb-goto-breakpoint | +| | D gdb-delete-breakpoint | ++-----------------------------------+----------------------------------+" ;; (interactive (list (gud-query-cmdline 'gdba))) ;; @@ -444,7 +456,7 @@ gdb-current-language nil gdb-frame-number nil gdb-var-list nil - gdb-var-changed nil + gdb-force-update t gdb-first-post-prompt t gdb-prompting nil gdb-input-queue nil @@ -598,8 +610,7 @@ (nth 1 var) "\"\n") (concat "-var-evaluate-expression " (nth 1 var) "\n")) `(lambda () (gdb-var-evaluate-expression-handler - ,(nth 1 var) nil)))) - (setq gdb-var-changed t)) + ,(nth 1 var) nil))))) (if (search-forward "Undefined command" nil t) (message-box "Watching expressions requires gdb 6.0 onwards") (message "No symbol \"%s\" in current context." expr)))) @@ -608,16 +619,11 @@ (goto-char (point-min)) (re-search-forward ".*value=\\(\".*\"\\)" nil t) (catch 'var-found - (let ((num 0)) - (dolist (var gdb-var-list) - (if (string-equal varnum (cadr var)) - (progn - (if changed (setcar (nthcdr 5 var) t)) - (setcar (nthcdr 4 var) (read (match-string 1))) - (setcar (nthcdr num gdb-var-list) var) - (throw 'var-found nil))) - (setq num (+ num 1))))) - (setq gdb-var-changed t)) + (dolist (var gdb-var-list) + (when (string-equal varnum (cadr var)) + (if changed (setcar (nthcdr 5 var) 'changed)) + (setcar (nthcdr 4 var) (read (match-string 1))) + (throw 'var-found nil))))) (defun gdb-var-list-children (varnum) (gdb-enqueue-input @@ -663,20 +669,25 @@ 'gdb-var-update-handler)) (push 'gdb-var-update gdb-pending-triggers))) -(defconst gdb-var-update-regexp "name=\"\\(.*?\\)\"") +(defconst gdb-var-update-regexp "name=\"\\(.*?\\)\",in_scope=\"\\(.*?\\)\"") (defun gdb-var-update-handler () + (dolist (var gdb-var-list) + (setcar (nthcdr 5 var) nil)) (goto-char (point-min)) (while (re-search-forward gdb-var-update-regexp nil t) - (catch 'var-found-1 - (let ((varnum (match-string 1))) - (dolist (var gdb-var-list) - (gdb-enqueue-input - (list - (concat "server interpreter mi \"-var-evaluate-expression " - varnum "\"\n") - `(lambda () (gdb-var-evaluate-expression-handler ,varnum t)))) - (throw 'var-found-1 nil))))) + (let ((varnum (match-string 1))) + (if (string-equal (match-string 2) "false") + (catch 'var-found + (dolist (var gdb-var-list) + (when (string-equal varnum (cadr var)) + (setcar (nthcdr 5 var) 'out-of-scope) + (throw 'var-found nil)))) + (gdb-enqueue-input + (list + (concat "server interpreter mi \"-var-evaluate-expression " + varnum "\"\n") + `(lambda () (gdb-var-evaluate-expression-handler ,varnum t))))))) (setq gdb-pending-triggers (delq 'gdb-var-update gdb-pending-triggers)) (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame)) @@ -712,8 +723,7 @@ (setq gdb-var-list (delq var gdb-var-list)) (dolist (varchild gdb-var-list) (if (string-match (concat (nth 1 var) "\\.") (nth 1 varchild)) - (setq gdb-var-list (delq varchild gdb-var-list)))) - (setq gdb-var-changed t)))))) + (setq gdb-var-list (delq varchild gdb-var-list))))))))) (defun gdb-edit-value (text token indent) "Assign a value to a variable displayed in the speedbar." @@ -729,8 +739,9 @@ 'ignore)))) (defcustom gdb-show-changed-values t - "If non-nil highlight values that have recently changed in the speedbar. -The highlighting is done with `font-lock-warning-face'." + "If non-nil change the face of out of scope variables and changed values. +Out of scope variables are suppressed with `shadow' face. +Changed values are highlighted with the face `font-lock-warning-face'." :type 'boolean :group 'gud :version "22.1") @@ -750,7 +761,7 @@ (dolist (var gdb-var-list) (if (string-match (concat token "\\.") (nth 1 var)) (setq gdb-var-list (delq var gdb-var-list)))) - (setq gdb-var-changed t) + (setq gdb-force-update t) (with-current-buffer gud-comint-buffer (speedbar-timer-fn))))) @@ -1204,9 +1215,7 @@ ;; FIXME: with GDB-6 on Darwin, this might very well work. ;; Only needed/used with speedbar/watch expressions. (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame)) - (setq gdb-var-changed t) ; force update - (dolist (var gdb-var-list) - (setcar (nthcdr 5 var) nil)) + (setq gdb-force-update t) (if (string-equal gdb-version "pre-6.4") (gdb-var-update) (gdb-var-update-1))))) @@ -2461,17 +2470,17 @@ :visible (memq gud-minor-mode '(gdbmi gdba)))) (define-key menu [gdb] '("Gdb" . gdb-display-gdb-buffer)) (define-key menu [threads] '("Threads" . gdb-display-threads-buffer)) - (define-key menu [memory] '("Memory" . gdb-display-memory-buffer)) - (define-key menu [disassembly] - '("Disassembly" . gdb-display-assembler-buffer)) - (define-key menu [registers] '("Registers" . gdb-display-registers-buffer)) (define-key menu [inferior] '(menu-item "Inferior IO" gdb-display-separate-io-buffer :enable gdb-use-separate-io-buffer)) + (define-key menu [memory] '("Memory" . gdb-display-memory-buffer)) + (define-key menu [registers] '("Registers" . gdb-display-registers-buffer)) + (define-key menu [disassembly] + '("Disassembly" . gdb-display-assembler-buffer)) + (define-key menu [breakpoints] + '("Breakpoints" . gdb-display-breakpoints-buffer)) (define-key menu [locals] '("Locals" . gdb-display-locals-buffer)) - (define-key menu [frames] '("Stack" . gdb-display-stack-buffer)) - (define-key menu [breakpoints] - '("Breakpoints" . gdb-display-breakpoints-buffer))) + (define-key menu [frames] '("Stack" . gdb-display-stack-buffer))) (let ((menu (make-sparse-keymap "GDB-Frames"))) (define-key gud-menu-map [frames] @@ -2480,15 +2489,15 @@ (define-key menu [gdb] '("Gdb" . gdb-frame-gdb-buffer)) (define-key menu [threads] '("Threads" . gdb-frame-threads-buffer)) (define-key menu [memory] '("Memory" . gdb-frame-memory-buffer)) - (define-key menu [disassembly] '("Disassembiy" . gdb-frame-assembler-buffer)) - (define-key menu [registers] '("Registers" . gdb-frame-registers-buffer)) (define-key menu [inferior] '(menu-item "Inferior IO" gdb-frame-separate-io-buffer :enable gdb-use-separate-io-buffer)) + (define-key menu [registers] '("Registers" . gdb-frame-registers-buffer)) + (define-key menu [disassembly] '("Disassembiy" . gdb-frame-assembler-buffer)) + (define-key menu [breakpoints] + '("Breakpoints" . gdb-frame-breakpoints-buffer)) (define-key menu [locals] '("Locals" . gdb-frame-locals-buffer)) - (define-key menu [frames] '("Stack" . gdb-frame-stack-buffer)) - (define-key menu [breakpoints] - '("Breakpoints" . gdb-frame-breakpoints-buffer))) + (define-key menu [frames] '("Stack" . gdb-frame-stack-buffer))) (let ((menu (make-sparse-keymap "GDB-UI/MI"))) (define-key gud-menu-map [ui] @@ -2617,6 +2626,8 @@ (setq gdb-overlay-arrow-position nil)) (setq overlay-arrow-variable-list (delq 'gdb-overlay-arrow-position overlay-arrow-variable-list)) + (if (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame)) + (speedbar-refresh)) (setq gud-running nil) (setq gdb-active-process nil) (setq gdb-var-list nil) @@ -3013,7 +3024,6 @@ (throw 'child-already-watched nil))) (push varchild var-list)))) (push var var-list))) - (setq gdb-var-changed t) (setq gdb-var-list (nreverse var-list))))) ; Uses "-var-update --all-values". Needs GDB 6.4 onwards. @@ -3028,23 +3038,24 @@ 'gdb-var-update-handler-1)) (push 'gdb-var-update gdb-pending-triggers)))) -(defconst gdb-var-update-regexp-1 "name=\"\\(.*?\\)\",value=\\(\".*?\"\\),") +(defconst gdb-var-update-regexp-1 + "name=\"\\(.*?\\)\",\\(?:value=\\(\".*?\"\\),\\)?in_scope=\"\\(.*?\\)\"") (defun gdb-var-update-handler-1 () + (dolist (var gdb-var-list) + (setcar (nthcdr 5 var) nil)) (goto-char (point-min)) (while (re-search-forward gdb-var-update-regexp-1 nil t) (let ((varnum (match-string 1))) - (catch 'var-found1 - (let ((num 0)) - (dolist (var gdb-var-list) - (if (string-equal varnum (cadr var)) - (progn - (setcar (nthcdr 5 var) t) - (setcar (nthcdr 4 var) (read (match-string 2))) - (setcar (nthcdr num gdb-var-list) var) - (throw 'var-found1 nil))) - (setq num (+ num 1)))))) - (setq gdb-var-changed t)) + (catch 'var-found + (dolist (var gdb-var-list) + (when (string-equal varnum (cadr var)) + (if (string-equal (match-string 3) "false") + (setcar (nthcdr 5 var) 'out-of-scope) + (setcar (nthcdr 5 var) 'changed) + (setcar (nthcdr 4 var) + (read (match-string 2)))) + (throw 'var-found nil)))))) (setq gdb-pending-triggers (delq 'gdb-var-update gdb-pending-triggers)) (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame))
--- a/lisp/progmodes/gud.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/progmodes/gud.el Mon Feb 20 16:30:15 2006 +0000 @@ -43,14 +43,13 @@ (eval-when-compile (require 'cl)) ; for case macro (require 'comint) -(require 'font-lock) (defvar gdb-active-process) (defvar gdb-define-alist) (defvar gdb-macro-info) (defvar gdb-server-prefix) (defvar gdb-show-changed-values) -(defvar gdb-var-changed) +(defvar gdb-force-update) (defvar gdb-var-list) (defvar gdb-speedbar-auto-raise) (defvar tool-bar-map) @@ -444,7 +443,7 @@ (p (window-point window))) (cond ((memq minor-mode '(gdbmi gdba)) - (when (or gdb-var-changed + (when (or gdb-force-update (not (save-excursion (goto-char (point-min)) (let ((case-fold-search t)) @@ -453,51 +452,67 @@ (insert "Watch Expressions:\n") (if gdb-speedbar-auto-raise (raise-frame speedbar-frame)) - (let ((var-list gdb-var-list)) + (let ((var-list gdb-var-list) parent) (while var-list - (let* (char (depth 0) (start 0) - (var (car var-list)) (varnum (nth 1 var))) + (let* (char (depth 0) (start 0) (var (car var-list)) + (expr (car var)) (varnum (nth 1 var)) + (type (nth 3 var)) (status (nth 5 var))) + (put-text-property + 0 (length expr) 'face font-lock-variable-name-face expr) + (put-text-property + 0 (length type) 'face font-lock-type-face type) (while (string-match "\\." varnum start) (setq depth (1+ depth) start (1+ (match-beginning 0)))) + (if (eq depth 0) (setq parent nil)) (if (or (equal (nth 2 var) "0") (and (equal (nth 2 var) "1") - (string-match "char \\*$" (nth 3 var)))) - (speedbar-make-tag-line 'bracket ?? nil nil - (concat (car var) "\t" (nth 4 var)) - 'gdb-edit-value - nil - (if (and (nth 5 var) - gdb-show-changed-values) - 'font-lock-warning-face - nil) depth) + (string-match "char \\*$" type))) + (speedbar-make-tag-line + 'bracket ?? nil nil + (concat expr "\t" (nth 4 var)) + (if (or parent (eq status 'out-of-scope)) + nil 'gdb-edit-value) + nil + (if gdb-show-changed-values + (or parent (case status + (changed 'font-lock-warning-face) + (out-of-scope 'shadow) + (t t))) + t) + depth) + (if (eq status 'out-of-scope) (setq parent 'shadow)) (if (and (cadr var-list) (string-match (concat varnum "\\.") (cadr (cadr var-list)))) (setq char ?-) (setq char ?+)) - (if (string-match "\\*$" (nth 3 var)) - (speedbar-make-tag-line 'bracket char - 'gdb-speedbar-expand-node varnum - (concat (car var) "\t" - (nth 3 var)"\t" - (nth 4 var)) - 'gdb-edit-value nil - (if (and (nth 5 var) - gdb-show-changed-values) - 'font-lock-warning-face - nil) depth) - (speedbar-make-tag-line 'bracket char - 'gdb-speedbar-expand-node varnum - (concat (car var) "\t" (nth 3 var)) - nil nil nil depth)))) + (if (string-match "\\*$" type) + (speedbar-make-tag-line + 'bracket char + 'gdb-speedbar-expand-node varnum + (concat expr "\t" + type "\t" + (nth 4 var)) + (if (or parent status 'out-of-scope) + nil 'gdb-edit-value) + nil + (if (and status gdb-show-changed-values) + 'shadow t) + depth) + (speedbar-make-tag-line + 'bracket char + 'gdb-speedbar-expand-node varnum + (concat expr "\t" type) + nil nil + (if (and status gdb-show-changed-values) 'shadow t) + depth)))) (setq var-list (cdr var-list)))) - (setq gdb-var-changed nil))) - (t (if (and (save-excursion - (goto-char (point-min)) - (looking-at "Current Stack:")) - (equal gud-last-last-frame gud-last-speedbar-stackframe)) - nil + (setq gdb-force-update nil))) + (t (unless (and (save-excursion + (goto-char (point-min)) + (looking-at "Current Stack:")) + (equal gud-last-last-frame gud-last-speedbar-stackframe)) (let ((gud-frame-list (cond ((eq minor-mode 'gdb) (gud-gdb-get-stackframe buffer))
--- a/lisp/speedbar.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/speedbar.el Mon Feb 20 16:30:15 2006 +0000 @@ -1019,10 +1019,10 @@ (lambda () (let ((speedbar-update-flag t)) (speedbar-timer-fn))))) -(defmacro speedbar-frame-width () +(defsubst speedbar-frame-width () "Return the width of the speedbar frame in characters. nil if it doesn't exist." - '(window-width (get-buffer-window speedbar-buffer))) + (frame-width speedbar-frame)) (defun speedbar-mode () "Major mode for managing a display of directories and tags. @@ -1708,9 +1708,13 @@ (defun speedbar-make-button (start end face mouse function &optional token) "Create a button from START to END, with FACE as the display face. MOUSE is the mouse face. When this button is clicked on FUNCTION -will be run with the TOKEN parameter (any Lisp object)" +will be run with the TOKEN parameter (any Lisp object). If FACE +is t use the text properties of the string that is passed as an +argument." + (unless (eq face t) + (put-text-property start end 'face face)) (add-text-properties - start end `(face ,face mouse-face ,mouse invisible nil + start end `(mouse-face ,mouse invisible nil speedbar-text ,(buffer-substring-no-properties start end))) (if speedbar-use-tool-tips-flag (put-text-property start end 'help-echo #'dframe-help-echo)) @@ -2123,7 +2127,7 @@ "A wrapper for `try-completion'. Passes STRING and ALIST to `try-completion' if ALIST passes some tests." - (if (and (listp alist) (not (null alist)) + (if (and (consp alist) (listp (car alist)) (stringp (car (car alist)))) (try-completion string alist) nil)) @@ -2423,8 +2427,7 @@ ;; Choose the correct method of doodling. (if (and speedbar-mode-specific-contents-flag - (listp speedbar-special-mode-expansion-list) - speedbar-special-mode-expansion-list + (consp speedbar-special-mode-expansion-list) (local-variable-p 'speedbar-special-mode-expansion-list (current-buffer))) @@ -2463,12 +2466,14 @@ ) (set-buffer speedbar-buffer) (speedbar-with-writable - (erase-buffer) - (dolist (func funclst) - (setq default-directory cbd) - (funcall func cbd 0)) - (speedbar-reconfigure-keymaps) - (goto-char (point-min))) + (let* ((window (get-buffer-window speedbar-buffer 0)) + (p (window-point window))) + (erase-buffer) + (dolist (func funclst) + (setq default-directory cbd) + (funcall func cbd 0)) + (speedbar-reconfigure-keymaps) + (set-window-point window p))) )))) (defun speedbar-update-directory-contents () @@ -2572,7 +2577,6 @@ ;; We do not erase the buffer because these functions may ;; decide NOT to update themselves. (funcall func specialbuff))) - (goto-char (point-min)))) (speedbar-reconfigure-keymaps)) @@ -2614,8 +2618,7 @@ (speedbar-maybe-add-localized-support (current-buffer)) ;; Update for special mode all the time! (if (and speedbar-mode-specific-contents-flag - (listp speedbar-special-mode-expansion-list) - speedbar-special-mode-expansion-list + (consp speedbar-special-mode-expansion-list) (local-variable-p 'speedbar-special-mode-expansion-list (current-buffer)))
--- a/lisp/textmodes/ispell.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/textmodes/ispell.el Mon Feb 20 16:30:15 2006 +0000 @@ -508,11 +508,7 @@ (const "~nroff") (const "~list") (const "~latin1") (const "~latin3") (const :tag "default" nil)) - (choice :tag "Coding system" - (const iso-8859-1) - (const iso-8859-2) - (const koi8-r) - (const windows-1251)))) + (coding-system :tag "Coding System"))) :group 'ispell) @@ -570,10 +566,10 @@ '(("esperanto" "[A-Za-z\246\254\266\274\306\330\335\336\346\370\375\376]" "[^A-Za-z\246\254\266\274\306\330\335\336\346\370\375\376]" - "[-']" t ("-C") "~latin3" iso-8859-1) + "[-']" t ("-C") "~latin3" iso-8859-3) ("esperanto-tex" "[A-Za-z^\\]" "[^A-Za-z^\\]" - "[-'`\"]" t ("-C" "-d" "esperanto") "~tex" iso-8859-1) + "[-'`\"]" t ("-C" "-d" "esperanto") "~tex" iso-8859-3) ("francais7" "[A-Za-z]" "[^A-Za-z]" "[`'^---]" t nil nil iso-8859-1) ("francais" ; Francais.aff @@ -2604,7 +2600,7 @@ (mapcar 'list (ispell-valid-dictionary-list))) nil t) current-prefix-arg)) - (unless arg (ispell-accept-buffer-local-defs)) + (unless arg (ispell-buffer-local-dict)) (if (equal dict "default") (setq dict nil)) ;; This relies on completing-read's bug of returning "" for no match (cond ((equal dict "")
--- a/lisp/wid-edit.el Thu Feb 16 16:18:54 2006 +0000 +++ b/lisp/wid-edit.el Mon Feb 20 16:30:15 2006 +0000 @@ -916,67 +916,79 @@ "Invoke the button that the mouse is pointing at." (interactive "e") (if (widget-event-point event) - (let* ((pos (widget-event-point event)) + (let* ((oevent event) + (mouse-1 (memq (event-basic-type event) '(mouse-1 down-mouse-1))) + (pos (widget-event-point event)) (start (event-start event)) (button (get-char-property pos 'button (and (windowp (posn-window start)) (window-buffer (posn-window start)))))) - (if button - ;; Mouse click on a widget button. Do the following - ;; in a save-excursion so that the click on the button - ;; doesn't change point. - (save-selected-window - (select-window (posn-window (event-start event))) - (save-excursion - (goto-char (posn-point (event-start event))) - (let* ((overlay (widget-get button :button-overlay)) - (pressed-face (or (widget-get button :pressed-face) - widget-button-pressed-face)) - (face (overlay-get overlay 'face)) - (mouse-face (overlay-get overlay 'mouse-face))) - (unwind-protect - ;; Read events, including mouse-movement events - ;; until we receive a release event. Highlight/ - ;; unhighlight the button the mouse was initially - ;; on when we move over it. - (save-excursion - (when face ; avoid changing around image - (overlay-put overlay 'face pressed-face) - (overlay-put overlay 'mouse-face pressed-face)) - (unless (widget-apply button :mouse-down-action event) - (let ((track-mouse t)) - (while (not (widget-button-release-event-p event)) - (setq event (read-event) - pos (widget-event-point event)) - (if (and pos - (eq (get-char-property pos 'button) - button)) - (when face - (overlay-put overlay 'face pressed-face) - (overlay-put overlay 'mouse-face pressed-face)) - (overlay-put overlay 'face face) - (overlay-put overlay 'mouse-face mouse-face))))) - - ;; When mouse is released over the button, run - ;; its action function. - (when (and pos - (eq (get-char-property pos 'button) button)) - (widget-apply-action button event))) - (overlay-put overlay 'face face) - (overlay-put overlay 'mouse-face mouse-face)))) - - (unless (pos-visible-in-window-p (widget-event-point event)) - (mouse-set-point event) - (beginning-of-line) - (recenter)) - ) - + (when (or (null button) + (catch 'button-press-cancelled + ;; Mouse click on a widget button. Do the following + ;; in a save-excursion so that the click on the button + ;; doesn't change point. + (save-selected-window + (select-window (posn-window (event-start event))) + (save-excursion + (goto-char (posn-point (event-start event))) + (let* ((overlay (widget-get button :button-overlay)) + (pressed-face (or (widget-get button :pressed-face) + widget-button-pressed-face)) + (face (overlay-get overlay 'face)) + (mouse-face (overlay-get overlay 'mouse-face))) + (unwind-protect + ;; Read events, including mouse-movement + ;; events, waiting for a release event. If we + ;; began with a mouse-1 event and receive a + ;; movement event, that means the user wants + ;; to perform drag-selection, so cancel the + ;; button press and do the default mouse-1 + ;; action. For mouse-2, just highlight/ + ;; unhighlight the button the mouse was + ;; initially on when we move over it. + (save-excursion + (when face ; avoid changing around image + (overlay-put overlay 'face pressed-face) + (overlay-put overlay 'mouse-face pressed-face)) + (unless (widget-apply button :mouse-down-action event) + (let ((track-mouse t)) + (while (not (widget-button-release-event-p event)) + (setq event (read-event)) + (when (and mouse-1 (mouse-movement-p event)) + (push event unread-command-events) + (setq event oevent) + (throw 'button-press-cancelled t)) + (setq pos (widget-event-point event)) + (if (and pos + (eq (get-char-property pos 'button) + button)) + (when face + (overlay-put overlay 'face pressed-face) + (overlay-put overlay 'mouse-face pressed-face)) + (overlay-put overlay 'face face) + (overlay-put overlay 'mouse-face mouse-face))))) + + ;; When mouse is released over the button, run + ;; its action function. + (when (and pos + (eq (get-char-property pos 'button) button)) + (widget-apply-action button event))) + (overlay-put overlay 'face face) + (overlay-put overlay 'mouse-face mouse-face)))) + + ;; This loses if the widget action switches windows. -- cyd + ;; (unless (pos-visible-in-window-p (widget-event-point event)) + ;; (mouse-set-point event) + ;; (beginning-of-line) + ;; (recenter)) + ) + nil)) (let ((up t) command) ;; Mouse click not on a widget button. Find the global ;; command to run, and check whether it is bound to an ;; up event. - (mouse-set-point event) - (if (memq (event-basic-type event) '(mouse-1 down-mouse-1)) + (if mouse-1 (cond ((setq command ;down event (lookup-key widget-global-map [down-mouse-1])) (setq up nil))
--- a/lispref/ChangeLog Thu Feb 16 16:18:54 2006 +0000 +++ b/lispref/ChangeLog Mon Feb 20 16:30:15 2006 +0000 @@ -1,3 +1,26 @@ +2006-02-20 Juanma Barranquero <lekktu@gmail.com> + + * commands.texi (Using Interactive): Fix reference to node + "Minibuffers". + +2006-02-19 Richard M. Stallman <rms@gnu.org> + + * minibuf.texi (High-Level Completion): + Add xref to read-input-method-name. + + * files.texi (Relative File Names): Move file-relative-name here. + (File Name Expansion): From here. Minor clarifications. + + * commands.texi (Using Interactive): Add xrefs about reading input. + Clarify remarks about that moving point and mark. + Put string case before list case. + +2006-02-16 Johan Bockg,Ae(Brd <bojohan@dd.chalmers.se> + + * display.texi (Other Display Specs, Image Descriptors): Revert + erroneous changes. The previous description of image-descriptors + as `(image . PROPS)' was correct. + 2006-02-14 Richard M. Stallman <rms@gnu.org> * variables.texi (File Local Variables): Clarifications.
--- a/lispref/commands.texi Thu Feb 16 16:18:54 2006 +0000 +++ b/lispref/commands.texi Mon Feb 20 16:30:15 2006 +0000 @@ -151,37 +151,6 @@ or more arguments. @item -It may be a Lisp expression that is not a string; then it should be a -form that is evaluated to get a list of arguments to pass to the -command. -@cindex argument evaluation form - -If this expression reads keyboard input (this includes using the -minibuffer), keep in mind that the integer value of point or the mark -before reading input may be incorrect after reading input. This is -because the current buffer may be receiving subprocess output; -if subprocess output arrives while the command is waiting for input, -it could relocate point and the mark. - -Here's an example of what @emph{not} to do: - -@smallexample -(interactive - (list (region-beginning) (region-end) - (read-string "Foo: " nil 'my-history))) -@end smallexample - -@noindent -Here's how to avoid the problem, by examining point and the mark only -after reading the keyboard input: - -@smallexample -(interactive - (let ((string (read-string "Foo: " nil 'my-history))) - (list (region-beginning) (region-end) string))) -@end smallexample - -@item @cindex argument prompt It may be a string; then its contents should consist of a code character followed by a prompt (which some code characters use and some ignore). @@ -231,6 +200,39 @@ Actual reading of arguments is controlled by the rest of the prompt string (starting with the first character that is not @samp{*} or @samp{@@}). + +@item +It may be a Lisp expression that is not a string; then it should be a +form that is evaluated to get a list of arguments to pass to the +command. Usually this form will call various functions to read input +from the user, most often through the minibuffer (@pxref{Minibuffers}) +or directly from the keyboard (@pxref{Reading Input}). +@cindex argument evaluation form + +Providing point or the mark as an argument value is also common, but +if you do this @emph{and} read input (whether using the minibuffer or +not), be sure to get the integer values of point or the mark after +reading. The current buffer may be receiving subprocess output; if +subprocess output arrives while the command is waiting for input, it +could relocate point and the mark. + +Here's an example of what @emph{not} to do: + +@smallexample +(interactive + (list (region-beginning) (region-end) + (read-string "Foo: " nil 'my-history))) +@end smallexample + +@noindent +Here's how to avoid the problem, by examining point and the mark after +reading the keyboard input: + +@smallexample +(interactive + (let ((string (read-string "Foo: " nil 'my-history))) + (list (region-beginning) (region-end) string))) +@end smallexample @end itemize @cindex examining the @code{interactive} form
--- a/lispref/display.texi Thu Feb 16 16:18:54 2006 +0000 +++ b/lispref/display.texi Mon Feb 20 16:30:15 2006 +0000 @@ -3280,7 +3280,7 @@ Recursive display specifications are not supported---@var{string}'s @code{display} properties, if any, are not used. -@item (image @var{image-props}) +@item (image . @var{image-props}) This kind of display specification is an image descriptor (@pxref{Images}). When used as a display specification, it means to display the image instead of the text that has the display specification. @@ -3507,12 +3507,11 @@ @subsection Image Descriptors @cindex image descriptor - An image description is a list of the form @code{(image -@var{props})}, where @var{props} is a property list containing -alternating keyword symbols (symbols whose names start with a colon) and -their values. You can use any Lisp object as a property, but the only -properties that have any special meaning are certain symbols, all of -them keywords. + An image description is a list of the form @code{(image . @var{props})}, +where @var{props} is a property list containing alternating keyword +symbols (symbols whose names start with a colon) and their values. +You can use any Lisp object as a property, but the only properties +that have any special meaning are certain symbols, all of them keywords. Every image descriptor must contain the property @code{:type @var{type}} to specify the format of the image. The value of @var{type}
--- a/lispref/files.texi Thu Feb 16 16:18:54 2006 +0000 +++ b/lispref/files.texi Mon Feb 20 16:30:15 2006 +0000 @@ -1770,6 +1770,32 @@ @end example @end defun + Given a possibly relative file name, you can convert it to an +absolute name using @code{expand-file-name} (@pxref{File Name +Expansion}). This function converts absolute file names to relative +names: + +@defun file-relative-name filename &optional directory +This function tries to return a relative name that is equivalent to +@var{filename}, assuming the result will be interpreted relative to +@var{directory} (an absolute directory name or directory file name). +If @var{directory} is omitted or @code{nil}, it defaults to the +current buffer's default directory. + +On some operating systems, an absolute file name begins with a device +name. On such systems, @var{filename} has no relative equivalent based +on @var{directory} if they start with two different device names. In +this case, @code{file-relative-name} returns @var{filename} in absolute +form. + +@example +(file-relative-name "/foo/bar" "/foo/") + @result{} "bar" +(file-relative-name "/foo/bar" "/hack/") + @result{} "../foo/bar" +@end example +@end defun + @node Directory Names @comment node-name, next, previous, up @subsection Directory Names @@ -1910,16 +1936,13 @@ be expanded. Expansion also simplifies file names by eliminating redundancies such as @file{./} and @file{@var{name}/../}. -In the next two functions, the @var{directory} argument can be either -a directory name or a directory file name. @xref{Directory Names}. - @defun expand-file-name filename &optional directory This function converts @var{filename} to an absolute file name. If @var{directory} is supplied, it is the default directory to start with if @var{filename} is relative. (The value of @var{directory} should -itself be an absolute directory name; it may start with @samp{~}.) -Otherwise, the current buffer's value of @code{default-directory} is -used. For example: +itself be an absolute directory name or directory file name; it may +start with @samp{~}.) Otherwise, the current buffer's value of +@code{default-directory} is used. For example: @example @group @@ -1981,27 +2004,6 @@ indirect calls to @code{expand-file-name}. @xref{Truenames}. @end defun -@c Emacs 19 feature -@defun file-relative-name filename &optional directory -This function does the inverse of expansion---it tries to return a -relative name that is equivalent to @var{filename} when interpreted -relative to @var{directory}. If @var{directory} is omitted or -@code{nil}, it defaults to the current buffer's default directory. - -On some operating systems, an absolute file name begins with a device -name. On such systems, @var{filename} has no relative equivalent based -on @var{directory} if they start with two different device names. In -this case, @code{file-relative-name} returns @var{filename} in absolute -form. - -@example -(file-relative-name "/foo/bar" "/foo/") - @result{} "bar" -(file-relative-name "/foo/bar" "/hack/") - @result{} "../foo/bar" -@end example -@end defun - @defvar default-directory The value of this buffer-local variable is the default directory for the current buffer. It should be an absolute directory name; it may start
--- a/lispref/minibuf.texi Thu Feb 16 16:18:54 2006 +0000 +++ b/lispref/minibuf.texi Mon Feb 20 16:30:15 2006 +0000 @@ -1194,7 +1194,8 @@ @end defun See also the functions @code{read-coding-system} and -@code{read-non-nil-coding-system}, in @ref{User-Chosen Coding Systems}. +@code{read-non-nil-coding-system}, in @ref{User-Chosen Coding Systems}, +and @code{read-input-method-name}, in @ref{Input Methods}. @node Reading File Names @subsection Reading File Names
--- a/man/ChangeLog Thu Feb 16 16:18:54 2006 +0000 +++ b/man/ChangeLog Mon Feb 20 16:30:15 2006 +0000 @@ -1,3 +1,19 @@ +2006-02-19 Richard M. Stallman <rms@gnu.org> + + * emacs.texi: Use @smallbook. + (Top): Update ref to Emacs paper, delete ref to Cookbook. + Update subnode menu. + + * building.texi (Lisp Interaction): Minor addition. + +2006-02-18 Nick Roberts <nickrob@snap.net.nz> + + * building.texi (Watch Expressions): Update and be more precise. + +2006-02-17 Eli Zaretskii <eliz@gnu.org> + + * faq.texi: Remove the coding cookie, it's not needed anymore. + 2006-02-15 Francesco Potort,Al(B <pot@gnu.org> * maintaining.texi (Create Tags Table): Explain why the
--- a/man/building.texi Thu Feb 16 16:18:54 2006 +0000 +++ b/man/building.texi Mon Feb 20 16:30:15 2006 +0000 @@ -936,9 +936,9 @@ Each watch expression is displayed in the speedbar. Complex data types, such as arrays, structures and unions are represented in a tree format. Leaves and simple data types show the name of the expression -and its value, and display the type as a tooltip. Higher levels show -the name, type and address value for pointers and just the name and -type otherwise. +and its value and, when the speedbar frame is selected, display the +type as a tooltip. Higher levels show the name, type and address +value for pointers and just the name and type otherwise. To expand or contract a complex data type, click @kbd{Mouse-2} on the tag to the left of the expression. @@ -958,7 +958,8 @@ If you set the variable @code{gdb-show-changed-values} to non-@code{nil} (the default value), Emacs uses @code{font-lock-warning-face} to highlight values that have recently -changed. +changed and @code{shadow} face to make variables which have gone out of +scope less noticeable. @vindex gdb-use-colon-colon-notation If the variable @code{gdb-use-colon-colon-notation} is @@ -1277,7 +1278,8 @@ is to use Inferior Emacs-Lisp mode, which provides an interface rather like Shell mode (@pxref{Shell Mode}) for evaluating Emacs Lisp expressions. Type @kbd{M-x ielm} to create an @samp{*ielm*} buffer -which uses this mode. +which uses this mode. For more information see that command's +documentation. @node External Lisp @section Running an External Lisp
--- a/man/ediff.texi Thu Feb 16 16:18:54 2006 +0000 +++ b/man/ediff.texi Mon Feb 20 16:30:15 2006 +0000 @@ -686,6 +686,16 @@ one of them by typing the region number and then `j'. Typing @kbd{##} again puts Ediff back in the original state. +@item #c +@kindex #c +@vindex ediff-ignore-case-option +@vindex ediff-ignore-case-option3 +@vindex ediff-ignore-case +Toggle case sensitivity in the diff program. All diffs are recomputed. +Case sensitivity is controlled by the variables +@code{ediff-ignore-case-option}, @code{ediff-ignore-case-option3}, +and @code{ediff-ignore-case}, which are explained elsewhere. + @item #h @itemx #f @kindex #f @@ -1584,6 +1594,28 @@ differences of all intermediate regions. This delay does not indicate any problem. +@vindex ediff-ignore-case-option +@vindex ediff-ignore-case-option3 +@vindex ediff-ignore-case +Finally, Ediff can be told to ignore the case of the letters. This behavior +can be toggled with @kbd{#c} and it is controlled with three variables: +Toggle case sensitivity in the diff program. All diffs are recomputed. +Case sensitivity is controlled by the variables +@code{ediff-ignore-case-option}, @code{ediff-ignore-case-option3}, and +@code{ediff-ignore-case}. + +The variable @code{ediff-ignore-case-option} specifies the option to pass +to the diff program for comparing two files or buffers. For GNU +@code{diff}, this option is @code{"-i"}. The variable +@code{ediff-ignore-case-option3} specifies the option to pass to the +@code{diff3} program in order to make it case-insensitive. GNU @code{diff3} +does not have such an option, so when merging or comparing three files with +this program, ignoring the letter case is not supported. + +The variable @code{ediff-ignore-case} controls whether Ediff starts out by +ignoring letter case or not. It can be set in @file{.emacs} using +@code{setq-default}. + @node Highlighting Difference Regions, Narrowing, Selective Browsing, Customization @section Highlighting Difference Regions @@ -2388,6 +2420,7 @@ @example Adrian Aichner (aichner@@ecf.teradyne.com), +Drew Adams (drew.adams@@oracle.com), Steve Baur (steve@@xemacs.org), Neal Becker (neal@@ctd.comsat.com), E.@: Jay Berkenbilt (ejb@@ql.org),
--- a/man/emacs.texi Thu Feb 16 16:18:54 2006 +0000 +++ b/man/emacs.texi Mon Feb 20 16:30:15 2006 +0000 @@ -39,7 +39,7 @@ @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. -@c @smallbook +@smallbook @setchapternewpage odd @defcodeindex op @@ -609,7 +609,7 @@ implement a graphical debugging environment through Emacs. -Maintaining Programs +Maintaining Large Programs * Change Log:: Maintaining a change history for your program. * Format of ChangeLog:: What the change log file looks like. @@ -950,15 +950,12 @@ substantially the same text and are generated from the same source files, which are also distributed along with GNU Emacs. - GNU Emacs is a member of the Emacs editor family. There are many Emacs -editors, all sharing common principles of organization. For information on -the underlying philosophy of Emacs and the lessons learned from its -development, write for a copy of AI memo 519a, @cite{Emacs, the Extensible, -Customizable Self-Documenting Display Editor}, is available from + GNU Emacs is a member of the Emacs editor family. There are many +Emacs editors, all sharing common principles of organization. For +information on the underlying philosophy of Emacs and the lessons +learned from its development, see @cite{Emacs, the Extensible, +Customizable Self-Documenting Display Editor}, available from @url{ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-519A.pdf}. -Another useful publication is LCS TM-165, @cite{A Cookbook for an -Emacs}, by Craig Finseth, is available from the MIT libraries in some -fashion. This edition of the manual is intended for use with GNU Emacs installed on GNU and Unix systems. GNU Emacs can also be used on VMS,
--- a/man/erc.texi Thu Feb 16 16:18:54 2006 +0000 +++ b/man/erc.texi Mon Feb 20 16:30:15 2006 +0000 @@ -12,7 +12,7 @@ @syncodeindex fn cp @copying -This manual is for ERC version 5.1.1. +This manual is for ERC version 5.1.2. Copyright @copyright{} 2005, 2006 Free Software Foundation, Inc.
--- a/man/faq.texi Thu Feb 16 16:18:54 2006 +0000 +++ b/man/faq.texi Mon Feb 20 16:30:15 2006 +0000 @@ -1,4 +1,4 @@ -\input texinfo @c -*- coding: latin-1; mode: texinfo; -*- +\input texinfo @c -*- mode: texinfo; -*- @c %**start of header @setfilename ../info/efaq @settitle GNU Emacs FAQ
--- a/man/viper.texi Thu Feb 16 16:18:54 2006 +0000 +++ b/man/viper.texi Mon Feb 20 16:30:15 2006 +0000 @@ -1870,6 +1870,10 @@ @vindex @code{viper-insert-state-cursor-color} If set to a valid color, this will be the cursor color when Viper is in insert state. +@item viper-emacs-state-cursor-color nil +@vindex @code{viper-emacs-state-cursor-color} +If set to a valid color, this will be the cursor color when Viper is in +emacs state. @item viper-replace-region-end-delimiter "$" A string used to mark the end of replacement regions. It is used only on TTYs or if @code{viper-use-replace-region-delimiters} is non-@code{nil}.
--- a/src/ChangeLog Thu Feb 16 16:18:54 2006 +0000 +++ b/src/ChangeLog Mon Feb 20 16:30:15 2006 +0000 @@ -1,3 +1,66 @@ +2006-02-19 Luc Teirlinck <teirllm@auburn.edu> + + * regex.c (extend_range_table_work_area): Fix typo. + +2006-02-19 Richard M. Stallman <rms@gnu.org> + + * xterm.c (x_catch_errors): Use xmalloc. + + * regex.c (extend_range_table_work_area): Call xmalloc and xrealloc. + (regex_compile): Likewise. + (regcomp): Use xmalloc. + + * gtkutil.c (malloc_widget_value): Use xmalloc. + + * vm-limit.c [HAVE_GETRLIMIT]: Include sys/resource.h. + (check_memory_limits) [HAVE_GETRLIMIT]: Use getrlimit. + + * xmenu.c (digest_single_submenu): When pane_string is empty, + do initialize save_wv. + +2006-02-19 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> + + * xdisp.c (update_menu_bar) [MAC_OS]: Don't set + w->update_mode_line if arg F is not the selected frame. + + * macmenu.c (popup_activated_flag, submenu_id) + (next_menubar_widget_id): Remove variables. + (initialize_frame_menubar): Remove function. + (pop_down_menu, mac_menu_show): Simplify save value. + (dispose_menus): New function. + (pop_down_menu, fill_menubar): Use it. + (fill_submenu): Remove function. All uses changed to fill_menu. + (add_menu_item): Remove args SUBMENU and FORCE_DISABLE. New arg + POS. Don't call SetMenuItemHierarchicalID here. + (fill_menu): Add arg SUBMENU_ID. Return submenu_id that is to be + used next. Call SetMenuItemHierarchicalID here. + (fill_menubar): Add arg DEEP_P. All uses changed. Clean up menu + objects if needed. Reuse existing menu bar titles if possible. + (set_frame_menubar): Don't clean up menu objects here. + +2006-02-18 Chong Yidong <cyd@stupidchicken.com> + + * window.c (window_min_size_1): Ensure room for the scroll bar and + fringes. + +2006-02-17 Romain Francoise <romain@orebokech.com> + + * puresize.h (BASE_PURESIZE): Increment to 1200000. + +2006-02-17 Stefan Monnier <monnier@iro.umontreal.ca> + + * alloc.c (Fmake_symbol): Comment-out left-over assert from before the + addition of the BLOCK_INPUTs. + +2006-02-17 Juanma Barranquero <lekktu@gmail.com> + + * window.c (Fset_window_scroll_bars): Doc fix. + +2006-02-17 Kenichi Handa <handa@m17n.org> + + * xdisp.c (display_mode_element): Call display_string with correct + PREC arg (which must be a number of characters, not column width). + 2006-02-15 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> * frame.c (x_get_arg): Clear out PARAM in ALIST also on Mac.
--- a/src/alloc.c Thu Feb 16 16:18:54 2006 +0000 +++ b/src/alloc.c Mon Feb 20 16:30:15 2006 +0000 @@ -3211,7 +3211,7 @@ CHECK_STRING (name); - eassert (!handling_signal); + /* eassert (!handling_signal); */ #ifndef SYNC_INPUT BLOCK_INPUT;
--- a/src/gtkutil.c Thu Feb 16 16:18:54 2006 +0000 +++ b/src/gtkutil.c Mon Feb 20 16:30:15 2006 +0000 @@ -199,7 +199,7 @@ } else { - wv = (widget_value *) malloc (sizeof (widget_value)); + wv = (widget_value *) xmalloc (sizeof (widget_value)); malloc_cpt++; } memset (wv, 0, sizeof (widget_value));
--- a/src/macmenu.c Thu Feb 16 16:18:54 2006 +0000 +++ b/src/macmenu.c Mon Feb 20 16:30:15 2006 +0000 @@ -189,8 +189,9 @@ static void list_of_panes P_ ((Lisp_Object)); static void list_of_items P_ ((Lisp_Object)); -static void fill_submenu (MenuHandle, widget_value *); -static void fill_menubar (widget_value *); +static int fill_menu P_ ((MenuHandle, widget_value *, int)); +static void fill_menubar P_ ((widget_value *, int)); +static void dispose_menus P_ ((int)); /* This holds a Lisp vector that holds the results of decoding @@ -247,15 +248,6 @@ /* Current depth within submenus. */ static int menu_items_submenu_depth; -/* Flag which when set indicates a dialog or menu has been posted by - Xt on behalf of one of the widget sets. */ -static int popup_activated_flag; - -/* Index of the next submenu */ -static int submenu_id; - -static int next_menubar_widget_id; - /* This is set nonzero after the user activates the menu bar, and set to zero again after the menu bars are redisplayed by prepare_menu_bar. While it is nonzero, all calls to set_frame_menubar go deep. @@ -1440,7 +1432,7 @@ menu = GetMenuHandle (++i); } - i = menu_handle ? MIN_POPUP_SUBMENU_ID : MIN_SUBMENU_ID; + i = menu_handle ? MIN_POPUP_SUBMENU_ID : MIN_SUBMENU_ID; menu = GetMenuHandle (i); while (menu != NULL) { @@ -1679,27 +1671,7 @@ /* Non-null value to indicate menubar has already been "created". */ f->output_data.mac->menubar_widget = 1; - { - int i = MIN_MENU_ID; - MenuHandle menu = GetMenuHandle (i); - while (menu != NULL) - { - DeleteMenu (i); - DisposeMenu (menu); - menu = GetMenuHandle (++i); - } - - i = MIN_SUBMENU_ID; - menu = GetMenuHandle (i); - while (menu != NULL) - { - DeleteMenu (i); - DisposeMenu (menu); - menu = GetMenuHandle (++i); - } - } - - fill_menubar (first_wv->contents); + fill_menubar (first_wv->contents, deep_p); /* Add event handler so we can detect C-g. */ install_menu_quit_handler (NULL); @@ -1708,22 +1680,6 @@ UNBLOCK_INPUT; } -/* Called from Fx_create_frame to create the initial menubar of a frame - before it is mapped, so that the window is mapped with the menubar already - there instead of us tacking it on later and thrashing the window after it - is visible. */ - -void -initialize_frame_menubar (f) - FRAME_PTR f; -{ - /* This function is called before the first chance to redisplay - the frame. It has to be, so the frame will have the right size. */ - FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f)); - set_frame_menubar (f, 1, 1); -} - - /* Get rid of the menu bar of frame F, and free its storage. This is used when deleting a frame, and when turning off the menu bar. */ @@ -1739,11 +1695,9 @@ pop_down_menu (arg) Lisp_Object arg; { - struct Lisp_Save_Value *p1 = XSAVE_VALUE (Fcar (arg)); - struct Lisp_Save_Value *p2 = XSAVE_VALUE (Fcdr (arg)); - - FRAME_PTR f = p1->pointer; - MenuHandle *menu = p2->pointer; + struct Lisp_Save_Value *p = XSAVE_VALUE (arg); + FRAME_PTR f = p->pointer; + MenuHandle menu = GetMenuHandle (POPUP_SUBMENU_ID); BLOCK_INPUT; @@ -1752,19 +1706,9 @@ FRAME_MAC_DISPLAY_INFO (f)->grabbed = 0; /* delete all menus */ - { - int i = MIN_POPUP_SUBMENU_ID; - MenuHandle submenu = GetMenuHandle (i); - while (submenu != NULL) - { - DeleteMenu (i); - DisposeMenu (submenu); - submenu = GetMenuHandle (++i); - } - } - + dispose_menus (MIN_POPUP_SUBMENU_ID); DeleteMenu (POPUP_SUBMENU_ID); - DisposeMenu (*menu); + DisposeMenu (menu); UNBLOCK_INPUT; @@ -1998,8 +1942,8 @@ /* Actually create the menu. */ menu = NewMenu (POPUP_SUBMENU_ID, "\p"); - submenu_id = MIN_POPUP_SUBMENU_ID; - fill_submenu (menu, first_wv->contents); + InsertMenu (menu, -1); + fill_menu (menu, first_wv->contents, MIN_POPUP_SUBMENU_ID); /* Free the widget_value objects we used to specify the contents. */ @@ -2016,11 +1960,7 @@ menu_item_choice = 0; menu_item_selection = 0; - InsertMenu (menu, -1); - - record_unwind_protect (pop_down_menu, - Fcons (make_save_value (f, 0), - make_save_value (&menu, 0))); + record_unwind_protect (pop_down_menu, make_save_value (f, 0)); /* Add event handler so we can detect C-g. */ install_menu_quit_handler (menu); @@ -2421,15 +2361,16 @@ } static void -add_menu_item (MenuHandle menu, widget_value *wv, int submenu, - int force_disable) +add_menu_item (menu, pos, wv) + MenuHandle menu; + int pos; + widget_value *wv; { #if TARGET_API_MAC_CARBON CFStringRef item_name; #else Str255 item_name; #endif - int pos; if (name_is_separator (wv->name)) AppendMenu (menu, "\p-"); @@ -2438,8 +2379,6 @@ AppendMenu (menu, "\pX"); #if TARGET_API_MAC_CARBON - pos = CountMenuItems (menu); - item_name = cfstring_create_with_utf8_cstring (wv->name); if (wv->key != NULL) @@ -2457,13 +2396,11 @@ SetMenuItemTextWithCFString (menu, pos, item_name); CFRelease (item_name); - if (wv->enabled && !force_disable) + if (wv->enabled) EnableMenuItem (menu, pos); else DisableMenuItem (menu, pos); #else /* ! TARGET_API_MAC_CARBON */ - pos = CountMItems (menu); - item_name[sizeof (item_name) - 1] = '\0'; strncpy (item_name, wv->name, sizeof (item_name) - 1); if (wv->key != NULL) @@ -2477,88 +2414,140 @@ c2pstr (item_name); SetMenuItemText (menu, pos, item_name); - if (wv->enabled && !force_disable) + if (wv->enabled) EnableItem (menu, pos); else DisableItem (menu, pos); #endif /* ! TARGET_API_MAC_CARBON */ /* Draw radio buttons and tickboxes. */ - { if (wv->selected && (wv->button_type == BUTTON_TYPE_TOGGLE || wv->button_type == BUTTON_TYPE_RADIO)) SetItemMark (menu, pos, checkMark); else SetItemMark (menu, pos, noMark); - } SetMenuItemRefCon (menu, pos, (UInt32) wv->call_data); } - - if (submenu != 0) - SetMenuItemHierarchicalID (menu, pos, submenu); +} + +/* Construct native Mac OS menu based on widget_value tree. */ + +static int +fill_menu (menu, wv, submenu_id) + MenuHandle menu; + widget_value *wv; + int submenu_id; +{ + int pos; + + for (pos = 1; wv != NULL; wv = wv->next, pos++) + { + add_menu_item (menu, pos, wv); + if (wv->contents) + { + MenuHandle submenu = NewMenu (submenu_id, "\pX"); + + InsertMenu (submenu, -1); + SetMenuItemHierarchicalID (menu, pos, submenu_id); + submenu_id = fill_menu (submenu, wv->contents, submenu_id + 1); + } + } + + return submenu_id; } /* Construct native Mac OS menubar based on widget_value tree. */ static void -fill_submenu (MenuHandle menu, widget_value *wv) +fill_menubar (wv, deep_p) + widget_value *wv; + int deep_p; { - for ( ; wv != NULL; wv = wv->next) - if (wv->contents) - { - int cur_submenu = submenu_id++; - MenuHandle submenu = NewMenu (cur_submenu, "\pX"); - fill_submenu (submenu, wv->contents); - InsertMenu (submenu, -1); - add_menu_item (menu, wv, cur_submenu, 0); - } - else - add_menu_item (menu, wv, 0, 0); + int id, submenu_id; + MenuHandle menu; + Str255 title; +#if !TARGET_API_MAC_CARBON + int title_changed_p = 0; +#endif + + /* Clean up the menu bar when filled by the entire menu trees. */ + if (deep_p) + { + dispose_menus (MIN_MENU_ID); + dispose_menus (MIN_SUBMENU_ID); +#if !TARGET_API_MAC_CARBON + title_changed_p = 1; +#endif + } + + /* Fill menu bar titles and submenus. Reuse the existing menu bar + titles as much as possible to minimize redraw (if !deep_p). */ + submenu_id = MIN_SUBMENU_ID; + for (id = MIN_MENU_ID; wv != NULL; wv = wv->next, id++) + { + strncpy (title, wv->name, 255); + title[255] = '\0'; + c2pstr (title); + + menu = GetMenuHandle (id); + if (menu) + { +#if TARGET_API_MAC_CARBON + Str255 old_title; + + GetMenuTitle (menu, old_title); + if (!EqualString (title, old_title, false, false)) + SetMenuTitle (menu, title); +#else /* !TARGET_API_MAC_CARBON */ + if (!EqualString (title, (*menu)->menuData, false, false)) + { + DeleteMenu (id); + DisposeMenu (menu); + menu = NewMenu (id, title); + InsertMenu (menu, GetMenuHandle (id + 1) ? id + 1 : 0); + title_changed_p = 1; + } +#endif /* !TARGET_API_MAC_CARBON */ + } + else + { + menu = NewMenu (id, title); + InsertMenu (menu, 0); +#if !TARGET_API_MAC_CARBON + title_changed_p = 1; +#endif + } + + if (wv->contents) + submenu_id = fill_menu (menu, wv->contents, submenu_id); + } + + if (GetMenuHandle (id)) + { + dispose_menus (id); +#if !TARGET_API_MAC_CARBON + title_changed_p = 1; +#endif + } + +#if !TARGET_API_MAC_CARBON + if (title_changed_p) + InvalMenuBar (); +#endif } - -/* Construct native Mac OS menu based on widget_value tree. */ - static void -fill_menu (MenuHandle menu, widget_value *wv) +dispose_menus (id) + int id; { - for ( ; wv != NULL; wv = wv->next) - if (wv->contents) - { - int cur_submenu = submenu_id++; - MenuHandle submenu = NewMenu (cur_submenu, "\pX"); - fill_submenu (submenu, wv->contents); - InsertMenu (submenu, -1); - add_menu_item (menu, wv, cur_submenu, 0); - } - else - add_menu_item (menu, wv, 0, 0); -} - -/* Construct native Mac OS menubar based on widget_value tree. */ - -static void -fill_menubar (widget_value *wv) -{ - int id; - - submenu_id = MIN_SUBMENU_ID; - - for (id = MIN_MENU_ID; wv != NULL; wv = wv->next, id++) + MenuHandle menu; + + while ((menu = GetMenuHandle (id)) != NULL) { - MenuHandle menu; - Str255 title; - - strncpy (title, wv->name, 255); - title[255] = 0; - c2pstr (title); - menu = NewMenu (id, title); - - if (wv->contents) - fill_menu (menu, wv->contents); - - InsertMenu (menu, 0); + DeleteMenu (id); + DisposeMenu (menu); + id++; } }
--- a/src/regex.c Thu Feb 16 16:18:54 2006 +0000 +++ b/src/regex.c Mon Feb 20 16:30:15 2006 +0000 @@ -2067,10 +2067,10 @@ work_area->allocated += 16 * sizeof (int); if (work_area->table) work_area->table - = (int *) realloc (work_area->table, work_area->allocated); + = (int *) xrealloc (work_area->table, work_area->allocated); else work_area->table - = (int *) malloc (work_area->allocated); + = (int *) xmalloc (work_area->allocated); } #ifdef emacs @@ -3608,13 +3608,13 @@ if (! fail_stack.stack) fail_stack.stack - = (fail_stack_elt_t *) malloc (fail_stack.size - * sizeof (fail_stack_elt_t)); + = (fail_stack_elt_t *) xmalloc (fail_stack.size + * sizeof (fail_stack_elt_t)); else fail_stack.stack - = (fail_stack_elt_t *) realloc (fail_stack.stack, - (fail_stack.size - * sizeof (fail_stack_elt_t))); + = (fail_stack_elt_t *) xrealloc (fail_stack.stack, + (fail_stack.size + * sizeof (fail_stack_elt_t))); } regex_grow_registers (num_regs); @@ -6292,15 +6292,15 @@ preg->used = 0; /* Try to allocate space for the fastmap. */ - preg->fastmap = (char *) malloc (1 << BYTEWIDTH); + preg->fastmap = (char *) xmalloc (1 << BYTEWIDTH); if (cflags & REG_ICASE) { unsigned i; preg->translate - = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE - * sizeof (*(RE_TRANSLATE_TYPE)0)); + = (RE_TRANSLATE_TYPE) xmalloc (CHAR_SET_SIZE + * sizeof (*(RE_TRANSLATE_TYPE)0)); if (preg->translate == NULL) return (int) REG_ESPACE;
--- a/src/vm-limit.c Thu Feb 16 16:18:54 2006 +0000 +++ b/src/vm-limit.c Mon Feb 20 16:30:15 2006 +0000 @@ -33,6 +33,10 @@ #include "mem-limits.h" +#ifdef HAVE_GETRLIMIT +#include <sys/resource.h> +#endif + /* Level number of warnings already issued. 0 -- no warnings issued. @@ -61,6 +65,19 @@ unsigned long five_percent; unsigned long data_size; +#ifdef HAVE_GETRLIMIT + struct rlimit { + rlim_t rlim_cur; + rlim_t rlim_max; + } rlimit; + + getrlimit (RLIMIT_DATA, &rlimit); + + five_percent = rlimit.rlim_max / 20; + data_size = rlimit.rlim_cur; + +#else /* not HAVE_GETRLIMIT */ + if (lim_data == 0) get_lim_data (); five_percent = lim_data / 20; @@ -74,6 +91,8 @@ cp = (char *) (*__morecore) (0); data_size = (char *) cp - (char *) data_space_start; +#endif /* not HAVE_GETRLIMIT */ + if (warn_function) switch (warnlevel) {
--- a/src/window.c Thu Feb 16 16:18:54 2006 +0000 +++ b/src/window.c Mon Feb 20 16:30:15 2006 +0000 @@ -2570,7 +2570,10 @@ else { if (width_p) - size = window_min_width; + size = max (window_min_width, + (MIN_SAFE_WINDOW_WIDTH + + WINDOW_FRINGE_COLS (w) + + WINDOW_SCROLL_BAR_COLS (w))); else { if (MINI_WINDOW_P (w) @@ -4288,7 +4291,7 @@ { /* This may happen for the minibuffer. In that case the window_deletion_count check below does not work. */ - if (XINT (CURSIZE (p->next)) - delta <= 0) + if (XINT (CURSIZE (p->next)) - delta <= 0) { Fset_window_configuration (old_config); error ("Cannot adjust window size as specified"); @@ -6602,7 +6605,8 @@ Third parameter VERTICAL-TYPE specifies the type of the vertical scroll bar: left, right, or nil. If WIDTH is nil, use the frame's scroll-bar width. -If TYPE is t, use the frame's scroll-bar type. */) +If VERTICAL-TYPE is t, use the frame's scroll-bar type. +Fourth parameter HORIZONTAL-TYPE is currently unused. */) (window, width, vertical_type, horizontal_type) Lisp_Object window, width, vertical_type, horizontal_type; {
--- a/src/xdisp.c Thu Feb 16 16:18:54 2006 +0000 +++ b/src/xdisp.c Mon Feb 20 16:30:15 2006 +0000 @@ -9057,14 +9057,15 @@ /* Redisplay the menu bar in case we changed it. */ #if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) || defined (MAC_OS) \ || defined (USE_GTK) - if (FRAME_WINDOW_P (f) -#if defined (MAC_OS) - /* All frames on Mac OS share the same menubar. So only the - selected frame should be allowed to set it. */ - && f == SELECTED_FRAME () -#endif - ) - set_frame_menubar (f, 0, 0); + if (FRAME_WINDOW_P (f)) + { +#ifdef MAC_OS + /* All frames on Mac OS share the same menubar. So only + the selected frame should be allowed to set it. */ + if (f == SELECTED_FRAME ()) +#endif + set_frame_menubar (f, 0, 0); + } else /* On a terminal screen, the menu bar is an ordinary screen line, and this makes it get updated. */ @@ -16492,8 +16493,11 @@ { int bytepos = last_offset; int charpos = string_byte_to_char (elt, bytepos); + + if (precision <= 0) + nchars = string_byte_to_char (elt, offset) - charpos; n += display_string (NULL, elt, Qnil, 0, charpos, - it, 0, prec, 0, + it, 0, nchars, 0, STRING_MULTIBYTE (elt)); } break; @@ -17742,7 +17746,7 @@ display them, and < 0 means obey the current buffer's value of enable_multibyte_characters. - Value is the number of glyphs produced. */ + Value is the number of columns displayed. */ static int display_string (string, lisp_string, face_string, face_string_pos,
--- a/src/xmenu.c Thu Feb 16 16:18:54 2006 +0000 +++ b/src/xmenu.c Mon Feb 20 16:30:15 2006 +0000 @@ -1819,8 +1819,11 @@ wv->enabled = 1; wv->button_type = BUTTON_TYPE_NONE; wv->help = Qnil; + save_wv = wv; } - save_wv = wv; + else + save_wv = first_wv; + prev_wv = 0; i += MENU_ITEMS_PANE_LENGTH; }
--- a/src/xterm.c Thu Feb 16 16:18:54 2006 +0000 +++ b/src/xterm.c Mon Feb 20 16:30:15 2006 +0000 @@ -7527,7 +7527,7 @@ Display *dpy; { int count = SPECPDL_INDEX (); - struct x_error_message_stack *data = malloc (sizeof (*data)); + struct x_error_message_stack *data = xmalloc (sizeof (*data)); Lisp_Object dummy; #ifdef ENABLE_CHECKING dummy = make_number ((EMACS_INT)dpy + (EMACS_INT)x_error_message);