Mercurial > emacs
changeset 82984:3b1f99f17618
Merged in changes from CVS head
Patches applied:
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-5
Add =cvs-sync-make-log script
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-6
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-7
Use absolute tla-tools filenames in =cvs-sync-make-log
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-8
Use proper arch-tag: syntax for lispintro/texinfo.tex
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-9
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-24
author | Karoly Lorentey <lorentey@elte.hu> |
---|---|
date | Tue, 30 Dec 2003 17:05:05 +0000 |
parents | 21720c013048 (current diff) c22fbd2084b4 (diff) |
children | 8d7be2534cbc |
files | ChangeLog INSTALL-CVS lisp/ChangeLog lisp/emacs-lisp/testcover-ses.el lisp/emacs-lisp/testcover-unsafep.el lisp/frame.el lisp/toolbar/gud-next.pbm lisp/toolbar/gud-next.xpm lisp/toolbar/gud-nexti.pbm lisp/toolbar/gud-nexti.xpm lisp/toolbar/gud-step.pbm lisp/toolbar/gud-step.xpm lisp/toolbar/gud-stepi.pbm lisp/toolbar/gud-stepi.xpm src/dispextern.h src/xfaces.c |
diffstat | 92 files changed, 3163 insertions(+), 2221 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Tue Dec 30 17:02:33 2003 +0000 +++ b/ChangeLog Tue Dec 30 17:05:05 2003 +0000 @@ -1,3 +1,8 @@ +2003-12-30 Eli Zaretskii <eliz@elta.co.il> + + * INSTALL.CVS: Renamed from INSTALL-CVS to avoid file-name + clashes with install-sh on 8+3 filesystems. + 2003-12-08 Miles Bader <miles@gnu.org> * .cvsignore: Add .arch-inventory.
--- a/INSTALL-CVS Tue Dec 30 17:02:33 2003 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ - Building and Installing Emacs from CVS - -Some of the files that are included in the Emacs tarball, such as -byte-compiled Lisp files, are not stored in the CVS repository. -Therefore, to build from CVS you must run "make bootstrap" -instead of just "make": - - $ ./configure - $ make bootstrap - -The bootstrap process makes sure all necessary files are rebuilt -before it builds the final Emacs binary. - -Normally, it is not necessary to use "make bootstrap" after every CVS -update. Unless there are problems, we suggest the following -procedure: - - $ ./configure - $ make - $ cd lisp - $ make recompile EMACS=../src/emacs - $ cd .. - $ make - -(If you want to install the Emacs binary, type "make install" instead -of "make" in the last command.) - -Occasionally the file "lisp/loaddefs.el" will need be updated to reflect -new autoloaded functions. If you see errors about undefined lisp -functions during compilation, that may be the reason. Another symptom -may be an error saying that "loaddefs.el" could not be found; this is -due to a change in the way loaddefs.el was handled in CVS, and should -only happen once, for users that are updating old CVS trees. - -To update loaddefs.el, do: - - $ cd lisp - $ make autoloads EMACS=../src/emacs - -If either of above procedures fails, try "make bootstrap". - -Users of non-Posix systems (MS-Windows etc.) should run the -platform-specific configuration scripts (nt/configure.bat, config.bat, -etc.) before "make bootstrap" or "make"; the rest of the procedure is -applicable to those systems as well. - -Questions, requests, and bug reports about the CVS versions of Emacs -should be sent to emacs-pretest-bug@gnu.org rather than gnu.emacs.help -or gnu.emacs.bug. Ideally, use M-x report-emacs-bug RET which will -send it to the proper place.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/INSTALL.CVS Tue Dec 30 17:05:05 2003 +0000 @@ -0,0 +1,50 @@ + Building and Installing Emacs from CVS + +Some of the files that are included in the Emacs tarball, such as +byte-compiled Lisp files, are not stored in the CVS repository. +Therefore, to build from CVS you must run "make bootstrap" +instead of just "make": + + $ ./configure + $ make bootstrap + +The bootstrap process makes sure all necessary files are rebuilt +before it builds the final Emacs binary. + +Normally, it is not necessary to use "make bootstrap" after every CVS +update. Unless there are problems, we suggest the following +procedure: + + $ ./configure + $ make + $ cd lisp + $ make recompile EMACS=../src/emacs + $ cd .. + $ make + +(If you want to install the Emacs binary, type "make install" instead +of "make" in the last command.) + +Occasionally the file "lisp/loaddefs.el" will need be updated to reflect +new autoloaded functions. If you see errors about undefined lisp +functions during compilation, that may be the reason. Another symptom +may be an error saying that "loaddefs.el" could not be found; this is +due to a change in the way loaddefs.el was handled in CVS, and should +only happen once, for users that are updating old CVS trees. + +To update loaddefs.el, do: + + $ cd lisp + $ make autoloads EMACS=../src/emacs + +If either of above procedures fails, try "make bootstrap". + +Users of non-Posix systems (MS-Windows etc.) should run the +platform-specific configuration scripts (nt/configure.bat, config.bat, +etc.) before "make bootstrap" or "make"; the rest of the procedure is +applicable to those systems as well. + +Questions, requests, and bug reports about the CVS versions of Emacs +should be sent to emacs-pretest-bug@gnu.org rather than gnu.emacs.help +or gnu.emacs.bug. Ideally, use M-x report-emacs-bug RET which will +send it to the proper place.
--- a/etc/ChangeLog Tue Dec 30 17:02:33 2003 +0000 +++ b/etc/ChangeLog Tue Dec 30 17:05:05 2003 +0000 @@ -1,3 +1,7 @@ +2003-12-29 Ognyan Kulev <ogi@fmi.uni-sofia.bg> + + * TUTORIAL.bg: Use windows-1251 encoding. Fix punctuation errors. + 2003-11-21 Lars Hansen <larsh@math.ku.dk> * TODO: Add plans for change of file attributes UID and GID from
--- a/etc/NEWS Tue Dec 30 17:02:33 2003 +0000 +++ b/etc/NEWS Tue Dec 30 17:05:05 2003 +0000 @@ -1734,6 +1734,11 @@ * Lisp Changes in Emacs 21.4 +** The function `insert-for-yank' now supports strings where the +`yank-handler' property does not span the first character of the +string. The old behavior is available if you call +`insert-for-yank-1' instead. + ** New function `get-char-property-and-overlay' accepts the same arguments as `get-char-property' and returns a cons whose car is the return value of `get-char-property' called with those arguments and @@ -7260,7 +7265,8 @@ `:index INDEX' INDEX must be an integer >= 0. Load image number INDEX from a -multi-image GIF file. An error is signaled if INDEX is too large. +multi-image GIF file. If INDEX is too large, the image displays +as a hollow box. This could be used to implement limited support for animated GIFs. For example, the following function displays a multi-image GIF file
--- a/etc/TUTORIAL.bg Tue Dec 30 17:02:33 2003 +0000 +++ b/etc/TUTORIAL.bg Tue Dec 30 17:05:05 2003 +0000 @@ -1,1169 +1,1171 @@ -чЙЕ ЗМЕДБФЕ ЧЯЧЕДЕОЙЕФП ОБ еНБЛУ. хУМПЧЙСФБ ЪБ ЛПРЙТБОЕ УБ Ч ЛТБС ОБ ФЕЛУФБ. -Copyright (c) 1985, 1996, 1998, 2001, 2002 Free Software Foundation. +Вие гледате въведението на Емакс. Условията за копиране са в края на текста. +Copyright (c) 1985, 1996, 1998, 2001, 2002, 2003 Free Software Foundation. -лПНБОДЙФЕ ОБ еНБЛУ ОБК-ЮЕУФП ЧЛМАЮЧБФ ЛМБЧЙЫЙФЕ CONTROL (РПОСЛПЗБ -ПФВЕМСЪЧБО У CTRL ЙМЙ CTL) Й META (РПОСЛПЗБ ПФВЕМСЪЧБО У EDIT ЙМЙ -ALT). чНЕУФП ДБ УЕ ЙЪРЙУЧБФ У РЯМОП ЙНЕ ЧУЕЛЙ РЯФ, ОЙЕ ЭЕ ЙЪРПМЪЧБНЕ -УМЕДОЙФЕ УЯЛТБЭЕОЙС: +Командите на Емакс най-често включват клавишите CONTROL (понякога +отбелязван с CTRL или CTL) и META (понякога отбелязван с EDIT или +ALT). Вместо да се изписват с пълно име всеки път, ние ще използваме +следните съкращения: - C-<ЪОБЛ> ПЪОБЮБЧБ ЪБДЯТЦБОЕ ОБ ЛМБЧЙЫБ CONTROL ДПЛБФП УЕ - ОБФЙУЛБ ЪОБЛБ <ЪОБЛ>. фБЛБ C-f ЭЕ ПЪОБЮБЧБ: ДПЛБФП - УЕ ЪБДЯТЦБ ОБФЙУОБФ ЛМБЧЙЫБ CONTROL УЕ ОБФЙУЛБ f. - M-<ЪОБЛ> ПЪОБЮБЧБ ЪБДЯТЦБОЕ ОБФЙУОБФ ОБ ЛМБЧЙЫБ META (ЙМЙ EDIT - ЙМЙ ALT) ДПЛБФП УЕ ОБФЙУЛБ <ЪОБЛ>. бЛП ОСНБ ЛМБЧЙЫ - META, EDIT ЙМЙ ALT, ЧНЕУФП ОЕЗП ОБФЙУОЕФЕ Й ПФРХУОЕФЕ - ЛМБЧЙЫБ ESC Й УМЕД ФПЧБ ЧЯЧЕДЕФЕ <ЪОБЛ>. оЙЕ - ЪБРЙУЧБНЕ <ESC> ЪБ ДБ ПФВЕМЕЦЙН ЛМБЧЙЫБ ESC. + C-<знак> означава задържане на клавиша CONTROL, докато се + натиска знака <знак>. Така C-f ще означава: докато + се задържа натиснат клавиша CONTROL, се натиска f. + M-<знак> означава задържане натиснат на клавиша META (или EDIT, + или ALT), докато се натиска <знак>. Ако няма клавиш + META, EDIT или ALT, вместо него натиснете и отпуснете + клавиша ESC и след това въведете <знак>. Ние + записваме <ESC>, за да отбележим клавиша ESC. -чБЦОБ ВЕМЕЦЛБ: Ч ЛТБС ОБ еНБЛУ УЕУЙСФБ ЧЯЧЕДЕФЕ ДЧБФБ ЪОБЛБ C-x C-c. -ъОБГЙФЕ ">>" ПФМСЧП ЧЙ ДБЧБФ ХЛБЪБОЙЕ ДБ ЙЪРЯМОЙФЕ ЛПНБОДБ. оБРТЙНЕТ: +Важна бележка: в края на Емакс сесията въведете двата знака C-x C-c. +Знаците ">>" отляво ви дават указание да изпълните команда. Например: <<Blank lines inserted here by startup of help-with-tutorial>> ->> уЕЗБ ЧЯЧЕДЕФЕ C-v (рПЛБЦЙ УМЕДЧБЭЙС ЕЛТБО) ЪБ ДБ УЕ РТЙДЧЙЦЙФЕ ЛЯН -УМЕДЧБЭЙС ЕЛТБО. - (оБРТБЧЕФЕ ЗП УЕЗБ, ЪБДТЯЦФЕ CONTROL ДПЛБФП ОБФЙУЛБФЕ v). - пФУЕЗБ ОБФБФЯЛ ЧЙЕ ЭЕ РТБЧЙФЕ ФПЧБ ЧЙОБЗЙ ЛПЗБФП РТПЮЕФЕФЕ - ЕЛТБОБ. +>> Сега въведете C-v (Покажи следващия екран), за да се придвижите към +следващия екран. + (Направете го сега, задръжте CONTROL, докато натискате v). + Отсега нататък вие ще правите това винаги, когато прочетете + екрана. -ъБВЕМЕЦЕФЕ, ЮЕ ЙНБ РТЙРПЛТЙЧБОЕ ОБ ДЧБ ТЕДБ, ЛПЗБФП УЕ РТЙДЧЙЦЧБФЕ ПФ -ЕЛТБО Ч ЕЛТБО; ФПЧБ ПУЙЗХТСЧБ ОСЛБЛЧБ РТЙЕНУФЧЕОПУФ, ФБЛБ ЮЕ ДБ НПЦЕФЕ -РП-МЕУОП ДБ РТПДЯМЦЙФЕ У ЮЕФЕОЕФП ОБ ФЕЛУФБ. +Забележете, че има припокриване на два реда, когато се придвижвате от +екран в екран; това осигурява някаква приемственост, така че да можете +по-лесно да продължите с четенето на текста. -рЯТЧПФП ОЕЭП, ЛПЕФП ФТСВЧБ ДБ ЪОБЕФЕ, Е ЛБЛ ДБ УЕ РТЙДЧЙЦЧБФЕ ПФ ЕДОП -НСУФП ОБ ФЕЛУФБ ЛЯН ДТХЗП. чЙЕ ЧЕЮЕ ЪОБЕФЕ ЛБЛ ДБ УЕ РТЙДЧЙЦЧБФЕ -ЕЛТБО ОБРТЕД, У C-v. ъБ ДБ УЕ РТЙДЧЙЦЙФЕ ЕЛТБО ОБЪБД, ЧЯЧЕДЕФЕ M-v -(ЪБДТЯЦФЕ ЛМБЧЙЫБ META Й ОБФЙУОЕФЕ v, ЙМЙ ЧЯЧЕДЕФЕ <ESC>v БЛП ОСНБФЕ -ЛМБЧЙЫ META, EDIT ЙМЙ ALT). +Първото нещо, което трябва да знаете, е как да се придвижвате от едно +място на текста към друго. Вие вече знаете как да се придвижвате +екран напред, с C-v. За да се придвижите екран назад, въведете M-v +(задръжте клавиша META и натиснете v, или въведете <ESC>v, ако нямате +клавиш META, EDIT или ALT). ->> пРЙФБКФЕ УЕ ДБ ЧЯЧЕДЕФЕ M-v Й УМЕД ФПЧБ C-v ОСЛПМЛП РЯФЙ. +>> Опитайте се да въведете M-v и след това C-v няколко пъти. -* пвпвэеойе +* ОБОБЩЕНИЕ ----------- -уМЕДЧБЭЙФЕ ЛПНБОДЙ УБ РПМЕЪОЙ РТЙ РЯМОПЕЛТБООП ТБЪЗМЕЦДБОЕ: +Следващите команди са полезни при пълноекранно разглеждане: + + 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 и PageDown за придвижване по +екрани, ако вашият терминал ги притежава, но вие можете да редактирате +по-ефективно, ако използвате C-v и M-v. -* пуопчй об хртбчмеойефп об лхтуптб +* ОСНОВИ НА УПРАВЛЕНИЕТО НА КУРСОРА ----------------------------------- -рТЙДЧЙЦЧБОЕФП ПФ ЕЛТБО ОБ ЕЛТБО Е РПМЕЪОП, ОП ЛБЛ ДБ УЕ РТЙДЧЙЦЙФЕ ДП -ПРТЕДЕМЕОП НСУФП ЧЯФТЕ Ч ФЕЛУФБ ОБ ЕЛТБОБ? +Придвижването от екран на екран е полезно, но как да се придвижите до +определено място вътре в текста на екрана? -йНБ ОСЛПМЛП ОБЮЙОБ ДБ ЗП ОБРТБЧЙФЕ. нПЦЕ ДБ ЙЪРПМЪЧБФЕ ЛМБЧЙЫЙФЕ -УФТЕМЛЙ, ОП Е РП-ЕЖЕЛФЙЧОП ДБ ДЯТЦЙФЕ ТЯГЕФЕ УЙ Ч УФБОДБТФОП РПМПЦЕОЙЕ -Й ДБ ЙЪРПМЪЧБФЕ ЛПНБОДЙФЕ C-p, C-b, C-f Й C-n. фЕЪЙ ЪОБГЙ УБ -ЕЛЧЙЧБМЕОФОЙ ОБ ЮЕФЙТЙФЕ ЛМБЧЙЫЙ УФТЕМЛЙ, ЕФП ФБЛБ: +Има няколко начина да го направите. Може да използвате клавишите +стрелки, но е по-ефективно да държите ръцете си в стандартно положение +и да използвате командите C-p, C-b, C-f и C-n. Тези знаци са +еквивалентни на четирите клавиши стрелки, ето така: - рТЕДЙЫЕО ТЕД (Previous), C-p + Предишен ред (Previous), C-p : : - оБЪБД, C-b .... фЕЛХЭБ РПЪЙГЙС ОБ ЛХТУПТБ .... оБРТЕД, C-f + Назад, C-b .... Текуща позиция на курсора .... Напред, C-f (Backward) : (Forward) : - уМЕДЧБЭ ТЕД (Next), C-n + Следващ ред (Next), C-n ->> рТЙДЧЙЦЕФЕ ЛХТУПТБ ДП ТЕДБ Ч УТЕДБФБ ОБ ФБЪЙ ДЙБЗТБНБ ЙЪРПМЪЧБКЛЙ - C-n Й C-p. уМЕД ФПЧБ ОБФЙУОЕФЕ C-l ЪБ ДБ ЧЙДЙФЕ ГСМБФБ ДЙБЗТБНБ - ГЕОФТЙТБОБ ОБ ЕЛТБОБ. +>> Придвижете курсора до реда в средата на тази диаграма, използвайки + C-n и C-p. След това натиснете C-l, за да видите цялата диаграма, + центрирана на екрана. -эЕ ОБНЕТЙФЕ, ЮЕ ЪБРПНОСОЕФП ОБ ФЕЪЙ ВХЛЧЙ РП ДХНЙФЕ ОБ БОЗМЙКУЛЙ ОБ -ДЕКУФЧЙСФБ, ЛПЙФП ЙЪЧЯТЫЧБФ, Е МЕУОП: P ЪБ Previous (РТЕДЙЫЕО), N ЪБ -Next (УМЕДЧБЭ), B ЪБ Backward (ОБЪБД) Й F ЪБ Forward (ОБРТЕД). чЙЕ ЭЕ -ЙЪРПМЪЧБФЕ ФЕЪЙ ПУОПЧОЙ ЛПНБОДЙ ЪБ РТЙДЧЙЦЧБОЕ ОБ ЛХТУПТБ РТЕЪ ГСМПФП -ЧТЕНЕ. +Ще намерите, че запомнянето на тези букви по думите на английски на +действията, които извършват, е лесно: P за Previous (предишен), N за +Next (следващ), B за Backward (назад) и F за Forward (напред). Вие ще +използвате тези основни команди за придвижване на курсора през цялото +време. ->> оБРТБЧЕФЕ ОСЛПМЛП C-n ЪБ ДБ ДПЧЕДЕФЕ ЛХТУПТБ ДП ФПЪЙ ТЕД. +>> Въведете няколко C-n, за да доведете курсора до този ред. ->> рТЙДЧЙЦЕФЕ УЕ Ч ТЕДБ У ОСЛПМЛП C-f Й УМЕД ФПЧБ У ОСЛПМЛП C-p. - чЙЦФЕ ЛБЛЧП РТБЧЙ C-p, ЛПЗБФП ЛХТУПТЯФ Е Ч УТЕДБФБ ОБ ТЕДБ. +>> Придвижете се в реда с няколко C-f и след това с няколко C-p. + Вижте какво прави C-p, когато курсорът е в средата на реда. -чУЕЛЙ ТЕД ПФ ФЕЛУФ ЪБЧЯТЫЧБ УЯУ ЪОБЛ ЪБ ОПЧ ТЕД, ЛПКФП УМХЦЙ ЪБ -ПФДЕМСОЕФП ОБ ТЕДБ ПФ УМЕДЧБЭЙС ТЕД. рПУМЕДОЙСФ ТЕД ЧЯЧ ЧБЫЙС ЖБКМ -ФТСВЧБ ДБ ЙНБ ЪОБЛ ЪБ ОПЧ ТЕД Ч ЛТБС (ОП еНБЛУ ОЕ ЙЪЙУЛЧБ ФБЛЯЧ, -ЛПЗБФП РТПЮЙФБ ЖБКМБ). +Всеки ред от текст завършва със знак за нов ред, който служи за +отделянето на реда от следващия ред. Последният ред във вашия файл +трябва да има знак за нов ред в края (но Емакс не изисква такъв, +когато прочита файла). ->> пРЙФБКФЕ C-b Ч ОБЮБМПФП ОБ ТЕД. фПЧБ ФТСВЧБ ДБ ЧЙ РТЙДЧЙЦЙ Ч ЛТБС - ОБ РТЕДЙЫОЙС ТЕД. фПЧБ Е ФБЛБ, ЪБЭПФП ЛХТУПТЯФ УЕ РТЙДЧЙЦЧБ ЛЯН - ЪОБЛБ ЪБ ОПЧ ТЕД ОБ РТЕДЙЫОЙС ТЕД. +>> Опитайте C-b в началото на ред. Това трябва да ви придвижи в края + на предишния ред. Това е така, защото курсорът се придвижва към + знака за нов ред на предишния ред. -C-f НПЦЕ ДБ РТЙДЧЙЦЧБ РТЕЪ ЪОБЛ ЪБ ОПЧ ТЕД ФПЮОП ЛБЛФП C-b. +C-f може да придвижва през знак за нов ред точно както C-b. ->> оБРТБЧЕФЕ ОСЛПМЛП C-b РТЙДЧЙЦЧБОЙС, ФБЛБ ЮЕ ДБ ДПВЙЕФЕ ХУЕЭБОЕ ЛЯДЕ - УЕ ОБНЙТБ ЛХТУПТБ. уМЕД ФПЧБ ОСЛПМЛП C-f ЪБ ДБ УЕ ЧЯТОЕФЕ Ч ЛТБС - ОБ ТЕДБ. уМЕД ФПЧБ ПЭЕ ОСЛПМЛП C-f ЪБ ДБ УЕ РТЙДЧЙЦЙФЕ ДП - УМЕДЧБЭЙС ТЕД. +>> Направете няколко C-b придвижвания, така че да добиете усещане къде + се намира курсорът. След това няколко C-f, за да се върнете в края + на реда. След това още няколко C-f, за да се придвижите до + следващия ред. -лПЗБФП УЕ РТЙДЧЙЦЧБФЕ УМЕД ЗПТОЙС ЙМЙ ДПМОЙС ЛТБК ОБ ЕЛТБОБ, ФЕЛУФЯФ -ПФЧЯД ЛТБС УЕ ЙЪНЕУФЧБ ЛЯН ЕЛТБОБ. фПЧБ УЕ ОБТЙЮБ "УЛТПМЙТБОЕ". фП -РПЪЧПМСЧБ ОБ еНБЛУ ДБ РТЙДЧЙЦЧБ ЛХТУПТБ ЛЯН ЪБДБДЕОПФП НСУФП Ч ФЕЛУФБ -ВЕЪ ДБ ЗП ЙЪЛБТЧБ ЙЪЧЯО ЕЛТБОБ. +Когато се придвижвате след горния или долния край на екрана, текстът +отвъд края се измества към екрана. Това се нарича "скролиране". То +позволява на Емакс да придвижва курсора към зададеното място в текста, +без да го изкарва извън екрана. ->> пРЙФБКФЕ УЕ ДБ РТЙДЧЙЦЙФЕ ЛХТУПТБ УМЕД ДПМОЙС ЛТБК ОБ ЕЛТБОБ У C-n - Й ЧЙЦФЕ ЛБЛЧП УЕ УМХЮЧБ. +>> Опитайте се да придвижите курсора след долния край на екрана с C-n + и вижте какво се случва. -бЛП РТЙДЧЙЦЧБОЕФП РП ЪОБГЙ Е ФЧЯТДЕ ВБЧОП, НПЦЕ ДБ РТПВЧБФЕ -РТЙДЧЙЦЧБОЕ РП ДХНЙ. M-f (META-f) РТЙДЧЙЦЧБ ЛХТУПТБ ДХНБ ОБРТЕД, Б -M-b РТЙДЧЙЦЧБ ДХНБ ОБЪБД. +Ако придвижването по знаци е твърде бавно, може да пробвате +придвижване по думи. M-f (META-f) придвижва курсора дума напред, а +M-b придвижва дума назад. ->> чЯЧЕДЕФЕ ОСЛПМЛП M-f Й M-b. +>> Въведете няколко M-f и M-b. -лПЗБФП УФЕ Ч УТЕДБФБ ОБ ДХНБ, M-f РТЙДЧЙЦЧБ Ч ЛТБС ОБ ДХНБФБ. лПЗБФП -УФЕ Ч РТБЪОП НСУФП НЕЦДХ ДХНЙ, M-f РТЙДЧЙЦЧБ Ч ЛТБС ОБ УМЕДЧБЭБФБ -ДХНБ. M-b ТБВПФЙ РП РПДПВЕО ОБЮЙО Ч РТПФЙЧПРПМПЦОБФБ РПУПЛБ. +Когато сте в средата на дума, M-f придвижва в края на думата. Когато +сте в празно място между думи, M-f придвижва в края на следващата +дума. M-b работи по подобен начин в противоположната посока. ->> чЯЧЕДЕФЕ M-f Й M-b ОСЛПМЛП РЯФЙ, ТБЪНЕУЕОЙ У C-f Й C-b, ФБЛБ ЮЕ ДБ - НПЦЕФЕ ДБ ОБВМАДБЧБФЕ ДЕКУФЧЙЕФП ОБ M-f Й M-b Ч ТБЪМЙЮОЙ НЕУФБ - ЧЯФТЕ Й НЕЦДХ ДХНЙФЕ. +>> Въведете M-f и M-b няколко пъти, размесени с C-f и C-b, така че да + можете да наблюдавате действието на M-f и M-b в различни места + вътре и между думите. -ъБВЕМЕЦЕФЕ РТЙМЙЛБФБ НЕЦДХ C-f Й C-b ПФ ЕДОБ УФТБОБ, Й M-f Й M-b ПФ -ДТХЗБ. нОПЗП ЮЕУФП Meta-ЪОБГЙФЕ УБ ЙЪРПМЪЧБОЙ ЪБ ДЕКУФЧЙС ЧЯТИХ -ЕДЙОЙГЙ ДЕЖЙОЙТБОЙ ПФ ЕЪЙЛБ (ДХНЙ, ЙЪТЕЮЕОЙС, БВЪБГЙ), ДПЛБФП -Control-ЪОБГЙФЕ ДЕКУФЧБФ ЧЯТИХ ПУОПЧОЙ ЕДЙОЙГЙ, ЛПЙФП УБ ОЕЪБЧЙУЙНЙ ПФ -ФПЧБ ЛБЛЧП ТЕДБЛФЙТБФЕ (ЪОБГЙ, ТЕДПЧЕ Й ДТХЗЙ). +Забележете приликата между 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 +продължава придвижването с още едно изречение. Въпреки че тези +клавишни комбинации не са точно аналогични, всяка една от тях изглежда +естествена. -рПМПЦЕОЙЕФП ОБ ЛХТУПТБ Ч ФЕЛУФБ УЕ ОБТЙЮБ УЯЭП "ФПЮЛБ". -рЕТЕЖТБЪЙТБОП, ЛХТУПТЯФ РПЛБЪЧБ ОБ ЕЛТБОБ ЛЯДЕ Е ТБЪРПМПЦЕОБ ФПЮЛБФБ Ч -ФЕЛУФБ. +Положението на курсора в текста се нарича също "точка". +Перефразирано, курсорът показва на екрана къде е разположена точката в +текста. -еФП ПВПВЭЕОЙЕ ОБ РТПУФЙФЕ ДЕКУФЧЙС ДЧЙЦЕЭЙ ЛХТУПТБ, ЧЛМАЮЙФЕМОП -РТЙДЧЙЦЧБЭЙФЕ РП ДХНБ Й ЙЪТЕЮЕОЙЕ: +Ето обобщение на простите действия, движещи курсора, включително +придвижващите по дума и изречение: - C-f рТЙДЧЙЦЧБ ОБРТЕД У ЕДЙО ЪОБЛ - C-b рТЙДЧЙЦЧБ ОБЪБД У ЕДЙО ЪОБЛ + C-f Придвижва напред с един знак + C-b Придвижва назад с един знак - M-f рТЙДЧЙЦЧБ ОБРТЕД У ЕДОБ ДХНБ - M-b РТЙДЧЙЦЧБ ОБЪБД У ЕДОБ ДХНБ + M-f Придвижва напред с една дума + M-b придвижва назад с една дума - C-n рТЙДЧЙЦЧБ ДП УМЕДЧБЭЙС ТЕД - C-p рТЙДЧЙЦЧБ ДП РТЕДЙЫОЙС ТЕД + C-n Придвижва до следващия ред + C-p Придвижва до предишния ред - C-a рТЙДЧЙЦЧБ ДП ОБЮБМПФП ОБ ТЕД - C-e рТЙДЧЙЦЧБ ДП ЛТБС ОБ ТЕД + C-a Придвижва до началото на ред + C-e Придвижва до края на ред - M-a рТЙДЧЙЦЧБ ДП ОБЮБМПФП ОБ ЙЪТЕЮЕОЙЕ - M-e рТЙДЧЙЦЧБ ДП ЛТБС ОБ ЙЪТЕЮЕОЙЕ + M-a Придвижва до началото на изречение + M-e Придвижва до края на изречение ->> уЕЗБ ПРЙФБКФЕ ЧУЙЮЛЙ ФЕЪЙ ЛПНБОДЙ ОСЛПМЛП РЯФЙ ЪБ РТБЛФЙЛБ. фЕЪЙ - УБ ОБК-ЮЕУФП ЙЪРПМЪЧБОЙФЕ ЛПНБОДЙ. +>> Сега опитайте всички тези команди няколко пъти за практика. Тези + са най-често използваните команди. -дЧЕ ДТХЗЙ ЧБЦОЙ ЛПНБОДЙ ЪБ ДЧЙЦЕОЙЕ ОБ ЛХТУПТБ УБ M-< (Meta РП-НБМЛП), -ЛПСФП РТЙДЧЙЦЧБ ДП ОБЮБМПФП ОБ ГЕМЙС ФЕЛУФ, Й M-> (Meta РП-ЗПМСНП), -ЛПСФП РТЕНЕУФЧБ ДП ЛТБС ОБ ГЕМЙС ФЕЛУФ. +Две други важни команди за движение на курсора са M-< (Meta по-малко), +която придвижва до началото на целия текст, и M-> (Meta по-голямо), +която премества до края на целия текст. -рТЙ РПЧЕЮЕФП ФЕТНЙОБМЙ, ЪОБЛЯФ "<" Е ПФВЕМСЪБО ОБД ЪБРЕФБСФБ, ФБЛБ ЮЕ -ФТСВЧБ ДБ ЙЪРПМЪЧБФЕ ЛМБЧЙЫБ Shift ЪБ ДБ ЗП ОБРЙЫЕФЕ. оБ ФЕЪЙ -ФЕТНЙОБМЙ ФТСВЧБ ДБ ЙЪРПМЪЧБФЕ Shift ЪБ ДБ ЧЯЧЕДЕФЕ Й M-<; ВЕЪ ЛМБЧЙЫБ -Shift ВЙИФЕ ЧЯЧЕМЙ M-ЪБРЕФБС. +При повечето терминали знакът "<" е отбелязан над запетаята, така че +трябва да използвате клавиша Shift, за да го напишете. На тези +терминали трябва да използвате Shift, за да въведете и M-<; без клавиша +Shift бихте въвели M-запетая. ->> пРЙФБКФЕ M-< УЕЗБ, ЪБ ДБ УЕ РТЙДЧЙЦЙФЕ ДП ОБЮБМПФП ОБ ЧЯЧЕДЕОЙЕФП. - уМЕД ФПЧБ ЙЪРПМЪЧБКФЕ C-v ЛПМЛПФП Е ОХЦОП РЯФЙ, ЪБ ДБ УЕ РТЙДЧЙЦЙФЕ - ДП ФХЛ. +>> Опитайте M-< сега, за да се придвижите до началото на въведението. + След това използвайте C-v колкото е нужно пъти, за да се придвижите + до тук. ->> пРЙФБКФЕ M-> УЕЗБ, ЪБ ДБ УЕ РТЙДЧЙЦЙФЕ ДП ЛТБС ОБ ЧЯЧЕДЕОЙЕФП. - уМЕД ФПЧБ ЙЪРПМЪЧБКФЕ M-v ЛПМЛПФП Е ОХЦОП РЯФЙ, ЪБ ДБ УЕ РТЙДЧЙЦЙФЕ - ДП ФХЛ. +>> Опитайте M-> сега, за да се придвижите до края на въведението. + След това използвайте M-v колкото е нужно пъти, за да се придвижите + до тук. -чЙЕ НПЦЕФЕ УЯЭП ДБ УЕ РТЙДЧЙЦЧБФЕ У ЛМБЧЙЫЙФЕ-УФТЕМЛЙ, БЛП ЧБЫЙСФ -ФЕТНЙОБМ ЙНБ ФБЛЙЧБ. оЙЕ РТЕРПТЯЮЧБНЕ ДБ ОБХЮЙФЕ C-b, C-f, C-n Й C-p -РП ФТЙ РТЙЮЙОЙ. рЯТЧП, ФЕ ТБВПФСФ ОБ ЧУЙЮЛЙ ЧЙДПЧЕ ФЕТНЙОБМЙ. чФПТП, -ЧЕДОЯЦ УМЕД ЛБФП ДПВЙЕФЕ РТБЛФЙЛБ Ч ЙЪРПМЪЧБОЕФП ОБ еНБЛУ, ЭЕ -ПФЛТЙЕФЕ, ЮЕ ЧЯЧЕЦДБОЕФП ОБ ФЕЪЙ Control-ЪОБГЙ Е РП-ВЯТЪП ПФ -ЧЯЧЕЦДБОЕФП ОБ ЛМБЧЙЫЙФЕ УФТЕМЛЙ, ЪБЭПФП ОЕ ФТСВЧБ ДБ РТЕНЕУФЧБФЕ -ТЯЛБФБ УЙ ДБМЕЮ ПФ ПВМБУФФБ ОБ ЛМБЧЙЫЙФЕ У ВХЛЧЙ. фТЕФП, ЧЕДОЯЦ УМЕД -ЛБФП УЙ ПЖПТНЙФЕ ОБЧЙЛ ДБ ЙЪРПМЪЧБФЕ ФЕЪЙ ЛПНБОДЙ У Control ЪОБГЙ, ЧЙЕ -НПЦЕФЕ УЯЭП ФБЛБ МЕУОП ДБ ОБХЮЙФЕ РП-ОБРТЕДОБМЙФЕ ЛПНБОДЙ ЪБ ДЧЙЦЕОЙЕ -ОБ ЛХТУПТБ. +Вие можете също да се придвижвате с клавишите-стрелки, ако вашият +терминал има такива. Ние препоръчваме да научите C-b, C-f, C-n и C-p +по три причини. Първо, те работят на всички видове терминали. Второ, +веднъж след като добиете практика в използването на Емакс, ще +откриете, че въвеждането на тези Control-знаци е по-бързо от +въвеждането на клавишите стрелки, защото не трябва да премествате +ръката си далеч от областта на клавишите с букви. Трето, веднъж след +като си оформите навик да използвате тези команди с Control знаци, вие +можете също така лесно да научите по-напредналите команди за движение +на курсора. -рПЧЕЮЕФП еНБЛУ ЛПНБОДЙ РТЙЕНБФ ЮЙУМПЧ БТЗХНЕОФ; ЪБ РПЧЕЮЕФП ПФ ФСИ ФПК -УМХЦЙ ЛБФП ВТПСЮ ОБ РПЧФПТЕОЙС. оБЮЙОЯФ, РП ЛПКФП ДБЧБФЕ ЮЙУМПЧ -ВТПСЮ, Е У ЧЯЧЕЦДБОЕ ОБ C-u, РПУМЕДЧБОП ПФ ЧЯЧЕЦДБОЕ ОБ ГЙЖТЙФЕ, Й -ЧУЙЮЛП ФПЧБ РТЕДЙ ЧЯЧЕЦДБОЕ ОБ УБНБФБ ЛПНБОДБ. бЛП ЙНБФЕ ЛМБЧЙЫ META -(ЙМЙ EDIT ЙМЙ ALT), ЙНБ ДТХЗ, БМФЕТОБФЙЧЕО ОБЮЙО ДБ ЧЯЧЕДЕФЕ ЮЙУМПЧ -БТЗХНЕОФ: ЧЯЧЕДЕФЕ ГЙЖТЙФЕ ДПЛБФП ЪБДЯТЦБФЕ ЛМБЧЙЫБ META. оЙЕ -РТЕРПТЯЮЧБНЕ ДБ ОБХЮЙФЕ ОБЮЙОБ У C-u, ЪБЭПФП ФПК ТБВПФЙ ОБ ЛПКФП Й ДБ -Е ФЕТНЙОБМ. юЙУМПЧЙСФ БТЗХНЕОФ УЕ ОБТЙЮБ УЯЭП "РТЕЖЙЛУЕО БТЗХНЕОФ", -ЪБЭПФП ЗП ЧЯЧЕЦДБФЕ РТЕДЙ ЛПНБОДБФБ, ЪБ ЛПСФП Е РТЕДОБЪОБЮЕО. +Повечето Емакс команди приемат числов аргумент; за повечето от тях той +служи като брояч на повторения. Начинът, по който давате числов +брояч, е с въвеждане на C-u, последвано от въвеждане на цифрите, и +всичко това преди въвеждане на самата команда. Ако имате клавиш META +(или EDIT или ALT), има друг, алтернативен начин да въведете числов +аргумент: въведете цифрите, докато задържате клавиша META. Ние +препоръчваме да научите начина с C-u, защото той работи на който и да +е терминал. Числовият аргумент се нарича също "префиксен аргумент", +защото го въвеждате преди командата, за която е предназначен. -оБРТЙНЕТ, C-u 8 C-f РТЙДЧЙЦЧБ ПУЕН ЪОБЛБ ОБРТЕД. +Например, C-u 8 C-f придвижва осем знака напред. ->> пРЙФБКФЕ ЙЪРПМЪЧБОЕФП ОБ 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 реда. ->> уЕЗБ ПРЙФБКФЕ C-u 8 C-v. +>> Сега опитайте C-u 8 C-v. -фПЧБ ВЙ ФТСВЧБМП ДБ УЛТПМЙТБ ЕЛТБОБ У 8 ТЕДБ. бЛП ЙУЛБФЕ ДБ -УЛТПМЙТБФЕ ПФОПЧП ОБДПМХ, НПЦЕ ДБ ДБДЕФЕ БТЗХНЕОФ ОБ M-v. +Това би трябвало да скролира екрана с 8 реда. Ако искате да +скролирате отново надолу, може да дадете аргумент на M-v. -бЛП ЙЪРПМЪЧБФЕ ЗТБЖЙЮЕО ЙОФЕТЖЕКУ, ЛБФП X11 ЙМЙ MS-Windows, ВЙ -ФТСВЧБМП ДБ ЙНБ ФЯОЛБ РТБЧПЯЗЯМОБ ПВМБУФ ОБТЕЮЕОБ РМЯЪЗБЮ (scroll bar) -Ч МСЧБФБ УФТБОБ ОБ РТПЪПТЕГБ ОБ еНБЛУ. чЙЕ НПЦЕФЕ ДБ УЛТПМЙТБФЕ -ФЕЛУФБ ЭТБЛБКЛЙ У НЙЫЛБФБ Ч РМЯЪЗБЮБ. +Ако използвате графичен интерфейс, като X11 или MS-Windows, би +трябвало да има тънка правоъгълна област, наречена плъзгач (scroll +bar), в лявата страна на прозореца на Емакс. Вие можете да скролирате +текста, щракайки с мишката в плъзгача. ->> пРЙФБКФЕ ДБ ОБФЙУОЕФЕ УТЕДОЙС ВХФПО ОБ ЧЯТИБ ОБ ПУЧЕФЕОБФБ ПВМБУФ - ЧЯФТЕ Ч РМЯЪЗБЮБ. фПЧБ ВЙ ФТСВЧБМП ДБ УЛТПМЙТБ ФЕЛУФБ ЛЯН - РПМПЦЕОЙЕ, ПРТЕДЕМЕОП ПФ ФПЧБ ЛПМЛП ЧЙУПЛП ЙМЙ ОЙУЛП УФЕ ЭТБЛОБМЙ. +>> Опитайте да натиснете средния бутон на върха на осветената област + вътре в плъзгача. Това би трябвало да скролира текста към + положение, определено от това колко високо или ниско сте щракнали. ->> пРЙФБКФЕ УЕ ДБ ДЧЙЦЙФЕ НЙЫЛБФБ ОБЗПТЕ Й ОБДПМХ, ДПЛБФП УФЕ - ЪБДЯТЦБМЙ ДЕУОЙС ВХФПО ОБФЙУОБФ. эЕ ЧЙДЙФЕ, ЮЕ ФЕЛУФЯФ УЕ УЛТПМЙТБ - ОБЗПТЕ Й ОБДПМХ ЛБФП ДЧЙЦЙФЕ НЙЫЛБФБ. +>> Опитайте се да движите мишката нагоре и надолу, докато сте + задържали десния бутон натиснат. Ще видите, че текстът се скролира + нагоре и надолу, като движите мишката. -* лпзбфп енблу е вмплйтбм +* КОГАТО ЕМАКС Е БЛОКИРАЛ ------------------------- -бЛП еНБЛУ УРТЕ ДБ ПФЗПЧБТС ОБ ЧБЫЙФЕ ЛПНБОДЙ, ЧЙЕ НПЦЕФЕ ДБ ЗП УРТЕФЕ -ВЕЪПРБУОП ЛБФП ЧЯЧЕДЕФЕ C-g. нПЦЕ ДБ ЙЪРПМЪЧБФЕ C-g ЪБ ДБ УРТЕФЕ -ЛПНБОДБ, ЛПСФП УЕ ЙЪРЯМОСЧБ ФЧЯТДЕ ДЯМЗП. +Ако Емакс спре да отговаря на вашите команди, вие можете да го спрете +безопасно, като въведете 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. -* ъбвтбоеой лпнбодй +* ЗАБРАНЕНИ КОМАНДИ ------------------- -оСЛПЙ ЛПНБОДЙ ОБ еНБЛУ УБ "ЪБВТБОЕОЙ", ФБЛБ ЮЕ ОБЮЙОБЕЭЙФЕ РПФТЕВЙФЕМЙ -ДБ ОЕ НПЗБФ ДБ ЗЙ ХРПФТЕВСФ РП РПЗТЕЫЛБ. +Някои команди на Емакс са "забранени", така че начинаещите потребители +да не могат да ги употребят по погрешка. -бЛП ЧЯЧЕДЕФЕ ОСЛПС ПФ ЪБВТБОЕОЙФЕ ЛПНБОДЙ, еНБЛУ ЙЪЧЕЦДБ УЯПВЭЕОЙЕ, -ЛБЪЧБКЛЙ ЛБЛЧБ Е ВЙМБ ЛПНБОДБФБ Й РЙФБКЛЙ ЧЙ ДБМЙ ЙУЛБФЕ ДБ РТПДЯМЦЙФЕ -ОБРТЕД Й ДБ ЙЪРЯМОЙФЕ ЛПНБОДБФБ. +Ако въведете някоя от забранените команди, Емакс извежда съобщение, +казвайки каква е била командата и питайки ви дали искате да продължите +напред и да изпълните командата. -бЛП ОБЙУФЙОБ ЙУЛБФЕ ДБ ЙЪРТПВЧБФЕ ЛПНБОДБФБ, ЧЯЧЕДЕФЕ ЛМБЧЙЫБ ЙОФЕТЧБМ -Ч ПФЗПЧПТ ОБ ЧЯРТПУБ. пВЙЛОПЧЕОП БЛП ОЕ ЙУЛБФЕ ДБ ЙЪРЯМОЙФЕ -ЪБВТБОЕОБФБ ЛПНБОДБ, ПФЗПЧБТСФЕ ОБ ЧЯРТПУБ У "n". +Ако наистина искате да изпробвате командата, въведете клавиша интервал +в отговор на въпроса. Обикновено ако не искате да изпълните +забранената команда, отговаряте на въпроса с "n". ->> чЯЧЕДЕФЕ C-x C-l (ЛПСФП Е ЪБВТБОЕОБ ЛПНБОДБ), Й УМЕД ФПЧБ ЧЯЧЕДЕФЕ - "n" Ч ПФЗПЧПТ ОБ ЧЯРТПУБ. +>> Въведете C-x C-l (която е забранена команда), и след това въведете + "n" в отговор на въпроса. -* ртпъптгй +* ПРОЗОРЦИ ---------- -еНБЛУ НПЦЕ ДБ ХРТБЧМСЧБ ОСЛПМЛП РТПЪПТЕГБ, ЧУЕЛЙ ЙЪЧЕЦДБКЛЙ УЧПК -УПВУФЧЕО ФЕЛУФ. оЙЕ ЭЕ ПВСУОЙН РП-ЛЯУОП ЛБЛ ДБ ЙЪРПМЪЧБФЕ ОСЛПМЛП -РТПЪПТЕГБ. фПЮОП УЕЗБ ОЙЕ ЙУЛБНЕ ДБ ПВСУОЙН ЛБЛ ДБ УЕ ПФЯТЧЕФЕ ПФ -ДПРЯМОЙФЕМОЙ РТПЪПТГЙ Й ДБ УЕ ЧЯТОЕФЕ ЛЯН ПУОПЧОПФП ТЕДБЛФЙТБОЕ У ЕДЙО -РТПЪПТЕГ. рТПУФП Е: +Емакс може да управлява няколко прозореца, всеки извеждайки свой +собствен текст. Ние ще обясним по-късно как да използвате няколко +прозореца. Точно сега ние искаме да обясним как да се отървете от +допълнителни прозорци и да се върнете към основното редактиране с един +прозорец. Просто е: - C-x 1 еДЙО РТПЪПТЕГ (Ф.Е. РТЕНБИОЙ ЧУЙЮЛЙ ДТХЗЙ РТПЪПТГЙ). + C-x 1 Един прозорец (т.е. премахни всички други прозорци). -фПЧБ Е CONTROL-x РПУМЕДЧБОП ПФ ГЙЖТБФБ 1. C-x 1 ТБЪЫЙТСЧБ РТПЪПТЕГБ -УЯДЯТЦБЭ ЛХТУПТБ, ЪБ ДБ НПЦЕ ДБ ЪБРЯМОЙ ГЕМЙС ЕЛТБО. фС РТЕНБИЧБ -ЧУЙЮЛЙ ДТХЗЙ РТПЪПТГЙ. +Това е CONTROL-x, последван от цифрата 1. C-x 1 разширява прозореца, +съдържащ курсора, за да може да запълни целия екран. Тя премахва +всички други прозорци. ->> рТЙДЧЙЦЕФЕ ЛХТУПТБ ДП ФПЪЙ ТЕД Й ЧЯЧЕДЕФЕ C-u 0 C-l. ->> чЯЧЕДЕФЕ C-h k C-f. - чЙЦФЕ ЛБЛ ФПЪЙ РТПЪПТЕГ УЕ УЧЙЧБ, ДПЛБФП ДТХЗ УЕ РПСЧСЧБ ЪБ ДБ - ЙЪЧЕДЕ ДПЛХНЕОФБГЙС ОБ ЛПНБОДБФБ C-f. +>> Придвижете курсора до този ред и въведете C-u 0 C-l. +>> Въведете C-h k C-f. + Вижте как този прозорец се свива, докато друг се появява, за да + изведе документацията на командата C-f. ->> чЯЧЕДЕФЕ C-x 1 Й ЧЙЦФЕ ЛБЛ РТПЪПТЕГБ У ДПЛХНЕОФБГЙСФБ ЙЪЮЕЪЧБ. +>> Въведете C-x 1 и вижте как прозорецът с документацията изчезва. -фБЪЙ ЛПНБОДБ ОЕ Е ЛБФП ДТХЗЙФЕ ЛПНБОДЙ, ЛПЙФП УФЕ ОБХЮЙМЙ, Ч ФПЧБ -ПФОПЫЕОЙЕ, ЮЕ УЕ УЯУФПЙ ПФ ДЧБ ЪОБЛБ. ъБРПЮЧБ УЯУ ЪОБЛБ C-x. йНБ -ГСМБ ТЕДЙГБ ПФ ЛПНБОДЙ, ЛПЙФП ЪБРПЮЧБФ У C-x; НОПЗП ПФ ФСИ ЙНБФ ОЕЭП -ПВЭП У РТПЪПТГЙ, ЖБКМПЧЕ, ВХЖЕТЙ Й УЧЯТЪБОЙФЕ У ФСИ ОЕЭБ. фЕЪЙ -ЛПНБОДЙ УБ ПФ ДЧБ, ФТЙ ЙМЙ ЮЕФЙТЙ ЪОБЛБ. +Тази команда не е като другите команди, които сте научили, в това +отношение, че се състои от два знака. Започва със знака C-x. Има +цяла редица от команди, които започват с C-x; много от тях имат нещо +общо с прозорци, файлове, буфери и свързаните с тях неща. Тези +команди са от два, три или четири знака. -* чнялчбое й йъфтйчбое +* ВМЪКВАНЕ И ИЗТРИВАНЕ ---------------------- -бЛП ЙУЛБФЕ ДБ ЧНЯЛОЕФЕ ФЕЛУФ, РТПУФП ЗП ЧЯЧЕДЕФЕ. ъОБГЙФЕ, ЛПЙФП -НПЗБФ ДБ УЕ ЧЙЦДБФ, ЛБФП б, 7, * Й Ф.О., УЕ ЧЯЪРТЙЕНБФ ПФ еНБЛУ ЛБФП -ФЕЛУФ Й УЕ ЧНЯЛЧБФ ЧЕДОБЗБ. чЯЧЕДЕФЕ <Return> (ЛМБЧЙЫЯФ ЪБ ЧТЯЭБОЕ Ч -ОБЮБМПФП ОБ ТЕДБ) ЪБ ДБ ЧНЯЛОЕФЕ ЪОБЛ ЪБ ОПЧ ТЕД. +Ако искате да вмъкнете текст, просто го въведете. Знаците, които +могат да се виждат, като А, 7, * и т.н., се възприемат от Емакс като +текст и се вмъкват веднага. Въведете <Return> (клавишът за връщане в +началото на реда), за да вмъкнете знак за нов ред. -нПЦЕ ДБ ЙЪФТЙЕФЕ РПУМЕДОЙС ЪОБЛ, ЛПКФП УФЕ ЧЯЧЕМЙ, У ЧЯЧЕЦДБОЕ ОБ -<Delback>. <Delback> Е ЛМБЧЙЫ ПФ ЛМБЧЙБФХТБФБ -- УЯЭЙСФ, ЛПКФП -ПВЙЛОПЧЕОП ЙЪРПМЪЧБФЕ ЙЪЧЯО еНБЛУ ЪБ ДБ ЙЪФТЙЕФЕ РПУМЕДОЙС ЧЯЧЕДЕО ПФ -ЧБУ ЪОБЛ. пВЙЛОПЧЕОП Е ЗПМСН ЛМБЧЙЫ ОБ ОСЛПМЛП ТЕДБ ТБЪУФПСОЙЕ ПФ -ЛМБЧЙЫБ <Return>, Й ПВЙЛОПЧЕОП Е ПФВЕМСЪБО У "Delete", "Del" ЙМЙ +Може да изтриете последния знак, който сте въвели, с въвеждане на +<Delback>. <Delback> е клавиш от клавиатурата -- същият, който +обикновено използвате извън Емакс, за да изтриете последния въведен от +вас знак. Обикновено е голям клавиш, на няколко реда разстояние от +клавиша <Return>, и обикновено е отбелязан с "Delete", "Del" или "Backspace". -бЛП ЗПМЕНЙСФ ЛМБЧЙЫ ФБН Е У ЕФЙЛЕФ "Backspace", ФПЗБЧБ ФПК Е ФПЪЙ, -ЛПКФП ЭЕ ЙЪРПМЪЧБФЕ ЪБ <Delback>. нПЦЕ ДБ ЙНБ ПЭЕ ЕДЙО ЛМБЧЙЫ У -ЕФЙЛЕФ "Delete" ОСЛЯДЕ ДТХЗБДЕ, ОП ФПК ОЕ Е <Delback>. +Ако големият клавиш там е с етикет "Backspace", тогава той е този, +който ще използвате за <Delback>. Може да има още един клавиш с +етикет "Delete" някъде другаде, но той не е <Delback>. -рП-ПВЭП ЛБЪБОП, <Delback> ЙЪФТЙЧБ ЪОБЛБ ФПЮОП РТЕДЙ ФЕЛХЭПФП НСУФП ОБ -ЛХТУПТБ. +По-общо казано, <Delback> изтрива знака точно преди текущото място на +курсора. ->> оБРТБЧЕФЕ ФПЧБ УЕЗБ -- ОБРЙЫЕФЕ ОСЛПМЛП ЪОБЛБ, РПУМЕ ЗЙ ЙЪФТЙКФЕ У - ЧЯЧЕЦДБОЕ ОБ <Delback> ОСЛПМЛП РЯФЙ. оЕ УЕ ВЕЪРПЛПКФЕ, ЮЕ ФПЪЙ - ЖБКМ ЭЕ ВЯДЕ РТПНЕОЕО; ЧЙЕ ОСНБ ДБ РТПНЕОЙФЕ РЯТЧПОБЮБМОПФП - ЧЯЧЕДЕОЙЕ. фПЧБ Е ЧБЫЕ МЙЮОП ЛПРЙЕ. +>> Направете това сега -- напишете няколко знака, после ги изтрийте с + въвеждане на <Delback> няколко пъти. Не се безпокойте, че този + файл ще бъде променен; вие няма да промените първоначалното + въведение. Това е ваше лично копие. -лПЗБФП ТЕД ПФ ФЕЛУФБ УФБОЕ ФЧЯТДЕ ДЯМЯЗ ЪБ ДБ УЕ УЯВЕТЕ Ч ТЕД ПФ -ЕЛТБОБ, ТЕДЯФ ПФ ФЕЛУФБ УЕ "РТПДЯМЦБЧБ" ОБ УМЕДЧБЭЙС ТЕД. пВТБФОБ -ОБЛМПОЕОБ ЮЕТФБ ("\") (ЙМЙ, БЛП ЙЪРПМЪЧБФЕ ЗТБЖЙЮЕО ЙОФЕТЖЕКУ, НБМЛБ -ЙЪЛТЙЧЕОБ УФТЕМЛБ) Ч ДСУОБФБ ЗТБОЙГБ ПФВЕМСЪЧБ ТЕД, ЛПКФП Е ВЙМ -РТПДЯМЦЕО. +Когато ред от текста стане твърде дълъг, за да се събере в ред от +екрана, редът от текста се "продължава" на следващия ред. Обратна +наклонена черта ("\") (или, ако използвате графичен интерфейс, малка +изкривена стрелка) в дясната граница отбелязва ред, който е бил +продължен. ->> чЯЧЕДЕФЕ ФЕЛУФ ДПЛБФП УФЙЗОЕФЕ ДСУОБФБ ЗТБОЙГБ, Й РТПДЯМЦЕФЕ У - ЧНЯЛЧБОЕФП. эЕ ЧЙДЙФЕ РТПДЯМЦЕОЙЕФП ДБ ТЕДБ ДБ УЕ РПЛБЪЧБ. +>> Въведете текст, докато стигнете дясната граница, и продължете с + вмъкването. Ще видите продължението на реда да се показва. ->> йЪРПМЪЧБКФЕ ОСЛПМЛП <Delback> ЪБ ДБ ЙЪФТЙЕФЕ ФЕЛУФБ ДПЛБФП ТЕДЯФ УЕ - ЧНЕУФЙ Ч ЕДЙО ЕЛТБОЕО ТЕД. рТПДЯМЦЕОЙЕФП ОБ ТЕДБ ЙЪЮЕЪЧБ. +>> Използвайте няколко <Delback>, за да изтриете текста, докато редът + се вмести в един екранен ред. Продължението на реда изчезва. -нПЦЕ ДБ ЙЪФТЙЕФЕ ЪОБЛБ ЪБ ОПЧ ТЕД ФПЮОП ЛБЛФП ЧУЕЛЙ ДТХЗ ЪОБЛ. -йЪФТЙЧБОЕФП ОБ ЪОБЛБ ЪБ ОПЧ ТЕД НЕЦДХ ДЧБ ТЕДБ ЗЙ УМЙЧБ Ч ЕДЙО ТЕД. -бЛП РПМХЮЕОЙСФ ЛПНВЙОЙТБО ТЕД Е ФЧЯТДЕ ДЯМЯЗ, ЪБ ДБ УЕ ЧНЕУФЙ Ч -ЫЙТЙОБФБ ОБ ЕЛТБОБ, ФПК ЭЕ ВЯДЕ РПЛБЪБО ЛБФП РТПДЯМЦЕО ТЕД. +Може да изтриете знака за нов ред точно както всеки друг знак. +Изтриването на знака за нов ред между два реда ги слива в един ред. +Ако полученият комбиниран ред е твърде дълъг, за да се вмести в +ширината на екрана, той ще бъде показан като продължен ред. ->> рТЙДЧЙЦЕФЕ ЛХТУПТБ Ч ОБЮБМПФП ОБ ТЕД Й ЧЯЧЕДЕФЕ <Delback>. фПЧБ ЭЕ - УМЕЕ ФПЪЙ ТЕД У РТЕДЙЫОЙС. +>> Придвижете курсора в началото на ред и въведете <Delback>. Това ще + слее този ред с предишния. ->> чЯЧЕДЕФЕ <Return> ЪБ ДБ ЧНЯЛОЕФЕ ОБОПЧП ЪОБЛБ ЪБ ОПЧ ТЕД, ЛПКФП - ЙЪФТЙИФЕ. +>> Въведете <Return>, за да вмъкнете наново знака за нов ред, който + изтрихте. -ъБРПНОЕФЕ, ЮЕ ОБ РПЧЕЮЕФП ЛПНБОДЙ ОБ еНБЛУ НПЦЕ ДБ ВЯДЕ ЪБДБДЕО ВТПСЮ -ОБ РПЧФПТЕОЙСФБ; ФПЧБ ЧЛМАЮЧБ ЧНЯЛЧБОЕФП ОБ ФЕЛУФПЧЙ ЪОБГЙ. -рПЧФБТСОЕФП ОБ ФЕЛУФПЧ ЪОБЛ ЗП ЧНЯЛЧБ ОСЛПМЛП РЯФЙ. +Запомнете, че на повечето команди на Емакс може да бъде зададен брояч +на повторенията; това включва вмъкването на текстови знаци. +Повтарянето на текстов знак го вмъква няколко пъти. ->> пРЙФБКФЕ ФПЧБ УЕЗБ -- ЧЯЧЕДЕФЕ C-u 8 * ЪБ ДБ ЧНЯЛОЕФЕ ********. +>> Опитайте това сега -- въведете C-u 8 *, за да вмъкнете ********. -уЕЗБ ЧЙЕ УФЕ ОБХЮЙМЙ ОБК-ПУОПЧОЙФЕ ОБЮЙОЙ ЪБ ЧЯЧЕЦДБОЕ ОБ ОЕЭП Ч еНБЛУ -Й РПРТБЧСОЕФП ОБ ЗТЕЫЛЙ. нПЦЕФЕ УЯЭП ФБЛБ ДБ ЙЪФТЙЧБФЕ ДХНЙ ЙМЙ -ТЕДПЧЕ. еФП ПВПВЭЕОЙЕ ОБ ЙЪФТЙЧБЭЙФЕ ДЕКУФЧЙС: +Сега вие сте научили най-основните начини за въвеждане на нещо в Емакс +и поправяне на грешки. Можете също така да изтривате думи или редове. +Ето обобщение на изтриващите действия: - <Delback> ЙЪФТЙЧБОЕ ОБ ЪОБЛБ ФПЮОП РТЕДЙ ЛХТУПТБ - C-d ЙЪФТЙЧБОЕ ОБ ЪОБЛБ ФПЮОП УМЕД ЛХТУПТБ + <Delback> изтриване на знака точно преди курсора + C-d изтриване на знака точно след курсора - M-<Delback> ЙЪФТЙЧБОЕ ОБ ДХНБФБ ОЕРПУТЕДУФЧЕОП РТЕДЙ ЛХТУПТБ - M-d ЙЪФТЙЧБОЕ ОБ ДХНБФБ УМЕД ЛХТУПТБ + M-<Delback> изтриване на думата непосредствено преди курсора + M-d изтриване на думата след курсора - C-k ЙЪФТЙЧБОЕ ПФ НСУФПФП ОБ ЛХТУПТБ ДП ЛТБС ОБ ТЕДБ - M-k ЙЪФТЙЧБОЕ ДП ЛТБС ОБ ФЕЛХЭПФП ЙЪТЕЮЕОЙЕ + C-k изтриване от мястото на курсора до края на реда + M-k изтриване до края на текущото изречение -ъБВЕМЕЦЕФЕ, ЮЕ <Delback> Й C-d УТБЧОЕОЙ У M-<Delback> Й M-d ТБЪЫЙТСЧБФ -РПДПВЙЕФП ЪБРПЮОБФП ПФ C-f Й M-f (ДПВТЕ, <Delback> ОЕ Е ОБЙУФЙОБ -ЛПОФТПМЙТБЭ ЪОБЛ, ОП ОЕЛБ ОЕ УЕ ВЕЪРПЛПЙН ЪБ ФПЧБ). C-k Й M-k УБ -РПДПВОЙ ОБ C-e Й M-e Ч УНЙУЯМ, ЮЕ ЕДОЙФЕ УБ ЪБ ТЕДПЧЕ, Б ДТХЗЙФЕ ЪБ -ЙЪТЕЮЕОЙС. +Забележете, че <Delback> и C-d, сравнени с M-<Delback> и M-d, +разширяват подобието, започнато от C-f и M-f (добре, <Delback> не е +наистина контролиращ знак, но нека не се безпокоим за това). C-k и +M-k са подобни на C-e и M-e в смисъл, че едните са за редове, а +другите -- за изречения. -нПЦЕФЕ УЯЭП ДБ РТЕНБИОЕФЕ ЧУСЛБ ЮБУФ ПФ ВХЖЕТБ У ЕДЙО ХОЙЧЕТУБМЕО -ОБЮЙО. рТЙДЧЙЦЕФЕ УЕ ДП ЕДЙОЙС ЛТБК ОБ ЮБУФФБ Й ЧЯЧЕДЕФЕ C-@ ЙМЙ -C-ЙОФЕТЧБМ (ЛПЕФП Й ДБ Е ПФ ДЧЕФЕ). рТЙДЧЙЦЕФЕ УЕ ДП ДТХЗЙС ЛТБК ОБ -ЮБУФФБ Й ЧЯЧЕДЕФЕ C-w. фПЧБ ЭЕ РТЕНБИОЕ ГЕМЙС ФЕЛУФ НЕЦДХ ФЕЪЙ ДЧБ -ЛТБС. +Можете също да премахнете всяка част от буфера с един универсален +начин. Придвижете се до единия край на частта и въведете C-@ или +C-интервал (което и да е от двете). Придвижете се до другия край на +частта и въведете C-w. Това ще изреже целия текст между тези два +края. ->> рТЙДЧЙЦЕФЕ ЛХТУПТБ ДП ЪОБЛБ н Ч ОБЮБМПФП ОБ РТЕДЙЫОЙС БВЪБГ. ->> чЯЧЕДЕФЕ C-ЙОФЕТЧБМ. еНБЛУ ФТСВЧБ ДБ ЙЪЧЕДЕ УЯПВЭЕОЙЕ "Mark set" Ч - ДПМОЙС ЛТБК ОБ ЕЛТБОБ. ->> рТЙДЧЙЦЕФЕ ЛХТУПТБ ДП ВХЛЧБФБ Т Ч "ЛТБК", ОБ ЧФПТЙС ТЕД ПФ БВЪБГБ. ->> чЯЧЕДЕФЕ C-w. фПЧБ ЭЕ РТЕНБИОЕ ФЕЛУФБ ЪБРПЮЧБЭ ПФ н Й ЪБЧЯТЫЧБЭ - ФПЮОП РТЕДЙ Т. +>> Придвижете курсора до знака "М" в началото на предишния абзац. +>> Въведете C-интервал. Емакс трябва да изведе съобщение "Mark set" в + долния край на екрана. +>> Придвижете курсора до буквата "р" в "край" на втория ред от абзаца. +>> Въведете C-w. Това ще изреже текста, започващ от "М" и завършващ + точно преди "р". -тБЪМЙЛБФБ НЕЦДХ "РТЕНБИЧБОЕ" (killing) Й "ЙЪФТЙЧБОЕ" (deleting) Е, ЮЕ -"РТЕНБИОБФЙСФ" ФЕЛУФ НПЦЕ ДБ ЧНЯЛОБФ ОБОПЧП, ДПЛБФП "ЙЪФТЙФЙФЕ" ОЕЭБ -ОЕ НПЗБФ ДБ УЕ ЧНЯЛОБФ ОБОПЧП. чНЯЛЧБОЕФП ОБОПЧП ОБ РТЕНБИОБФ ФЕЛУФ -УЕ ОБТЙЮБ "ЙЪЧБЦДБОЕ" (yanking). пВЭП ЛБЪБОП, ЛПНБОДЙФЕ, ЛПЙФП -ПФУФТБОСЧБФ НОПЗП ФЕЛУФ, ЗП РТЕНБИЧБФ (ФБЛБ ЮЕ ФПК ДБ НПЦЕ ДБ ВЯДЕ -ЙЪЧБДЕО), ДПЛБФП ЛПНБОДЙФЕ, ЛПЙФП ПФУФТБОСЧБФ УБНП ЕДЙО ЪОБЛ ЙМЙ -ЙЪФТЙЧБФ УБНП РТБЪОЙ ТЕДПЧЕ Й ЪОБГЙ, ЙЪЧЯТЫЧБФ ЙЪФТЙЧБОЕ (ФБЛБ ЮЕ ОЕ -НПЦЕФЕ ДБ ЙЪЧБДЙФЕ ФПЪЙ ФЕЛУФ). +Разликата между "изрязване" (kill, cut) и "изтриване" (delete) е, че +"изрязаният" текст може да бъде вмъкнат наново, докато "изтритите" +неща не могат да се вмъкнат наново. Поставянето наново на изрязан +текст се нарича "вмъкване" (yank, paste). Общо казано, командите, +които отстраняват много текст, го изрязват (така че той да може да +бъде вмъкнат), докато командите, които отстраняват само един знак или +изтриват само празни редове и знаци, извършват изтриване (така че не +можете да вмъкнете наново този текст). ->> рТЙДЧЙЦЕФЕ ЛХТУПТБ ДП ОБЮБМПФП ОБ ТЕД, ЛПКФП ОЕ Е РТБЪЕО. фПЗБЧБ - ЧЯЧЕДЕФЕ C-k ЪБ ДБ РТЕНБИОЕФЕ ФЕЛУФБ ОБ ФПЪЙ ТЕД. ->> чЯЧЕДЕФЕ C-k ЧФПТЙ РЯФ. эЕ ЧЙДЙФЕ, ЮЕ ФПЧБ РТЕНБИЧБ ЪОБЛБ ЪБ ОПЧ - ТЕД, ЛПКФП УМЕДЧБ ТЕДБ. +>> Придвижете курсора до началото на ред, който не е празен. Тогава + въведете C-k, за да изрежете текста на този ред. +>> Въведете C-k втори път. Ще видите, че това изрязва знака за нов + ред, който следва реда. -ъБВЕМЕЦЕФЕ, ЮЕ ЕДЙОЙЮОП C-k РТЕНБИЧБ УЯДЯТЦБОЙЕФП ОБ ТЕДБ, Б -УМЕДЧБЭПФП C-k РТЕНБИЧБ ГЕМЙС ТЕД, Й РТБЧЙ ДТХЗЙФЕ ТЕДПЧЕ ДБ УЕ -РТЙДЧЙЦБФ ОБЗПТЕ. C-k ПВТБВПФЧБ ЮЙУМПЧЙФЕ БТЗХНЕОФЙ РП УРЕГЙБМЕО -ОБЮЙО: РТЕНБИЧБФ УЕ ФПМЛПЧБ ОБ ВТПК ТЕДПЧЕ й ФСИОПФП УЯДЯТЦБОЙЕ. фПЧБ -ОЕ Е РТПУФП РПЧФПТЕОЙЕ. C-u 2 C-k РТЕНБИЧБ ДЧБ ТЕДБ Й ФЕИОЙФЕ ЪОБГЙ -ЪБ ОПЧ ТЕД; ЧЯЧЕЦДБОЕФП ОБ C-k ДЧБ РЯФЙ ОЕ РТБЧЙ ФПЧБ. +Забележете, че единично C-k изрязва съдържанието на реда, а следващото +C-k изрязва целия ред и прави другите редове да се придвижат нагоре. +C-k обработва числовите аргументи по специален начин: премахват се +толкова на брой редове И тяхното съдържание. Това не е просто +повторение. C-u 2 C-k изрязва два реда и техните знаци за нов ред; +въвеждането на C-k два пъти не прави това. -чТЯЭБОЕФП ПВТБФОП ОБ ФЕЛУФ УЕ ОБТЙЮБ "ЙЪЧБЦДБОЕ". (нЙУМЕФЕ ЪБ ОЕЗП -ЛБФП ЪБ ЙЪЧБЦДБОЕ ПВТБФОП, ЙМЙ ДТЯРЧБОЕ ПВТБФОП, ОБ ФЕЛУФ, ЛПКФП Е ВЙМ -РТЕНБИОБФ.) нПЦЕФЕ ДБ ЙЪЧБЦДБФЕ РТЕНБИОБФЙС ФЕЛУФ ЙМЙ ОБ УЯЭПФП -НСУФП, ПФЛЯДЕФП Е ВЙМ РТЕНБИОБФ, ЙМЙ ОБ ДТХЗП НСУФП Ч ВХЖЕТБ, ДБЦЕ Й Ч -ТБЪМЙЮЕО ЖБКМ. нПЦЕФЕ ДБ ЙЪЧБЦДБФЕ ЕДЙО Й УЯЭ ФЕЛУФ ОСЛПМЛП РЯФЙ; -ФПЧБ РТБЧЙ ОСЛПМЛП ЛПРЙС ПФ ОЕЗП. +Връщането обратно на текст се нарича "вмъкване". (Мислете за него +като за изваждане обратно, или дръпване обратно, на текст, който е бил +изрязан.) Можете да вмъквате изрязания текст или на същото място, +откъдето е бил премахнат, или на друго място в буфера, даже и в +различен файл. Можете да вмъквате един и същ текст няколко пъти; това +прави няколко копия от него. -лПНБОДБФБ ЪБ ЙЪЧБЦДБОЕ Е C-y. фС ЧНЯЛЧБ ОБОПЧП РПУМЕДОЙС РТЕНБИОБФ -ФЕЛУФ Ч ФЕЛХЭПФП НСУФП ОБ ЛХТУПТБ. +Командата за вмъкване е C-y. Тя вмъква наново последния изрязан текст +в текущото място на курсора. ->> пРЙФБКФЕ ЗП: ЧЯЧЕДЕФЕ C-y ЪБ ДБ ЙЪЧЕДЕФЕ ФЕЛУФБ ПВТБФОП. +>> Опитайте го: въведете C-y, за да изведете текста обратно. -бЛП ОБРТБЧЙФЕ ОСЛПМЛП C-k Ч ТЕД, ЧУЙЮЛП ПФ РТЕНБИОБФЙС ФЕЛУФ УЕ -ЪБРБЪЧБ ЪБЕДОП, ФБЛБ ЮЕ ЕДОП C-y ЭЕ ЙЪЧБДЙ ЧУЙЮЛЙ ТЕДПЧЕ ОБЧЕДОЯЦ. +Ако направите няколко C-k в ред, всичко от изрязания текст се запазва +заедно, така че едно C-y ще извади всички редове наведнъж. ->> оБРТБЧЕФЕ ФПЧБ УЕЗБ, ЧЯЧЕДЕФЕ C-k ОСЛПМЛП РЯФЙ. +>> Направете това сега, въведете C-k няколко пъти. -уЕЗБ ЪБ ДБ ЙЪЛБТБФЕ РТЕНБИОБФЙС ФЕЛУФ: +Сега, за да изкарате изрязания текст: ->> чЯЧЕДЕФЕ C-y. уМЕД ФПЧБ РТЙДЧЙЦЕФЕ ЛХТУПТБ ОБДПМХ ОСЛПМЛП ТЕДБ Й - ЧЯЧЕДЕФЕ C-y ПФОПЧП. уЕЗБ ЧЙЦДБФЕ ЛБЛ ДБ ЛПРЙТБФЕ ОСЛБЛЯЧ ФЕЛУФ. +>> Въведете C-y. След това придвижете курсора надолу няколко реда и + въведете C-y отново. Сега виждате как да копирате някакъв текст. -лБЛЧП ДБ РТБЧЙФЕ БЛП ЙНБФЕ ОСЛБЛЯЧ ФЕЛУФ, ЛПКФП ЙУЛБФЕ ДБ ЙЪЧБДЙФЕ -ПВТБФОП, Й УМЕД ФПЧБ РТЕНБИОЕФЕ ОЕЭП ДТХЗП? C-y ЭЕ ЙЪЧБДЙ РПУМЕДОПФП -РТЕНБИЧБОЕ. оП РТЕДЙЫОЙСФ ФЕЛУФ ОЕ Е ЪБЗХВЕО. нПЦЕФЕ ДБ ЗП ЧЯТОЕФЕ -ПВТБФОП ЙЪРПМЪЧБКЛЙ ЛПНБОДБФБ M-y. уМЕД ЛБФП ЙЪРЯМОЙФЕ C-y ЪБ ДБ -ЧЪЕНЕФЕ РПУМЕДОПФП РТЕНБИЧБОЕ, ЧЯЧЕЦДБОЕФП ОБ M-y ЪБНЕОС ФПЪЙ ЙЪЧБДЕО -ФЕЛУФ У РТЕДЙЫОПФП РТЕНБИЧБОЕ. чЯЧЕЦДБОЕФП ОБ M-y ПФОПЧП Й ПФОПЧП -ЧТЯЭБ РП-ТБООЙ Й РП-ТБООЙ РТЕНБИЧБОЙС. лПЗБФП УФЙЗОЕФЕ ФЕЛУФБ, ЛПКФП -ФЯТУЙФЕ, ОЕ Е ОХЦОП ДБ РТБЧЙФЕ ОЙЭП РПЧЕЮЕ, ЪБ ДБ ЗП ЪБДЯТЦЙФЕ. -рТПУФП РТПДЯМЦЕФЕ У ТЕДБЛФЙТБОЕФП, ПУФБЧСКЛЙ ЙЪЧБДЕОЙС ФЕЛУФ ЛЯДЕФП УЙ -Е. +Какво да правите, ако имате някакъв текст, който искате да вмъкнете +обратно, и след това изрежете нещо друго? 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 положителни и + отрицателни числови аргументи. -* пфнсоб +* ОТМЯНА -------- -бЛП ОБРТБЧЙФЕ РТПНСОБ Ч ФЕЛУФБ Й УМЕД ФПЧБ ТЕЫЙФЕ, ЮЕ ФПЧБ Е ВЙМП -ЗТЕЫЛБ, ЧЙЕ НПЦЕФЕ ДБ ПФНЕОЙФЕ РТПНСОБФБ У ЛПНБОДБФБ ЪБ ПФНЕОСОЕ, C-x +Ако направите промяна в текста и след това решите, че това е било +грешка, вие можете да отмените промяната с командата за отменяне, C-x u. -пВЙЛОПЧЕОП, C-x u ПФНЕОС РТПНЕОЙФЕ ОБРТБЧЕОЙ ПФ ЕДОБ ЛПНБОДБ; БЛП -РПЧФБТСФЕ C-x u ОСЛПМЛП РЯФЙ РПУМЕДПЧБФЕМОП, ЧУСЛП РПЧФПТЕОЙЕ ПФНЕОС -ПЭЕ ЕДОБ ЛПНБОДБ. +Обикновено C-x u отменя промените, направени от една команда; ако +повтаряте C-x u няколко пъти последователно, всяко повторение отменя +още една команда. -оП ЙНБ ДЧЕ ЙЪЛМАЮЕОЙС: ЛПНБОДЙФЕ, ЛПЙФП ОЕ РТПНЕОСФ ФЕЛУФБ ОЕ УЕ ВТПСФ -(ФПЧБ ЧЛМАЮЧБ РТЙДЧЙЦЧБОЕФП ОБ ЛХТУПТБ Й УЛТПМЙТБЭЙФЕ ЛПНБОДЙ), Й -УБНПЧНЯЛЧБЭЙФЕ УЕ ЪОБГЙ ПВЙЛОПЧЕОП УЕ ПВТБВПФЧБФ ОБ ЗТХРЙ, ЧУСЛБ ДП 20 -ЪОБЛБ. (фПЧБ ОБНБМСЧБ ВТПС ОБ C-x u, ЛПЙФП ФТСВЧБ ДБ ЧЯЧЕДЕФЕ ЪБ ДБ -ПФНЕОЙФЕ ЧЯЧЕДЕО ФЕЛУФ.) +Но има две изключения: командите, които не променят текста, не се +броят (това включва придвижването на курсора и скролиращите команди), +и самовмъкващите се знаци обикновено се обработват на групи, всяка до +20 знака. (Това намалява броя на C-x u, които трябва да въведете, за +да отмените въведен текст.) ->> рТЕНБИОЕФЕ ФПЪЙ ТЕД У C-k, УМЕД ФПЧБ ЧЯЧЕДЕФЕ C-x u Й ФПК ФТСВЧБ ДБ - УЕ РПСЧЙ ПФОПЧП. +>> Изрежете този ред с C-k, след това въведете C-x u и той трябва да + се появи отново. -C-_ Е БМФЕТОБФЙЧОБ ПФНЕОСЭБ ЛПНБОДБ; ФС ТБВПФЙ ФПЮОП ЛБФП C-x u, ОП Е -РП-МЕУОБ ЪБ ЧЯЧЕЦДБОЕ ОСЛПМЛП РЯФЙ РПУМЕДПЧБФЕМОП. оЕДПУФБФЯЛЯФ ОБ -C_- Е, ЮЕ ОБ ОСЛПЙ ЛМБЧЙБФХТЙ ОЕ Е ПЮЕЧЙДОП ЛБЛ ФТСВЧБ ДБ УЕ ЧЯЧЕДЕ. -ъБФПЧБ ПУЙЗХТСЧБНЕ Й C-x u. оБ ОСЛПЙ ФЕТНЙОБМЙ НПЦЕ ДБ ЧЯЧЕДЕФЕ C-_ У -ЧЯЧЕЦДБОЕ ОБ / ДПЛБФП УФЕ ЪБДЯТЦБМЙ CONTROL. +C-_ е алтернативна отменяща команда; тя работи точно като C-x u, но е +по-лесна за въвеждане няколко пъти последователно. Недостатъкът на +C_- е, че на някои клавиатури не е очевидно как трябва да се въведе. +Затова осигуряваме и C-x u. На някои терминали може да въведете C-_ с +въвеждане на /, докато задържате CONTROL. -юЙУМПЧ БТЗХНЕОФ ЛЯН C-_ ЙМЙ C-x u ДЕКУФЧБ ЛБФП ВТПСЮ ОБ РПЧФПТЕОЙСФБ. +Числов аргумент към C-_ или C-x u действа като брояч на повторенията. -нПЦЕ ДБ ПФНЕОСФБ ЙЪФТЙЧБОЕ ОБ ФЕЛУФ ФПЮОП ЛБЛФП ПФНЕОСФЕ РТЕНБИЧБОЕ ОБ -ФЕЛУФ. тБЪМЙЮЙЕФП НЕЦДХ РТЕНБИЧБОЕФП ОБ ОЕЭП Й ЙЪФТЙЧБОЕФП НХ -ЧЯЪДЕКУФЧБ ДБМЙ ЭЕ НПЦЕ ДБ ЗП ЙЪЧБДЙФЕ У C-y; ЪБ ПФНЕОСОЕФП ОСНБ -ТБЪМЙЛБ НЕЦДХ ДЧБФБ ЧЙДБ. +Може да отменята изтриване на текст точно както отменяте изрязване на +текст. Различието между изрязването на нещо и изтриването му +въздейства дали ще може да го извадите с C-y; за отменянето няма +разлика между двата вида. -* жбкмпче +* ФАЙЛОВЕ --------- -ъБ ДБ ОБРТБЧЙФЕ ФЕЛУФБ, ЛПКФП ТЕДБЛФЙТБФЕ, РПУФПСОЕО, ФТСВЧБ ДБ ЗП -УМПЦЙФЕ ЧЯЧ ЖБКМ. ч РТПФЙЧЕО УМХЮБК ФПК ЭЕ ЙЪЮЕЪОЕ, ЛПЗБФП еНБЛУ -РТЙЛМАЮЙ. ъБ ДБ УМПЦЙФЕ ЧБЫЙС ФЕЛУФ ЧЯЧ ЖБКМ, ФТСВЧБ ДБ "ОБНЕТЙФЕ" -ЖБКМБ РТЕДЙ ДБ ЧЯЧЕЦДБФЕ ФЕЛУФБ. (фПЧБ УЯЭП УЕ ОБТЙЮБ "РПУЕЭБЧБОЕ" ОБ -ЖБКМБ.) +За да направите текста, който редактирате, постоянен, трябва да го +сложите във файл. В противен случай той ще изчезне, когато Емакс +приключи. За да сложите вашия текст във файл, трябва да "намерите" +файла преди да въвеждате текст. (Това също се нарича "посещаване" на +файла.) -оБНЙТБОЕ ОБ ЖБКМ ПЪОБЮБЧБ, ЮЕ ЧЙЦДБФЕ УЯДЯТЦБОЙЕФП НХ Ч еНБЛУ. ч -НОПЗП УМХЮБЙ ФПЧБ Е ЛБФП ДБ ТЕДБЛФЙТБФЕ УБНЙС ЖБКМ. пВБЮЕ, РТПНЕОЙФЕ, -ЛПЙФП РТБЧЙФЕ ЙЪРПМЪЧБКЛЙ еНБЛУ, ОЕ ПУФБЧБФ РПУФПСООЙ ДПЛБФП ОЕ -"ЪБРЙЫЕФЕ" ЖБКМБ. фПЧБ Е ФБЛБ ЪБ ДБ УЕ РТЕДПФЧТБФЙ ПУФБЧСОЕФП ОБ -РПМХРТПНЕОЕО ЖБКМ Ч УЙУФЕНБФБ, ЛПЗБФП ОЕ ЙУЛБФЕ ФПЧБ. дПТЙ ЛПЗБФП -ЪБРЙУЧБФЕ, еНБЛУ ПУФБЧС ОБЮБМОЙС ЖБКМ РПД РТПНЕОЕОП ЙНЕ Ч УМХЮБК, ЮЕ -РП-ЛЯУОП ТЕЫЙФЕ, ЮЕ ЧБЫЙФЕ РТПНЕОЙ УБ ВЙМЙ ЗТЕЫЛБ. +Намиране на файл означава, че виждате съдържанието му в Емакс. В +много случаи това е като да редактирате самия файл. Обаче промените, +които правите, използвайки Емакс, не остават постоянни, докато не +"запишете" файла. Това е така, за да се предотврати оставянето на +полупроменен файл в системата, когато не искате това. Дори когато +записвате, Емакс оставя началния файл под променено име, в случай, че +по-късно решите, че вашите промени са били грешка. -бЛП РПЗМЕДОЕФЕ Ч ДЯОПФП ОБ ЕЛТБОБ ЭЕ ЧЙДЙФЕ ТЕД, ЛПКФП ЪБРПЮЧБ Й -ЪБЧЯТЫЧБ У ФЙТЕФБ Й ЪБРПЮЧБ У "--:-- TUTORIAL" ЙМЙ ОЕЭП РПДПВОП. фБЪЙ -ЮБУФ ПФ ЕЛТБОБ РПЛБЪЧБ ЙНЕФП ОБ ЖБКМБ, ЛПКФП УФЕ РПУЕФЙМЙ. фПЮОП УЕЗБ -ЧЙЕ УФЕ РПУЕФЙМЙ ЖБКМ ОБТЕЮЕО "TUTORIAL", ЛПКФП Е ЧБЫЕФП МЙЮОП -ЛПРЙЕ-ЮЕТОПЧБ ОБ еНБЛУ ЧЯЧЕДЕОЙЕФП. лПЗБФП ОБНЕТЙФЕ ЖБКМ Ч еНБЛУ, -ЙНЕФП ОБ ФПЪЙ ЖБКМ ЭЕ УЕ РПСЧЙ ОБ УЯЭПФП НСУФП. +Ако погледнете в дъното на екрана, ще видите ред, който започва и +завършва с тирета и започва с "-R:-- TUTORIAL.bg" или нещо подобно. +Тази част от екрана показва името на файла, който сте посетили. Точно +сега вие сте посетили файл, наречен "TUTORIAL.bg", който е вашето +лично копие-чернова на Емакс въведението. Когато намерите файл в +Емакс, името на този файл ще се появи на същото място. -пУПВЕОПУФ ЛПНБОДБФБ ЪБ ОБНЙТБОЕ ОБ ЖБКМ Е, ЮЕ ФТСВЧБ ДБ ЛБЦЕФЕ ЙНЕФП -ОБ ЖБКМБ, ЛПКФП ЙУЛБФЕ. оЙЕ ЗП ОБТЙЮБНЕ "ЮЕФЕОЕ ОБ БТЗХНЕОФ ПФ -ФЕТНЙОБМБ" (Ч ФПЪЙ УМХЮБК БТЗХНЕОФЯФ Е ЙНЕФП ОБ ЖБКМБ). уМЕД ЛБФП -ЧЯЧЕДЕФЕ ЛПНБОДБФБ +Особеност на командата за намиране на файл е, че трябва да кажете +името на файла, който искате. Ние го наричаме "четене на аргумент от +терминала" (в този случай аргументът е името на файла). След като +въведете командата - C-x C-f оБНЙТБОЕ ОБ ЖБКМ + C-x C-f Намиране на файл -еНБЛУ ЧЙ РПДЛБОС ДБ ЧЯЧЕДЕФЕ ЙНЕФП ОБ ЖБКМБ. йНЕФП ОБ ЖБКМБ, ЛПЕФП -ОБРЙЫЕФЕ, УЕ РПСЧСЧБ Ч ДЯОПФП ОБ ЕЛТБОБ. тЕДЯФ Ч ДЯОПФП ОБ ЕЛТБОБ УЕ -ОБТЙЮБ НЙОЙВХЖЕТ, ЛПЗБФП УЕ ЙЪРПМЪЧБ ЪБ ФПЪЙ ЧЙД ЧИПД. нПЦЕФЕ ДБ -ЙЪРПМЪЧБФЕ ПВЙЛОПЧЕОЙФЕ ЛПНБОДЙ ЪБ ТЕДБЛФЙТБОЕ ОБ еНБЛУ ЪБ ДБ -ТЕДБЛФЙТБФЕ ЙНЕФП ОБ ЖБКМБ. +Емакс ви подканя да въведете името на файла. Името на файла, което +напишете, се появява в дъното на екрана. Редът в дъното на екрана се +нарича минибуфер, когато се използва за този вид вход. Можете да +използвате обикновените команди за редактиране на Емакс, за да +редактирате името на файла. -лПЗБФП ЧЯЧЕЦДБФЕ ЙНЕФП ОБ ЖБКМБ (ЙМЙ ЛБЛЯЧФП Й ДБ Е ЧИПД Ч -НЙОЙВХЖЕТБ), НПЦЕФЕ ДБ РТЕЛТБФЙФЕ ЛПНБОДБФБ У 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 Запазване на файла -фПЧБ ЛПРЙТБ ФЕЛУФБ ПФ еНБЛУ ЧЯЧ ЖБКМБ. рЯТЧЙСФ РЯФ, ЛПЗБФП ФПЧБ УЕ -ОБРТБЧЙ, еНБЛУ РТЕЙНЕОХЧБ ОБЮБМОЙС ЖБКМ У ОПЧП ЙНЕ, ФБЛБ ЮЕ ФПК ДБ ОЕ -УЕ ЙЪЗХВЙ. оПЧПФП ЙНЕ УЕ РПУФТПСЧБ У ДПВБЧСОЕ ОБ "~" Ч ЛТБС ОБ ЙНЕФП -ОБ ОБЮБМОЙС ЖБКМ. +Това копира текста от Емакс във файла. Първия път, когато това се +направи, Емакс преименува началния файл с ново име, така че той да не +се изгуби. Новото име се построява с добавяне на "~" в края на името +на началния файл. -лПЗБФП ЪБРБЪЧБОЕФП Е УЧЯТЫЙМП, еНБЛУ ЙЪЧЕЦДБ ЙНЕФП ОБ ЖБКМБ, ЛПКФП Е -ВЙМ ЪБРЙУБО. фТСВЧБ ДБ ЪБРЙУЧБФЕ ДПУФБФЯЮОП ЮЕУФП, ФБЛБ ЮЕ ДБ ОЕ -ЙЪЗХВЙФЕ НОПЗП ТБВПФБ БЛП УЙУФЕНБФБ УЕ УТЙОЕ. +Когато запазването е свършило, Емакс извежда името на файла, който е +бил записан. Трябва да записвате достатъчно често, така че да не +изгубите много работа, ако системата се срине по някаква причина. ->> чЯЧЕДЕФЕ C-x C-s, ЪБРБЪЧБКЛЙ ЧБЫЕФП ЛПРЙЕ ПФ ЧЯЧЕДЕОЙЕФП. - фПЧБ ФТСВЧБ ДБ ЙЪЧЕДЕ "Wrote ...TUTORIAL" Ч ДЯОПФП ОБ ЕЛТБОБ. +>> Въведете C-x C-s, запазвайки вашето копие от въведението. + Това трябва да изведе "Wrote ...TUTORIAL.bg" в дъното на екрана. -ъбвемецлб: оБ ОСЛПЙ УЙУФЕНЙ ЧЯЧЕЦДБОЕФП ОБ C-x C-s ЭЕ ЪБНТЯЪЙ ЕЛТБОБ Й -ЧЙЕ ОСНБ ДБ ЧЙЦДБФЕ РПЧЕЮЕ ЙЪИПД ПФ еНБЛУ. фПЧБ РПЛБЪЧБ, ЮЕ ЕДОБ -"УРПУПВОПУФ" ОБ ПРЕТБГЙПООБФБ УЙУФЕНБ ОБТЙЮБОБ "ХРТБЧМЕОЙЕ ОБ РПФПЛБ" -(flow control) Е РТЙИЧБОБМБ C-s Й ОЕ ЗП РТПРХУЛБ ЛЯН еНБЛУ. ъБ ДБ -ТБЪНТБЪЙФЕ ЕЛТБОБ, ЧЯЧЕДЕФЕ C-q. фПЗБЧБ ЧЙЦФЕ УЕЛГЙСФБ "уРПОФБООП -ЧЛМАЮЧБОЕ ОБ РПУФЯРЛПЧП ФЯТУЕОЕ" (Spontaneous Entry to Incremental -Search) Ч ТЯЛПЧПДУФЧПФП ОБ еНБЛУ ЪБ УЯЧЕФ ЛБЛ ДБ УЕ УРТБЧЙФЕ У ФБЪЙ -"УРПУПВОПУФ". +ЗАБЕЛЕЖКА: На някои системи въвеждането на C-x C-s ще замръзи екрана и +вие няма да виждате повече изход от Емакс. Това показва, че една +"способност" на операционната система, наричана "управление на потока" +(flow control), е прихванала C-s и не го пропуска към Емакс. За да +размразите екрана, въведете C-q. Тогава вижте секцията "Спонтанно +включване на постъпково търсене" (Spontaneous Entry to Incremental +Search) в ръководството на Емакс за съвет как да се справите с тази +"способност". -нПЦЕ ДБ ОБНЕТЙФЕ УЯЭЕУФЧХЧБЭ ЖБКМ, ДБ ЗП ТБЪЗМЕДБФЕ Й ДБ ЗП -ТЕДБЛФЙТБФЕ. нПЦЕФЕ УЯЭП ДБ ОБНЕТЙФЕ ЖБКМ, ЛПКФП ОЕ УЯЭЕУФЧХЧБ. фПЧБ -Е ОБЮЙОЯФ ЪБ УЯЪДБЧБОЕ ОБ ОПЧЙ ЖБКМПЧЕ Ч еНБЛУ: ОБНЙТБФЕ ЖБКМБ, ЛПКФП -ЭЕ ВЯДЕ Ч ОБЮБМПФП РТБЪЕО, Й ФПЗБЧБ ЪБРПЮЧБФЕ ЧНЯЛЧБОЕФП ОБ ФЕЛУФБ ЪБ -ЖБКМБ. лПЗБФП ЗПЧПТЙФЕ ЪБ "ЪБРЙУЧБОЕ" ОБ ЖБКМБ, еНБЛУ ЧУЯЭОПУФ ЭЕ -УЯЪДБДЕ ЖБКМБ У ФЕЛУФБ, ЛПКФП УФЕ ЧЯЧЕМЙ. пФ ФБН ОБФБФЯЛ НПЦЕ ДБ -УЮЙФБФЕ, ЮЕ ТЕДБЛФЙТБФЕ ЧЕЮЕ УЯЭЕУФЧХЧБЭ ЖБКМ. +Може да намерите съществуващ файл, да го разгледате и да го +редактирате. Можете също да намерите файл, който не съществува. Това +е начинът за създаване на нови файлове в Емакс: намирате файла, който +ще бъде в началото празен, и тогава започвате вмъкването на текста за +файла. Когато говорите за "записване" на файл, Емакс всъщност ще +създаде файла с текста, който сте въвели. Оттам нататък може да +считате, че редактирате вече съществуващ файл. -* вхжетй +* БУФЕРИ -------- -бЛП ОБНЕТЙФЕ ЧФПТЙ ЖБКМ У C-x C-f, РЯТЧЙСФ ЖБКМ ПУФБЧБ Ч еНБЛУ. -нПЦЕФЕ ДБ РТЕЧЛМАЮЙФЕ ПВТБФОП ЛЯН ОЕЗП ЛБФП ЗП ОБНЕТЙФЕ РБЛ У C-x -C-f. рП ФПЪЙ ОБЮЙО НПЦЕ ДБ РПМХЮЙФЕ ДПУФБ ОБ ВТПК ЖБКМПЧЕ Ч еНБЛУ. +Ако намерите втори файл с C-x C-f, първият файл остава в Емакс. +Можете да превключите обратно към него, като го намерите пак с C-x +C-f. По този начин може да получите доста на брой файлове в Емакс. ->> уЯЪДБКФЕ ЖБКМ У ЙНЕ "foo" ЧЯЧЕЦДБКЛЙ C-x C-f foo <Return>. - чНЯЛОЕФЕ НБМЛП ФЕЛУФ, ТЕДБЛФЙТБКФЕ ЗП Й ЗП ЪБРБЪЕФЕ "foo" У - ЧЯЧЕЦДБОЕ ОБ C-x C-s. - оБЛТБС ЧЯЧЕДЕФЕ C-x C-f TUTORIAL <Return> ЪБ ДБ УЕ ЧЯТОЕФЕ ПВТБФОП - ЧЯЧ ЧЯЧЕДЕОЙЕФП. +>> Създайте файл с име "foo", въвеждайки C-x C-f foo <Return>. + Вмъкнете малко текст, редактирайте го и запазете "foo" с въвеждане + на C-x C-s. + Накрая въведете C-x C-f TUTORIAL.bg <Return>, за да се върнете + обратно във въведението. -еНБЛУ ЪБРБЪЧБ ФЕЛУФБ ОБ ЧУЕЛЙ ЖБКМ Ч ПВЕЛФ ОБТЙЮБО "ВХЖЕТ". -оБНЙТБОЕФП ОБ ЖБКМ РТБЧЙ ОПЧ ВХЖЕТ Ч еНБЛУ. ъБ ДБ ЧЙДЙФЕ УРЙУЯЛ ОБ -ВХЖЕТЙФЕ, ЛПЙФП Ч НПНЕОФБ УЯЭЕУФЧХЧБФ ЧЯЧ ЧБЫЙС еНБЛУ, ЧЯЧЕДЕФЕ +Емакс запазва текста на всеки файл в обект, наричан "буфер". +Намирането на файл прави нов буфер в Емакс. За да видите списък на +буферите, които в момента съществуват във вашия Емакс, въведете - C-x C-b рПЛБЪЧБОЕ ОБ ВХЖЕТЙФЕ + C-x C-b Показване на буферите ->> пРЙФБКФЕ C-x C-b УЕЗБ. +>> Опитайте C-x C-b сега. -чЙЦФЕ ЛБЛ ЧУЕЛЙ ВХЖЕТ ЙНБ ЙНЕ, Б РПОСЛПЗБ Й ЙНЕ ОБ ЖБКМ ЪБ ЖБКМБ, -ЮЙЕФП УЯДЯТЦБОЙЕ ДЯТЦЙ. чуелй ФЕЛУФ, ЛПКФП ЧЙЦДБФЕ Ч еНБЛУ РТПЪПТЕГ, -Е ЧЙОБЗЙ ЮБУФ ПФ ОСЛБЛЯЧ ВХЖЕТ. +Вижте как всеки буфер има име, а понякога и име на файл за файла, +чието съдържание държи. ВСЕКИ текст, който виждате в Емакс прозорец, +е винаги част от някакъв буфер. ->> чЯЧЕДЕФЕ 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", - ЛПКФП ДЯТЦЙ ФЕЛУФБ ОБ ЖБКМБ "foo". фПЗБЧБ ЧЯЧЕДЕФЕ C-x b TUTORIAL - <Return> ЪБ ДБ УЕ ЧЯТОЕФЕ Ч ФПЧБ ЧЯЧЕДЕОЙЕ. +>> Въведете C-x b foo <Return>, за да се върнете към буфера "foo", + който държи текста на файла "foo". Тогава въведете C-x b TUTORIAL + <Return>, за да се върнете в това въведение. -ч РПЧЕЮЕФП УМХЮБЙ ЙНЕФП ОБ ВХЖЕТБ Е УЯЭПФП ЛБФП ЙНЕФП ОБ ЖБКМБ (ВЕЪ -ЮБУФФБ Ч ЛПС ДЙТЕЛФПТЙС УЕ ОБНЙТБ). пВБЮЕ ФПЧБ ОЕ ЧЙОБЗЙ Е ЧСТОП. -уРЙУЯЛЯФ У ВХЖЕТЙФЕ, ЛПКФП РТБЧЙФЕ У C-x C-b, ЧЙОБЗЙ ЧЙ РПЛБЪЧБ ЙНЕФП -ОБ ЧУЕЛЙ ВХЖЕТ. +В повечето случаи името на буфера е същото като името на файла (без +частта в коя директория се намира). Обаче това не винаги е вярно. +Списъкът с буферите, който правите с C-x C-b, винаги ви показва името +на всеки буфер. -чуелй ФЕЛУФ, ЛПКФП ЧЙЦДБФЕ Ч еНБЛУ РТПЪПТЕГ, Е ЧЙОБЗЙ ЮБУФ ПФ ОСЛБЛЯЧ -ВХЖЕТ. оСЛПЙ ВХЖЕТЙ ОЕ УЯПФЧЕФУФЧБФ ОБ ЖБКМПЧЕ. оБРТЙНЕТ, ВХЖЕТЯФ -ЙНЕОХЧБО "*Buffer List*" ОЕ УЯПФЧЕФУФЧБ ОБ ЖБКМ. фПЧБ Е ВХЖЕТЯФ, -ЛПКФП УЯДЯТЦБ УРЙУЯЛБ У ВХЖЕТЙФЕ, ЛПЙФП УФЕ ОБРТБЧЙМЙ У C-x C-b. -вХЖЕТЯФ ЙНЕОХЧБО "*Messages*" УЯЭП ОЕ УЯПФЧЕФУФЧБ ОБ ЖБКМ; ФПК УЯДЯТЦБ -УЯПВЭЕОЙСФБ, ЛПЙФП УЕ РПСЧБЧБФ Ч ДЯОПФП ОБ ЕЛТБОБ РП ЧТЕНЕ ОБ еНБЛУ -УЕУЙСФБ. +ВСЕКИ текст, който виждате в Емакс прозорец, е винаги част от някакъв +буфер. Някои буфери не съответстват на файлове. Например буферът, +именуван "*Buffer List*", не съответства на файл. Това е буферът, +който съдържа списъка с буферите, които сте направили с C-x C-b. +Буферът, именуван "*Messages*", също не съответства на файл; той +съдържа съобщенията, които се появяват в дъното на екрана по време на +Емакс сесията. ->> чЯЧЕДЕФЕ C-x b *Messages* <Return> ЪБ ДБ ЧЙДЙФЕ ВХЖЕТБ УЯУ - УЯПВЭЕОЙСФБ. уМЕД ФПЧБ ЧЯЧЕДЕФЕ C-x C-b TUTORIAL <Return> ЪБ ДБ УЕ - ЧЯТОЕФЕ ЛЯН ФПЧБ ЧЯЧЕДЕОЙЕ. +>> Въведете C-x b *Messages* <Return>, за да видите буфера със + съобщенията. След това въведете C-x C-b TUTORIAL <Return>, за да + се върнете към това въведение. -бЛП ОБРТБЧЙФЕ РТПНЕОЙ Ч ФЕЛУФБ ОБ ЕДЙО ЖБКМ, Й ФПЗБЧБ ОБНЕТЙФЕ ДТХЗ -ЖБКМ, ФПЧБ ОСНБ ДБ ЪБРЙЫЕ РЯТЧЙС ЖБКМ. оЕЗПЧЙФЕ РТПНЕОЙ ПУФБЧБФ ЧЯФТЕ -Ч еНБЛУ, Ч ВХЖЕТБ ОБ ЖБКМБ. уЯЪДБЧБОЕФП ЙМЙ ТЕДБЛФЙТБОЕФП ОБ ВХЖЕТБ -ОБ ЧФПТЙС ЖБКМ ОСНБ ЕЖЕЛФ ЧЯТИХ ВХЖЕТБ ОБ РЯТЧЙС ЖБКМ. фПЧБ Е НОПЗП -РПМЕЪОП, ОП УЯЭП ПЪОБЮБЧБ, ЮЕ УЕ ОХЦДБЕФЕ ПФ ХДПВЕО ОБЮЙО ДБ ЪБРБЪЙФЕ -ВХЖЕТБ ОБ РЯТЧЙС ЖБКМ. эЕ Е ОЕХДПВОП ДБ РТЕЧЛМАЮЙФЕ ПВТБФОП У C-x C-f -ЪБ ДБ ЗП ЪБРБЪЙФЕ У C-x C-s. фБЛБ ЮЕ ЙНБНЕ +Ако направите промени в текста на един файл и тогава намерите друг +файл, това няма да запише първия файл. Неговите промени остават вътре +в Емакс, в буфера на файла. Създаването или редактирането на буфера +на втория файл няма ефект върху буфера на първия файл. Това е много +полезно, но също означава, че се нуждаете от удобен начин да запазите +буфера на първия файл. Ще е неудобно да превключите обратно с C-x +C-f, за да го запазите с C-x C-s. Така че имаме - C-x s ъБРБЪЧБ ОСЛПЙ ВХЖЕТЙ + C-x s Запазва някои буфери -C-x s РЙФБ ЪБ ЧУЕЛЙ ВХЖЕТ, ЛПКФП УЯДЯТЦБ РТПНЕОЙ, ЛПЙФП ОЕ УФЕ -ЪБРБЪЙМЙ. чЯРТПУЯФ ЪБ ЧУЕЛЙ ФБЛЯЧ ВХЖЕТ Е ДБМЙ ДБ ВЯДЕ ЪБРБЪЕО. +C-x s пита за всеки буфер, който съдържа промени, които не сте +запазили. Въпросът за всеки такъв буфер е дали да бъде запазен. ->> чНЯЛОЕФЕ ТЕД Ч ФЕЛУФБ, УМЕД ФПЧБ ЧЯЧЕДЕФЕ C-x s. - фТСВЧБ ДБ ВЯДЕФЕ РПРЙФБО ДБМЙ ДБ ЪБРБЪЙФЕ ВХЖЕТБ ЙНЕОХЧБО TUTORIAL. - пФЗПЧПТЕФЕ У ДБ ОБ ЧЯРТПУБ ЛБФП ЧЯЧЕДЕФЕ "y". +>> Вмъкнете ред в текста, след това въведете C-x s. + Трябва да бъдете попитан дали да запазите буфера, именуван "TUTORIAL". + Отговорете с "да" на въпроса, като въведете "y". -* тбъыйтсчбое об обвптб лпнбодй +* РАЗШИРЯВАНЕ НА НАБОРА КОМАНДИ ------------------------------- -йНБ НОПЗП, НОПЗП РПЧЕЮЕ ЛПНБОДЙ ОБ еНБЛУ, ПФЛПМЛПФП НПЗБФ ДБ УЕ УМПЦБФ -НБ ЧУЙЮЛЙ ЛПОФТПМОЙ Й НЕФБ ЪОБГЙ. еНБЛУ ЪБПВЙЛБМС ФПЧБ У X (eXtended) -ЛПНБОДБФБ. фПЧБ УФБЧБ РП ДЧБ ОБЮЙОБ: +Има много, много повече команди на Емакс, отколкото могат да се сложат +на всички контролни и мета знаци. Емакс заобикаля това с X (eXtended) +командата. Това става по два начина: - C-x ъОБЛПЧП ТБЪЫЙТСЧБОЕ. рПУМЕДЧБОП ПФ ЕДЙО ЪОБЛ. - M-x тБЪЫЙТСЧБОЕ У ЙНЕОХЧБОБ ЛПНБОДБ. рПУМЕДЧБОП ПФ ДЯМЗП - ЙНЕ. + C-x Знаково разширяване. Последвано от един знак. + M-x Разширяване с именувана команда. Последвано от дълго + име. -фЕЪЙ ЛПНБОДЙ УБ ПВЭП ЧЪЕФП РПМЕЪОЙ, ОП РП-НБМЛП ПФЛПМЛПФП ЛПНБОДЙФЕ, -ЛПЙФП ДПУЕЗБ УФЕ ОБХЮЙМЙ. чЕЮЕ ЧЙДСИФЕ ДЧЕ ПФ ФСИ: ЛПНБОДЙФЕ ЧЯТИХ -ЖБКМПЧЕ C-x C-f ЪБ ОБНЙТБОЕ (Find) Й C-x C-s ЪБ ЪБРБЪЧБОЕ (Save). -дТХЗ РТЙНЕТ Е ЛПНБОДБФБ ЪБ ЛТБК ОБ еНБЛУ УЕУЙСФБ -- ФПЧБ Е ЛПНБОДБФБ -C-x C-c. (оЕ УЕ ВЕЪРПЛПКФЕ, ЮЕ НПЦЕ ДБ ЙЪЗХВЙФЕ ЧУЙЮЛЙ РТПНЕОЙ, ЛПЙФП -УФЕ ОБРТБЧЙМЙ; C-x C-c РТЕДМБЗБ ДБ ЪБРБЪЙ ЧУЕЛЙ РТПНЕОЕО ЖБКМ РТЕДЙ ДБ -РТЕНБИОЕ еНБЛУ.) +Тези команди са общо взето полезни, но по-малко, отколкото командите, +които досега сте научили. Вече видяхте две от тях: командите върху +файлове C-x C-f за намиране (Find) и C-x C-s за запазване (Save). +Друг пример е командата за край на Емакс сесията -- това е командата +C-x C-c. (Не се безпокойте, че може да изгубите всички промени, които +сте направили; C-x C-c предлага да запази всеки променен файл, преди +да премахне Емакс.) -C-z Е ЛПНБОДБФБ ЪБ ЙЪМЙЪБОЕ ПФ еНБЛУ *ЧТЕНЕООП* -- ФБЛБ ЮЕ ДБ НПЦЕФЕ -ДБ УЕ ЧЯТОЕФЕ ЛЯН УЯЭБФБ еНБЛУ УЕУЙС РП-ЛЯУОП. +C-z е командата за излизане от Емакс *временно* -- така че да можете +да се върнете към същата Емакс сесия по-късно. -оБ УЙУФЕНЙ, ЛПЙФП РПЪЧПМСЧБФ ФПЧБ, C-z "ЙЪПУФБЧС" (suspend) еНБЛУ, -Ф.Е. ЧТЯЭБ ЛЯН ПВЧЙЧЛБФБ, ОП ОЕ ТБЪТХЫБЧБ еНБЛУ. ч РПЧЕЮЕФП ПВЧЙЧЛЙ -НПЦЕФЕ ДБ РТПДЯМЦЙФЕ еНБЛУ УЕУЙСФБ У ЛПНБОДБФБ `fg' ЙМЙ У `%emacs'. +На системи, които позволяват това, C-z "изоставя" (suspend) Емакс, +т.е. връща към обвивката, но не разрушава Емакс. В повечето обвивки +можете да продължите Емакс сесията с командата "fg" или с "%emacs". -оБ УЙУФЕНЙ, ЛПЙФП ОЕ РПЪЧПМСЧБФ ЙЪПУФБЧСОЕ, C-z УЯЪДБЧБ ОПЧБ -РПДПВЧЙЧЛБ, ЛПСФП ЧЯТЧЙ РПД еНБЛУ, ЪБ ДБ ЧЙ ДБДЕ ЫБОУ ДБ УФБТФЙТБФЕ -ДТХЗЙ РТПЗТБНЙ Й ДБ УЕ ЧЯТОЕФЕ ЛЯН еНБЛУ УМЕД ФПЧБ; ФПЧБ ОЕ Е ЙУФЙОУЛП -"ЙЪМЙЪБОЕ" ПФ еНБЛУ. ч ФПЪЙ УМХЮБК ЛПНБОДБФБ ОБ ПВЧЙЧЛБФБ `exit' Е -ПВЙЛОПЧЕОЙСФ ОБЮЙО ДБ УЕ ЧЯТОЕФЕ ПВТБФОП ЛЯН еНБЛУ ПФ РПДПВЧЙЧЛБФБ. +На системи, които не позволяват изоставяне, C-z създава нова +подобвивка, която върви под Емакс, за да ви даде шанс да стартирате +други програми и да се върнете към Емакс след това; това не е истинско +"излизане" от Емакс. В този случай командата на обвивката "exit" е +обикновеният начин да се върнете обратно към Емакс от подобвивката. -нПНЕОФЯФ ДБ ЙЪРПМЪЧБФЕ C-x C-c Е, ЛПЗБФП ЙУЛБФЕ ДБ ЙЪМЕЪЕФЕ ПФ -УЙУФЕНБФБ. фПЧБ Е Й РТБЧЙМОБФБ ЛПНБОДБ ЪБ ЙЪМЙЪБОЕ, ЛПЗБФП еНБЛУ Е -ЙЪЧЙЛБО ПФ РПЭЕОУЛБ РТПЗТБНБ ЙМЙ ДТХЗЙ УФТБОЙЮОЙ РТПЗТБНЙ, ФЯК ЛБФП ФЕ -НПЦЕ Й ДБ ОЕ ЪОБСФ ЛБЛ ДБ УЕ УРТБЧСФ У ЙЪПУФБЧСОЕФП ОБ еНБЛУ. рТЙ -ПВЙЛОПЧЕОЙ ПВУФПСФЕМУФЧБ, ПВБЮЕ, БЛП ОЕ УФЕ ФТЯЗОБМЙ ДБ ЙЪМЙЪБФЕ ПФ -УЙУФЕНБФБ, РП-ДПВТЕ Е ДБ ЙЪПУФБЧЙФЕ еНБЛУ У C-z ЧНЕУФП ДБ ЙЪМЙЪБФЕ ПФ -еНБЛУ. +Моментът да използвате C-x C-c е, когато искате да излезете от +системата. Това е и правилната команда за излизане, когато Емакс е +извикан от пощенска програма или други странични програми, тъй като те +може и да не знаят как да се справят с изоставянето на Емакс. При +обикновени обстоятелства, обаче, ако не сте тръгнали да излизате от +системата, по-добре е да изоставите Емакс с C-z, вместо да излизате от +Емакс. -йНБ НОПЗП ЛПНБОДЙ C-x. еФП УРЙУЯЛ ОБ ФЕЪЙ, ЛПЙФП УФЕ ОБХЮЙМЙ: +Има много команди C-x. Ето списък на тези, които сте научили: - C-x C-f оБНЙТБОЕ ОБ ЖБКМ. - C-x C-s ъБРБЪЧБОЕ ОБ ЖБКМ. - C-x C-b уРЙУЯЛ ОБ ВХЖЕТЙФЕ. - C-x C-c йЪМЙЪБОЕ ПФ еНБЛУ. - C-x 1 йЪФТЙЧБОЕ ОБ ЧУЙЮЛЙ РТПЪПТГЙ ПУЧЕО ЕДЙО. - C-x u пФНСОБ. + C-x C-f Намиране на файл. + C-x C-s Запазване на файл. + C-x C-b Списък на буферите. + C-x C-c Излизане от Емакс. + C-x 1 Изтриване на всички прозорци освен един. + C-x u Отмяна. -йНЕОХЧБОЙФЕ ТБЪЫЙТЕОЙ ЛПНБОДЙ УБ ЛПНБОДЙ, ЛПЙФП УЕ ЙЪРПМЪЧБФ ДБЦЕ ПЭЕ -РП-ТСДЛП, ЙМЙ ЛПНБОДЙ, ЛПЙФП УЕ ЙЪРПМЪЧБФ УБНП Ч ПРТЕДЕМЕОЙ ТЕЦЙНЙ. -рТЙНЕТ Е ЛПНБОДБФБ replace-string, ЛПСФП ЪБНЕОС ЗМПВБМОП ЕДЙО ОЙЪ У -ДТХЗ. лПЗБФП ЧЯЧЕДЕФЕ M-x, еНБЛУ ЧЙ РПДУЛБЪЧБ Ч ДЯОПФП ОБ ЕЛТБОБ У -M-x Й ЧЙЕ ФТСВЧБ ДБ ЧЯЧЕДЕФЕ ЙНЕФП ОБ ЛПНБОДБФБ, Ч ФПЪЙ УМХЮБК -"replace-string". рТПУФП ЧЯЧЕДЕФЕ "repl s<TAB>" Й еНБЛУ ЭЕ ЪБЧЯТЫЙ -ЙНЕФП. (<TAB> Е ЛМБЧЙЫЯФ Tab, ПВЙЛОПЧЕОП ОБНЙТБЭ УЕ ОБД ЛМБЧЙЫБ -CapsLock ЙМЙ ЛМБЧЙЫБ Shift ВМЙЪП ДП МЕЧЙС ЛТБК ОБ ЛМБЧЙБФХТБФБ.) -ъБЧЯТЫЕФЕ ЙНЕФП ОБ ЛПНБОДБФБ У <Return>. +Именуваните разширени команди са команди, които се използват даже още +по-рядко, или команди, които се използват само в определени режими. +Пример е командата replace-string, която заменя глобално един низ с +друг. Когато въведете M-x, Емакс ви подсказва в дъното на екрана с +M-x и вие трябва да въведете името на командата, в този случай +"replace-string". Просто въведете "repl s<TAB>" и Емакс ще завърши +името. (<TAB> е клавишът Tab, обикновено намиращ се над клавиша +CapsLock или клавиша Shift близо до левия край на клавиатурата.) +Завършете името на командата с <Return>. -лПНБОДБФБ replace-string ЙЪЙУЛЧБ ДЧБ БТЗХНЕОФБ -- ОЙЪЯФ, ЛПКФП ЭЕ ВЯДЕ -ЪБНЕОСО, Й ОЙЪЯФ, ЛПКФП ЭЕ ЗП ЪБНЕОЙ. фТСВЧБ ДБ ЪБЧЯТЫЙФЕ ЧЯЧЕЦДБОЕФП -ОБ ЧУЕЛЙ БТЗХНЕОФ У <Return>. +Командата replace-string изисква два аргумента -- низът, който ще бъде +заменян, и низът, който ще го замени. Трябва да завършите въвеждането +на всеки аргумент с <Return>. ->> рТЙДЧЙЦЕФЕ ЛХТУПТБ ДП РТБЪОЙС ТЕД ДЧБ ТЕДБ ОБДПМХ РПД ФПЪЙ. - фПЗБЧБ ЧЯЧЕДЕФЕ M-x repl s<Return>РТПНЕОС<Return><Return> +>> Придвижете курсора до празния ред, два реда надолу под този. + Тогава въведете M-x repl s<Return>променя<Return>изменя<Return> - ъБВЕМЕЦЕФЕ ЛБЛ ФПЪЙ ТЕД УЕ РТПНЕОС: ЧЙЕ ЪБНЕОЙИФЕ ДХНБФБ - Р-Т-П-Н-Е-О-С У "ЙЪНЕОС", ЛЯДЕФП Й ДБ УЕ ОБНЙТБ УМЕД ОБЮБМОПФП - НСУФП ОБ ЛХТУПТБ. + Забележете как този ред се променя: вие заменихте думата + п-р-о-м-е-н-я с "изменя", където и да се намира след началното + място на курсора. -ъбвемецлб: рТЕЧЛМАЮЧБОЕФП ЛЯН ЧЯЧЕЦДБОЕ ОБ ЛЙТЙМУЛЙ ВХЛЧБ УФБЧБ У C-\. +ЗАБЕЛЕЖКА: Превключването към въвеждане на кирилски буква става с C-\. -* бчфпнбфйюоп ъбрбъчбое +* АВТОМАТИЧНО ЗАПАЗВАНЕ ----------------------- -лПЗБФП УФЕ ОБРТБЧЙМЙ РТПНЕОЙ ЧЯЧ ЖБКМ, ОП ПЭЕ ОЕ УФП ЗП ЪБРБЪЙМЙ, ФЕ -НПЗБФ ДБ ВЯДБФ ЪБЗХВЕОЙ БЛП ЛПНРАФЯТЯФ ЧОЕЪБРОП УЕ ЙЪЛМАЮЙ. ъБ ДБ УЕ -ЪБРБЪЙФЕ ПФ ФБЛЙЧБ УЙФХБГЙЙ, еНБЛУ РЕТЙПДЙЮОП ЪБРБЪЧБ "БЧФПНБФЙЮОП -ЪБРБЪЧБО" ЖБКМ ЪБ ЧУЕЛЙ ЖБКМ, ЛПКФП ТЕДБЛФЙТБФЕ. йНЕФП ОБ БЧФПНБФЙЮОП -ЪБРБЪЧБОЙС ЖБКМ ЙНБ # Ч ОБЮБМПФП Й Ч ЛТБС; ОБРТЙНЕТ, БЛП ЧБЫЙСФ ЖБКМ Е -У ЙНЕ "hello.c", ЙНЕФП ОБ ОЕЗПЧЙС БЧФПНБФЙЮОП ЪБРБЪЧБО ЖБКМ ЭЕ ВЯДЕ -"#hello.c#". лПЗБФП ЪБРБЪЧБФЕ ЖБКМ РП ПВЙЛОПЧЕОЙС ОБЮЙО, еНБЛУ -ЙЪФТЙЧБ ОЕЗПЧЙС БЧФПНБФЙЮОП ЪБРЙУЧБО ЖБКМ. +Когато сте направили промени във файл, но още не сте го запазили, те +могат да бъдат загубени, ако компютърът внезапно се изключи. За да ви +предпази от такива ситуации, Емакс периодично запазва "автоматично +запазван" файл за всеки файл, който редактирате. Името на автоматично +запазвания файл има # в началото и в края; например, ако вашият файл е +с име "hello.c", името на неговия автоматично запазван файл ще бъде +"#hello.c#". Когато запазвате файл по обикновения начин, Емакс +изтрива неговия автоматично записван файл. -бЛП ЛПНРАФЯТЯФ ЪБЧЙУОЕ, НПЦЕ ДБ ЧЯЪУФБОПЧЙФЕ ЧБЫБФБ БЧФПНБФЙЮОП -ЪБРБЪЧБОБ ТЕДБЛГЙС ЛБФП ОБНЕТЙФЕ ЖБКМБ ЛБЛФП ПВЙЛОПЧЕОП (ЖБКМЯФ, ЛПКФП -УФЕ ТЕДБЛФЙТБМЙ, ОЕ БЧФПНБФЙЮОП ЪБРБЪЧБОЙС) Й УМЕД ФПЧБ ЧЯЧЕДЕФЕ M-x -recover file<Return>. лПЗБФП ЛПНБОДБФБ ЙЪЙУЛБ РПФЧЯТЦДЕОЙЕ, ЧЯЧЕДЕФЕ -yes<Return> ЪБ ДБ РТПДЯМЦЙФЕ Й ДБ ЧЯЪУФБОПЧЙФЕ БЧФПНБФЙЮОП ЪБРБЪЧБОЙФЕ -ДБООЙ. +Ако компютърът зависне, може да възстановите вашата автоматично +запазвана редакция, като намерите файла както обикновено (файлът, +който сте редактирали, не автоматично запазвания) и след това въведете +M-x recover file<Return>. Когато командата изиска потвърждение, +въведете yes<Return>, за да продължите и да възстановите автоматично +запазваните данни. -* еип пвмбуффб +* ЕХО ОБЛАСТТА -------------- -бЛП еНБЛУ ЧЙДЙ, ЮЕ ЧЯЧЕЦДБФЕ НОПЗПЪОБЛПЧЙ ЛПНБОДЙ ВБЧОП, ЭЕ ЧЙ ЗЙ -РПЛБЦЕ Ч ДЯОПФП ОБ ЕЛТБОБ Ч ПВМБУФ ОБТЙЮБОБ "ЕИП ПВМБУФ". еИП -ПВМБУФФБ ПВИЧБЭБ РПУМЕДОЙС ТЕД ПФ ЕЛТБОБ. +Ако Емакс види, че въвеждате многознакови команди бавно, ще ви ги +покаже в дъното на екрана, в област, наричана "ехо област". Ехо +областта обхваща последния ред от екрана. -* тед об тецйнб ---------------- +* РЕД НА РЕЖИМА +---------------- -тЕДЯФ ФПЮОП ОБД ЕИП ПВМБУФФБ УЕ ОБТЙЮБ "ТЕД ОБ ТЕЦЙНБ" (mode line). -фПК РПЛБЪЧБ ОЕЭП ЛБФП: +Редът точно над ехо областта се нарича "ред на режима" (mode line). +Той показва нещо като: ---:** TUTORIAL (Fundamental)--L670--58%---------------- +-R:** TUTORIAL.bg (Fundamental)--L670--58%---------------- -фПЪЙ ТЕД ДБЧБ РПМЕЪОБ ЙОЖПТНБГЙС ЪБ УЯУФПСОЙЕФП ОБ еНБЛУ Й ФЕЛУФБ, -ЛПКФП ТЕДБЛФЙТБФЕ. +Този ред дава полезна информация за състоянието на Емакс и текста, +който редактирате. -чЕЮЕ ЪОБЕФЕ ЛБЛЧП ПЪОБЮБЧБ ЙНЕФП ОБ ЖБКМБ -- ФПЧБ Е ЖБКМЯФ, ЛПКФП УФЕ -ОБНЕТЙМЙ. -NN%-- РПЛБЪЧБ ЧБЫБФБ ФЕЛХЭБ РПЪЙГЙС Ч ФЕЛУФБ; ФПЧБ -ПЪОБЮБЧБ, ЮЕ NN РТПГЕОФБ ПФ ФЕЛУФБ Е ОБД ЧЯТИБ ОБ ЕЛТБОБ. бЛП -ОБЮБМПФП ОБ ЖБКМБ Е ОБ ЕЛТБОБ, ЭЕ УЕ РПЛБЪЧБ --Top-- (ЧТЯИ) ЧНЕУФП ---00%--. бЛП ЛТБС ОБ ЖБКМБ Е ОБ ЕЛТБОБ, ЭЕ УЕ РПЛБЪЧБ --Bot-- (ДЯОП). -бЛП ЗМЕДБФЕ ФЕЛУФ, ЛПКФП Е ФПМЛПЧБ НБМЯЛ, ЮЕ УЕ РПЛБЪЧБ ЙЪГСМП ОБ -ЕЛТБОБ, ТЕДЯФ ОБ ТЕЦЙНБ ЭЕ ЙЪЧЕДЕ --All--. +Вече знаете какво означава името на файла -- това е файлът, който сте +намерили. -NN%-- показва вашата текуща позиция в текста; това +означава, че NN процента от текста е над върха на екрана. Ако +началото на файла е на екрана, ще се показва --Top-- (връх) вместо +--00%--. Ако края на файла е на екрана, ще се показва --Bot-- (дъно). +Ако гледате текст, който е толкова малък, че се показва изцяло на +екрана, редът на режима ще изведе --All--. -ъОБЛЯФ L Й ГЙЖТЙФЕ РПЛБЪЧБФ НСУФПФП РП ДТХЗ ОБЮЙО: ФПЧБ Е ОПНЕТЯФ ОБ -ФЕЛХЭЙС ТЕД ОБ ФПЮЛБФБ. +Знакът L и цифрите показват мястото по друг начин: това е номерът на +текущия ред на точката. -ъЧЕЪДЙФЕ ВМЙЪП ДП ОБЮБМПФП ПЪОБЮБЧБФ, ЮЕ УФЕ ОБРТБЧЙМЙ РТПНЕОЙ Ч -ФЕЛУФБ. чЕДОБЗБ УМЕД ЛБФП РПУЕФЙФЕ ЙМЙ ЪБРБЪЙФЕ ЖБКМ ФБЪЙ ЮБУФ ПФ -ТЕДБ ОБ ТЕЦЙНБ ЧЕЮЕ ОЕ РПЛБЪЧБ ЪЧЕЪДЙ, Б УБНП ФЙТЕФБ. +Звездите близо до началото означават, че сте направили промени в +текста. Веднага след като посетите или запазите файл, тази част от +реда на режима вече не показва звезди, а само тирета. -юБУФФБ ПФ ТЕДБ ОБ ТЕЦЙНБ ЧЯФТЕ Ч УЛПВЙФЕ Е ЪБ ДБ ЧЙ РПЛБЦЕ Ч ЛБЛЯЧ -ТЕЦЙН ОБ ТЕДБЛФЙТБОЕ УЕ ОБНЙТБФЕ. рПДТБЪВЙТБЭЙСФ УЕ ТЕЦЙН Е -Fundamental (пУОПЧЕО), ЛПКФП ЙЪРПМЪЧБФЕ Ч НПНЕОФБ. фПЧБ Е РТЙНЕТ ЪБ -"ЗМБЧЕО ТЕЦЙН" (major mode). +Частта от реда на режима вътре в скобите е, за да ви покаже в какъв +режим на редактиране се намирате. Подразбиращият се режим е +Fundamental (Основен), който използвате в момента. Това е пример за +"главен режим" (major mode). -еНБЛУ ЙНБ НОПЗП ЗМБЧОЙ ТЕЦЙНЙ. оСЛПЙ ПФ ФСИ УБ РТЕДЧЙДЕОЙ ЪБ -ТЕДБЛФЙТБОЕ ОБ ТБЪМЙЮОЙ ЕЪЙГЙ Й/ЙМЙ ЧЙДПЧЕ ФЕЛУФ, ЛБФП ОБРТЙНЕТ ТЕЦЙН -мЙУР, ТЕЦЙН фЕЛУФ Й ДТХЗЙ. чЯЧ ЧУЕЛЙ ЕДЙО НПНЕОФ ПФ ЧТЕНЕ ФПЮОП ЕДЙО -ЗМБЧЕО ТЕЦЙН Е БЛФЙЧЕО Й ОЕЗПЧПФП ЙНЕ НПЦЕ ЧЙОБЗЙ ДБ ВЯДЕ ОБНЕТЕОП Ч -ТЕДБ ОБ ТЕЦЙНБ ФПЮОП ЛБЛФП "Fundamental" УЕЗБ. +Емакс има много главни режими. Някои от тях са предвидени за +редактиране на различни езици и/или видове текст, като например режим +Лисп, режим Текст и други. Във всеки един момент от време точно един +главен режим е активен и неговото име може винаги да бъде намерено в +реда на режима, точно както "Fundamental" сега. -чУЕЛЙ ЗМБЧЕО ТЕЦЙН РТБЧЙ ОСЛПЙ ЛПНБОДЙ ДБ УЕ ДЯТЦБФ РП ТБЪМЙЮЕО -ОБЮЙО. оБРТЙНЕТ, ЙНБ ЛПНБОДЙ ЪБ ТЕДБЛФЙТБОЕ ОБ ЛПНЕОФБТЙ Ч РТПЗТБНЙ, -Й ФЯК ЛБФП ЧУЕЛЙ РТПЗТБНЕО ЕЪЙЛ ЙНБ ТБЪМЙЮОБ ЙДЕС ЪБ ФПЧБ ЛБЛ ФТСВЧБ -ДБ ЙЪЗМЕЦДБФ ЛПНЕОФБТЙФЕ, ЧУЕЛЙ ЗМБЧЕО ТЕЦЙН ФТСВЧБ ДБ ЧНЯЛЧБ -ЛПНЕОФБТЙ РП ТБЪМЙЮЕО ОБЮЙО. чУЕЛЙ ЗМБЧЕО ТЕЦЙН Е ЙНЕ ОБ ТБЪЫЙТЕОБ -ЛПНБОДБ, У ЛПСФП РТЕЧЛМАЮЧБФЕ ЛЯН ФПЪЙ ТЕЦЙН. оБРТЙНЕТ, M-x -fundamental-mode Е ЛПНБОДБ ЪБ РТЕЧЛМАЮЧБОЕ ЛЯН ТЕЦЙН Fundamental. +Всеки главен режим прави някои команди да се държат по различен начин. +Например, има команди за редактиране на коментари в програми, и тъй +като всеки програмен език има различна идея за това как трябва да +изглеждат коментарите, всеки главен режим трябва да вмъква коментари +по различен начин. Всеки главен режим е име на разширена команда, с +която превключвате към този режим. Например, M-x fundamental-mode е +команда за превключване към режим Fundamental. -лПЗБФП ТЕДБЛФЙТБФЕ ФЕЛУФ ОБ ЕУФЕУФЧЕО ЕЪЙЛ, ЛБФП ФПЪЙ ЖБКМ, -ОБК-ЧЕТПСФОП ФТСВЧБ ДБ ЙЪРПМЪЧБФЕ ТЕЦЙН фЕЛУФ. +Когато редактирате текст на естествен език, като този файл, +най-вероятно трябва да използвате режим Текст (text). ->> чЯЧЕДЕФЕ M-x text mode<Return>. +>> Въведете M-x text mode<Return>. -оЕ УЕ ВЕЪРПЛПКФЕ, ОЙЛПС ПФ еНБЛУ ЛПНБОДЙФЕ, ЛПЙФП УФЕ ОБХЮЙМЙ, ОСНБ ДБ -УЕ РТПНЕОЙ РП ОСЛБЛЯЧ УЯЭЕУФЧЕО ОБЮЙО. оП НПЦЕ ДБ ЪБВЕМЕЦЙФЕ, ЮЕ M-f -Й M-b УЕЗБ ЧЯЪРТЙЕНБФ БРПУФТПЖЙФЕ (') ЛБФП ЮБУФ ПФ ДХНЙФЕ. рТЕДЙ -ФПЧБ, Ч ПУОПЧОЙС ТЕЦЙН (Fundamental) M-f Й M-b УЕ ЧЯЪРТЙЕНБИБ ЛБФП -ТБЪДЕМЙФЕМЙ ОБ ДХНЙ. +Не се безпокойте, никоя от Емакс командите, които сте научили, няма да +се промени по някакъв съществен начин. Но може да забележите, че M-f +и M-b сега възприемат апострофите (') като част от думите. Преди +това, в основния режим (Fundamental), M-f и M-b се възприемаха като +разделители на думи. -зМБЧОЙФЕ ТЕЦЙНЙ ПВЙЛОПЧЕОП РТБЧСФ НБМЛЙ РТПНЕОЙ ЛБФП ФБЪЙ: РПЧЕЮЕФП -ЛПНБОДЙ ЧЯТЫБФ "УЯЭБФБ ТБВПФБ" ЧЯЧ ЧУЕЛЙ ЗМБЧЕО ТЕЦЙН, ОП ТБВПФСФ РП -НБМЛП РП-ТБЪМЙЮЕО ОБЮЙО. +Главните режими обикновено правят малки промени като тази: повечето +команди вършат "същата работа" във всеки главен режим, но работят по +малко по-различен начин. -ъБ ДБ ЧЙДЙФЕ ДПЛХНЕОФБГЙСФБ ОБ ЧБЫЙС ФЕЛХЭ ЗМБЧЕО ТЕЦЙН, ЧЯЧЕДЕФЕ C-h +За да видите документацията на вашия текущ главен режим, въведете C-h m. ->> хРПФТЕВЕФЕ C-u C-v ЧЕДОЯЦ ЙМЙ РПЧЕЮЕ РЯФЙ ЪБ ДБ ДПЛБТБФЕ ФПЪЙ ТЕД - ВМЙЪП ДП ЧЯТИБ ОБ ЕЛТБОБ. ->> чЯЧЕДЕФЕ C-h m, ЪБ ДБ ЧЙДЙФЕ ЛБЛ ФЕЛУФПЧЙСФ ТЕЦЙН УЕ ТБЪМЙЮБЧБ ПФ - ПУОПЧОЙС ТЕЦЙН. ->> чЯЧЕДЕФЕ C-x 1 ЪБ ДБ РТЕНБИОЕФЕ ДПЛХНЕОФБГЙСФБ ПФ ЕЛТБОБ. +>> Употребете C-u C-v веднъж или повече пъти, за да докарате този ред + близо до върха на екрана. +>> Въведете C-h m, за да видите как текстовият режим се различава от + основния режим. +>> Въведете C-x 1, за да премахнете документацията от екрана. -зМБЧОЙФЕ ТЕЦЙНЙ УЕ ОБТЙЮБФ ЗМБЧОЙ, ЪБЭПФП ЙНБ Й НБМЛЙ ТЕЦЙНЙ (minor -modes). нБМЛЙФЕ ТЕЦЙНЙ ОЕ УБ БМФЕТОБФЙЧЙ ОБ ЗМБЧОЙФЕ, Б РТПУФП НБМЛЙ -РТПНЕОЙ ЛЯН ФСИ. чУЕЛЙ НБМЯЛ ТЕЦЙН НПЦЕ ДБ ВЯДЕ ЧЛМАЮЕО ЙМЙ ЙЪЛМАЮЕО -УБН ЪБ УЕВЕ УЙ, ОЕЪБЧЙУЙНП ПФ ЧУЙЮЛЙ ДТХЗЙ НБМЛЙ ТЕЦЙНЙ, Й ОЕЪБЧЙУЙНП -ПФ ЧБЫЙС ЗМБЧЕО ТЕЦЙН. фБЛБ ЮЕ НПЦЕ ДБ ОЕ ЙЪРПМЪЧБФЕ НБМЛЙ ТЕЦЙНЙ, ДБ -ЙЪРПМЪЧБФЕ ЕДЙО НБМЯЛ ТЕЦЙН, ЙМЙ ДБ ЙЪРПМЪЧБФЕ ОСЛБЛЧБ ЛПНВЙОБГЙС ПФ -ОСЛПМЛП НБМЛЙ ТЕЦЙНБ. +Главните режими се наричат главни, защото има и малки (второстепенни) +режими (minor modes). Малките режими не са алтернативи на главните, а +просто малки промени към тях. Всеки малък режим може да бъде включен +или изключен сам за себе си, независимо от всички други малки режими +и независимо от вашия главен режим. Така че може да не използвате +малки режими, да използвате един малък режим, или да използвате +някаква комбинация от няколко малки режима. -еДЙО ЗМБЧЕО ТЕЦЙН, ЛПКФП Е НОПЗП РПМЕЪЕО, ПУПВЕОП ЪБ ТЕДБЛФЙТБОЕ ОБ -ФЕЛУФ ОБ ЕУФЕУФЧЕО ЕЪЙЛ, Е ТЕЦЙНЯФ ОБ БЧФПНБФЙЮОП ЪБРЯМЧБОЕ (Auto Fill -mode). лПЗБФП ФПЪЙ ТЕЦЙН Е ЧЛМАЮЕО, еНБЛУ БЧФПНБФЙЮОП ТБЪДЕМС ТЕДБ -РТЙ НСУФПФП НЕЦДХ ДХНЙФЕ, ЛПЗБФП ЧНЯЛЧБФЕ ФЕЛУФ Й ОБРТБЧЙФЕ ТЕД, ЛПКФП -Е ФЧЯТДЕ ДЯМЯЗ. +Един главен режим, който е много полезен, особено за редактиране на +текст на естествен език, е режимът на автоматично запълване (Auto Fill +mode). Когато този режим е включен, Емакс автоматично разделя реда +при мястото между думите, когато вмъквате текст и направите ред, който +е твърде дълъг. -нПЦЕ ДБ ЧЛМАЮЙФЕ ТЕЦЙНБ ОБ БЧФПНБФЙЮОП ЪБРЯМЧБОЕ ЛБФП ЙЪРЯМОЙФЕ M-x -auto fill mode<Return>. лПЗБФП ТЕЦЙНЯФ Е ЧЛМАЮЕО, НПЦЕ ДБ ЗП -ЙЪЛМАЮЙФЕ У M-x auto fill mode<Return>. бЛП ТЕЦЙНЯФ Е ЙЪЛМАЮЕО, ФБЪЙ -ЛПНБОДБ ЗП ЧЛМАЮЧБ, Б БЛП Е ЧЛМАЮЕО, ЗП ЙЪЛМАЮЧБ. лБЪЧБНЕ, ЮЕ -ЛПНБОДБФБ "ПВТЯЭБ ТЕЦЙНБ". +Може да включите режима на автоматично запълване, като изпълните M-x +auto fill mode<Return>. Когато режимът е включен, може да го +изключите с M-x auto fill mode<Return>. Ако режимът е изключен, тази +команда го включва, а ако е включен, го изключва. Казваме, че +командата "обръща режима". ->> чЯЧЕДЕФЕ M-x auto fill mode<Return> УЕЗБ. уМЕД ФПЧБ ЧНЯЛОЕФЕ ТЕД - ПФ "asdf " ПФОПЧП Й ПФОПЧП ДПЛБФП ОЕ ЧЙДЙФЕ, ЮЕ ФЕЛУФБ УЕ ТБЪДЕМС - ОБ ДЧБ ТЕДБ. фТСВЧБ ДБ УМБЗБФЕ ЙОФЕТЧБМЙ НЕЦДХ ДХНЙФЕ, ЪБЭПФП - БЧФПНБФЙЮОПФП ЪБРЯМЧБОЕ ТБЪДЕМС ТЕДПЧЕФЕ УБНП РТЙ ЙОФЕТЧБМЙФЕ. +>> Въведете M-x auto fill mode<Return> сега. След това вмъкнете ред + от "asdf " отново и отново, докато не видите, че текстът се разделя + на два реда. Трябва да слагате интервали между думите, защото + автоматичното запълване разделя редовете само при интервалите. -зТБОЙГБФБ ПВЙЛОПЧЕОП Е ЪБДБДЕОБ ОБ 70 ЪОБЛБ, ОП НПЦЕФЕ ДБ С РТПНЕОЙФЕ -У ЛПНБОДБФБ C-x f. фТСВЧБ ДБ ЪБДБЧБФЕ ФБЪЙ ЗТБОЙГБ ЛБФП ЮЙУМПЧ -БТЗХНЕОФ ОБ ЛПНБОДБФБ. +Границата обикновено е зададена на 70 знака, но можете да я промените +с командата C-x f. Трябва да задавате тази граница като числов +аргумент на командата. ->> чЯЧЕДЕФЕ C-x f У БТЗХНЕОФ 20. (C-u 2 0 C-x f). - уЕЗБ ЧЯЧЕДЕФЕ ОСЛБЛЯЧ ФЕЛУФ Й ЧЙЦФЕ ЛБЛ еНБЛУ ЪБРЯМЧБ ТЕДПЧЕФЕ У РП - ОЕ РПЧЕЮЕ ПФ 20 ЪОБЛБ. рПУМЕ ЧЯТОЕФЕ ПВТБФОП ЗТБОЙГБФБ ОБ 70 - ЙЪРПМЪЧБКЛЙ C-x f ПФОПЧП. +>> Въведете C-x f с аргумент 20. (C-u 2 0 C-x f). + Сега въведете някакъв текст и вижте как Емакс запълва редовете с по + не повече от 20 знака. После върнете обратно границата на 70, + използвайки C-x f отново. -бЛП ОБРТБЧЙФЕ РТПНЕОЙ Ч УТЕДБФБ ОБ БВЪБГ, ТЕЦЙНЯФ ОБ БЧФПНБФЙЮОП -ЪБРЯМЧБОЕ ОСНБ ДБ ЗП ЪБРЯМОЙ ОБОПЧП ЪБ ЧБУ. -ъБ ДБ ЪБРЯМОЙФЕ ОБОПЧП БВЪБГ ЧЯЧЕЦДБКФЕ M-q (META-q) ДПЛБФП ЛХТУПТЯФ Е -ЧЯФТЕ Ч БВЪБГБ. +Ако направите промени в средата на абзац, режимът на автоматично +запълване няма да го запълни наново за вас. +За да запълните наново абзац, въвеждайте M-q (META-q), докато курсорът +е вътре в абзаца. ->> рТЙДЧЙЦЕФЕ ЛХТУПТБ ЧЯФТЕ Ч РТЕДЙЫОЙС БВЪБГ Й ЧЯЧЕДЕФЕ M-q. +>> Придвижете курсора вътре в предишния абзац и въведете M-q. -* фятуеое +* ТЪРСЕНЕ --------- -еНБЛУ НПЦЕ ДБ ЙЪЧЯТЫЧБ ФЯТУЕОЙС ОБ ОЙЪПЧЕ (ФПЧБ УБ РПУМЕДПЧБФЕМОПУФЙ -ПФ ЪОБГЙ ЙМЙ ДХНЙ) ЙМЙ ОБРТЕД Ч ФЕЛУФБ ЙМЙ ОБЪБД Ч ОЕЗП. фЯТУЕОЕФП ОБ -ОЙЪ Е РТЙДЧЙЦЧБЭБ ЛХТУПТБ ЛПНБОДБ; ФС РТЕНЕУФЧБ ЛХТУПТБ ОБ УМЕДЧБЭПФП -НСУФП, ЛЯДЕФП УЕ УТЕЭБ ОЙЪЯФ. +Емакс може да извършва търсения на низове (това са последователности +от знаци или думи) или напред в текста, или назад в него. Търсенето +на низ е придвижваща курсора команда; тя премества курсора на +следващото място, където се среща низът. -лПНБОДБФБ ЪБ ФЯТУЕОЕ ОБ еНБЛУ УЕ ТБЪМЙЮБЧБ ПФ ЛПНБОДБФБ ЪБ ФЯТУЕОЕ ОБ -РПЧЕЮЕФП ТЕДБЛФПТЙ РП ФПЧБ, ЮЕ ФС Е "РПУФЯРЛПЧБ". фПЧБ ПЪОБЮБЧБ, ЮЕ -ФЯТУЕОЕФП УЕ ЙЪЧЯТЫЧБ ПЭЕ ДПЛБФП ЧЯЧЕЦДБФЕ ФЕЛУФБ, ЛПКФП ФЯТУЙФЕ. +Командата за търсене на Емакс се различава от командата за търсене на +повечето редактори по това, че тя е "постъпкова". Това означава, че +търсенето се извършва още докато въвеждате текста, който търсите. -лПНБОДБФБ ЪБ ЪБРПЮЧБОЕ ОБ ФЯТУЕОЕ Е C-s ЪБ ФЯТУЕОЕ ОБРТЕД, Й C-r ЪБ -ФЯТУЕОЕ ОБЪБД. оп рпюблбкфе! оЕ ЗЙ РТПВЧБКФЕ УЕЗБ. +Командата за започване на търсене е C-s за търсене напред, и C-r за +търсене назад. НО ПОЧАКАЙТЕ! Не ги пробвайте сега. -лПЗБФП ЧЯЧЕДЕФЕ C-s ЭЕ ЪБВЕМЕЦЙФЕ, ЮЕ ОЙЪЯФ "I-search" УЕ РПСЧСЧБ ЛБФП -РПДУЛБЪЛБ Ч ЕИП ПВМБУФФБ. фПЧБ ЧЙ ЛБЪЧБ, ЮЕ еНБЛУ Е Ч ФПЧБ, ЛПЕФП УЕ -ОБТЙЮБ РПУФЯРЛПЧП ФЯТУЕОЕ, ЮБЛБКЛЙ ЧЙ ДБ ЧЯЧЕЦДБФЕ ФЕЛУФБ, ЛПКФП -ЙУЛБФЕ ДБ ФЯТУЙФЕ. <Return> РТЙЛМАЮЧБ ФЯТУЕОЕФП. +Когато въведете C-s, ще забележите, че низът "I-search" се появява +като подсказка в ехо областта. Това ви казва, че Емакс е в това, +което се нарича постъпково търсене, чакайки ви да въвеждате текста, +който искате да търсите. <Return> приключва търсенето. ->> уЕЗБ ЧЯЧЕДЕФЕ C-s ЪБ ДБ ЪБРПЮОЕФЕ ФЯТУЕОЕФП. вбчоп, ВХЛЧБ РП - ВХЛЧБ, ЧЯЧЕДЕФЕ ДХНБФБ "ФЯТУЕОЕ", ЙЪЮБЛЧБКЛЙ УМЕД ЧЯЧЕЦДБОЕФП ОБ - ЧУЕЛЙ ЪОБЛ, ЪБ ДБ НПЦЕ ДБ ЪБВЕМЕЦЙФЕ ЛБЛЧП УФБЧБ У ЛХТУПТБ. уЕЗБ - ЙЪЧЯТЫЙИФЕ ФЯТУЕОЕ ОБ "ФЯТУЕОЕ" ЧЕДОЯЦ. ->> чЯЧЕДЕФЕ ПФОПЧП C-s, ЪБ ДБ ФЯТУЙФЕ ДТХЗП УЯЧРБДЕОЙЕ У "ФЯТУЕОЕ". ->> уЕЗБ ЧЯЧЕДЕФЕ <Delback> ФТЙ РЯФЙ Й ЧЙЦФЕ ЛБЛ УЕ РТЙДЧЙЦЧБ ЛХТУПТБ. ->> чЯЧЕДЕФЕ <Return> ЪБ ДБ РТЕЛТБФЙФЕ ФЯТУЕОЕФП. +>> Сега въведете C-s, за да започнете търсенето. БАВНО, буква по + буква, въведете думата "търсене", изчаквайки след въвеждането на + всеки знак, за да може да забележите какво става с курсора. Сега + извършихте търсене на "търсене" веднъж. +>> Въведете отново C-s, за да търсите друго съвпадение с "търсене". +>> Сега въведете <Delback> три пъти и вижте как се придвижва курсора. +>> Въведете <Return>, за да прекратите търсенето. -ъБВЕМСЪБИФЕ МЙ ЛБЛЧП УФБОБ? еНБЛУ, ЛПЗБФП ФЯТУЙ РПУФЯРЛПЧП, УЕ ПРЙФЧБ -ДБ ОБНЕТЙ УМЕДЧБЭПФП УЯЧРБДЕОЙЕ ОБ ОЙЪБ, ЛПКФП УЕ ЧЯЧЕЦДБ. ъБ ДБ -ПФЙДЕФЕ ОБ УМЕДЧБЭПФП УЯЧРБДЕОЙЕ ОБ "ФЯТУОЕ" РТПУФП ПФОПЧП ЧЯЧЕДЕФЕ -C-s. бЛП ОСНБ ФБЛПЧБ УЯЧРБДЕОЙЕ, еНБЛУ ВЙВЙРЧБ Й ЧЙ ЛБЪЧБ, ЮЕ -ФЯТУЕОЕФП Е "РТПЧБМЕОП" (failing). C-g УЯЭП РТЕЛТБФСЧБ ФЯТУЕОЕФП. +Забелязахте ли какво стана? Емакс, когато търси постъпково, се опитва +да намери следващото съвпадение на низа, който се въвежда. За да +отидете на следващото съвпадение на "търсне", просто отново въведете +C-s. Ако няма такова съвпадение, Емакс бибипва и ви казва, че +търсенето е "провалено" (failing). C-g също прекратява търсенето. -ъбвемецлб: оБ ОСЛПЙ УЙУФЕНЙ ЧЯЧЕЦДБОЕФП ОБ C-s ЭЕ ЪБНТБЪЙ ЕЛТБОБ Й ЧЙЕ -ОСНБ ДБ НПЦЕ ДБ ЧЙДЙФЕ РПЧЕЮЕ ТЕБЛГЙС ПФ еНБЛУ. фПЧБ РПЛБЪЧБ, ЮЕ -"УРПУПВОПУФ" ОБ ПРЕТБГЙПООБФБ УЙУФЕНБ ОБТЕЮЕОБ "ХРТБЧМЕОЙЕ ОБ РПФПЛБ" -Е РТЙИЧБОБМБ C-s Й ОЕ ЗП РХУЛБ ДП еНБЛУ. ъБ ДБ ТБЪНТБЪЙФЕ ЕЛТБОБ -ЧЯЧЕДЕФЕ C-q. фПЗБЧБ ЧЙЦФЕ УЕЛГЙСФБ "уРПОФБООП ЧЛМАЮЧБОЕ ОБ -РПУФЯРЛПЧПФП ФЯТУЕОЕ" (Spontaneous Entry to Incremental Search) Ч -ТЯЛПЧПДУФЧПФП ОБ еНБЛУ ЪБ УЯЧЕФ ЛБЛ ДБ УЕ УРТБЧЙФЕ У ФБЪЙ -"УРПУПВОПУФ". +ЗАБЕЛЕЖКА: На някои системи въвеждането на C-s ще замрази екрана и вие +няма да може да видите повече реакция от Емакс. Това показва, че +"способност" на операционната система, наречена "управление на потока" +(flow control), е прихванала C-s и не го пропуска до Емакс. За да +размразите екрана, въведете C-q. Тогава вижте секцията "Спонтанно +включване на постъпковото търсене" (Spontaneous Entry to Incremental +Search) в ръководството на Емакс за съвет как да се справите с тази +"способност". -бЛП УФЕ Ч УТЕДБФБ ОБ РПУФЯРЛПЧП ФЯТУЕОЕ Й ЧЯЧЕДЕФЕ <Delback> ЭЕ -ЪБВЕМЕЦЙФЕ, ЮЕ РПУМЕДОЙСФ ЪОБЛ Ч ФЯТУЕОЙС ОЙЪ УЕ ЙЪФТЙЧБ Й ФЯТУЕОЕФП -УЕ ЧТЯЭБ ЛЯН РПУМЕДОПФП НСУФП ОБ ФЯТУЕОЕ. оБРТЙНЕТ, РТЕДРПМПЦЕФЕ, ЮЕ -УФЕ ЧЯЧЕМЙ "Ф", ЪБ ДБ ОБНЕТЙФЕ РЯТЧПФП УЯЧРБДЕОЙЕ У "Ф". уЕЗБ БЛП -ЧЯЧЕДЕФЕ "Я" ЛХТУПТЯФ ЭЕ УЕ РТЙДЧЙЦЙ ЛЯН РЯТЧПФП УЯЧРБДЕОЙЕ ОБ "ФЯ". -уЕЗБ ЧЯЧЕДЕФЕ <Delback>. фПЧБ ЙЪФТЙЧБ ЪОБЛБ "Я" ПФ ОЙЪБ ЪБ ФЯТУЕОЕ, Й -ЛХТУПТЯФ УЕ РТЕНЕУФЧБ ОБЪБД ДП РЯТЧПФП УЯЧРБДЕОЙЕ У "Ф". +Ако сте в средата на постъпково търсене и въведете <Delback>, ще +забележите, че последният знак в търсения низ се изтрива и търсенето +се връща към последното място на търсене. Например, предположете, че +сте въвели "т", за да намерите първото съвпадение с "т". Сега, ако +въведете "ъ", курсорът ще се придвижи към първото съвпадение на "тъ". +Сега въведете <Delback>. Това изтрива знака "ъ" от низа за търсене и +курсорът се премества назад, до първото съвпадение с "т". -бЛП УФЕ Ч УТЕДБФБ ОБ ФЯТУЕОЕ Й ЧЯЧЕДЕФЕ ЛПОФТПМЕО ЙМЙ НЕФБ ЪОБЛ (У -ОСЛПМЛП ЙЪЛМАЮЕОЙС -- ЪОБГЙФЕ, ЛПЙФП УБ УРЕГЙБМОЙ РП ЧТЕНЕ ОБ ФЯТУЕОЕ, -ЛБФП C-s Й C-r), ФЯТУЕОЕФП УЕ РТЕЛТБФСЧБ. +Ако сте в средата на търсене и въведете контролен или мета знак (с +няколко изключения -- знаците, които са специални по време на търсене, +като C-s и C-r), търсенето се прекратява. -C-s ЪБРПЮЧБ ФЯТУЕОЕ, ЛПЕФП ЗМЕДБ ЪБ УЯЧРБДЕОЙЕ У ОЙЪБ ДБДЕО ЪБ ФЯТУЕОЕ -умед ФЕЛХЭПФП НСУФП ОБ ЛХТУПТБ. бЛП ЙУЛБФЕ ДБ ФЯТУЙФЕ ОЕЭП РП-ТБООП -ПФ ФЕЛУФБ, ЧНЕУФП ФПЧБ ЧЯЧЕДЕФЕ C-r. чУЙЮЛП, ЛПЕФП ЛБЪБИНЕ ЪБ C-s, -ЧБЦЙ Й ЪБ C-r, ПУЧЕО ЮЕ РПУПЛБФБ ОБ ФЯТУЕОЕ Е ПВЯТОБФБ. +C-s започва търсене, което гледа за съвпадение с низа, даден за +търсене СЛЕД текущото място на курсора. Ако искате да търсите нещо +по-ранно от текста, вместо това въведете C-r. Всичко, което казахме +за C-s, важи и за C-r, освен че посоката на търсене е обърната. -* нопцеуфчп ртпъптгй +* МНОЖЕСТВО ПРОЗОРЦИ ---------------- -еДОБ ПФ РТЙЧМЕЛБФЕМОЙФЕ УРПУПВОПУФЙ ОБ еНБЛУ Е ФБЪЙ, ЮЕ НПЦЕ ДБ -ЗМЕДБФЕ РПЧЕЮЕ ПФ ЕДЙО РТПЪПТЕГ ОБ ЕЛТБОБ Ч ДБДЕО НПНЕОФ ПФ ЧТЕНЕ. +Една от привлекателните способности на Емакс е тази, че може да +гледате повече от един прозорец на екрана в даден момент от време. ->> рТЙДЧЙЦЕФЕ ЛХТУПТБ ДП ФПЪЙ ТЕД Й ЧЯЧЕДЕФЕ C-u 0 C-l (ФПЧБ Е - CONTROL-L, ОЕ CONTROL-1). +>> Придвижете курсора до този ред и въведете C-u 0 C-l (това е + CONTROL-L, не CONTROL-1). ->> уЕЗБ ЧЯЧЕДЕФЕ C-x 2, ЛПЕФП ЭЕ ТБЪДЕМЙ ЕЛТБОБ ОБ ДЧБ ПФДЕМОЙ - РТПЪПТЕГБ. дЧБФБ РТПЪПТЕГБ РПЛБЪЧБФ ФПЧБ ЧЯЧЕДЕОЙЕ. лХТУПТЯФ - ПУФБЧБ ОБ РП-ЗПТОЙС РТПЪПТЕГ. +>> Сега въведете C-x 2, което ще раздели екрана на два отделни + прозореца. Двата прозореца показват това въведение. Курсорът + остава на по-горния прозорец. ->> чЯЧЕДЕФЕ C-M-v ЪБ ДБ УЛТПМЙТБФЕ ДПМОЙС РТПЪПТЕГ. (бЛП ОСНБФЕ - ЙУФЙОУЛЙ ЛМБЧЙЫ META, ЧЯЧЕДЕФЕ ESC C-v.) +>> Въведете C-M-v, за да скролирате долния прозорец. (Ако нямате + истински клавиш META, въведете ESC C-v.) ->> чЯЧЕДЕФЕ C-x o ("o" ПФ "other" -- "ДТХЗ") ЪБ ДБ РТЙДЧЙЦЙФЕ ЛХТУПТБ - Ч ДПМОЙС РТПЪПТЕГ. ->> йЪРПМЪЧБКФЕ C-v Й M-v Ч ДПМОЙС РТПЪПТЕГ ЪБ ДБ ЗП УЛТПМЙТБФЕ. - рТПДЯМЦЕФЕ ЮЕФЕОЕФП ОБ ФЕЪЙ ОБУПЛЙ ПФ ЧЯЧЕДЕОЙФЕП Ч ЗПТОЙС - РТПЪПТЕГ. +>> Въведете C-x o ("o" от "other" -- "друг"), за да придвижите + курсора в долния прозорец. +>> Използвайте C-v и M-v в долния прозорец, за да го скролирате. + Продължете четенето на тези насоки от въведението в горния + прозорец. ->> чЯЧЕДЕФЕ C-x o ПФОПЧП ЪБ ДБ РТЙДЧЙЦЙФЕ ЛХТУПТБ ПФОПЧП Ч ЗПТОЙС - РТПЪПТЕГ. лХТУПТЯФ Ч ЗПТОЙС РТПЪПТЕГ Е ФПЮОП ФБН, ЛЯДЕФП Е ВЙМ - РТЕДЙ. +>> Въведете C-x o отново, за да придвижите курсора отново в горния + прозорец. Курсорът в горния прозорец е точно там, където е бил + преди. -нПЦЕ ДБ РТПДЯМЦЙФЕ ДБ ЙЪРПМЪЧБФЕ C-x o ЪБ ДБ РТЕЧЛМАЮЧБФЕ НЕЦДХ -РТПЪПТГЙФЕ. чУЕЛЙ РТПЪПТЕГ ЙНБ УПВУФЧЕОП НСУФП ОБ ЛХТУПТБ, ОП УБНП -ЕДЙО РТПЪПТЕГ РПЛБЪЧБ ЛХТУПТ. чУЙЮЛЙ ПВЙЛОПЧЕОЙ ЛПНБОДЙ ЪБ -ТЕДБЛФЙТБОЕ УЕ РТЙМБЗБФ Ч РТПЪПТЕГБ, Ч ЛПКФП Е ЛХТУПТЯФ. оЙЕ ОБТЙЮБНЕ -ФПЪЙ РТПЪПТЕГ "ФЕЛХЭ РТПЪПТЕГ". +Може да продължите да използвате C-x o, за да превключвате между +прозорците. Всеки прозорец има собствено място на курсора, но само +един прозорец показва курсор. Всички обикновени команди за +редактиране се прилагат в прозореца, в който е курсорът. Ние наричаме +този прозорец "текущ прозорец". -лПНБОДБФБ C-M-v Е НОПЗП РПМЕЪОБ, ЛПЗБФП ТЕДБЛФЙТБФЕ ФЕЛУФ Ч ЕДЙО -РТПЪПТЕГ Й ЙЪРПМЪЧБФЕ ДТХЗЙС РТПЪПТЕГ РТПУФП ЪБ УРТБЧЛБ. нПЦЕ ДБ -ДЯТЦЙФЕ ЛХТУПТБ ЧЙОБЗЙ Ч РТПЪПТЕГБ, ЛЯДЕФП ТЕДБЛФЙТБФЕ, Й ДБ -ОБРТЕДЧБФЕ РПУМЕДПЧБФЕМОП Ч ДТХЗЙС РТПЪПТЕГ ЮТЕЪ C-M-v. +Командата C-M-v е много полезна, когато редактирате текст в един +прозорец и използвате другия прозорец просто за справка. Може да +държите курсора винаги в прозореца, където редактирате, и да +напредвате последователно в другия прозорец чрез C-M-v. -C-M-v Е РТЙНЕТ ЪБ ЪОБЛ CONTROL-META. бЛП ЙНБФЕ ЙУФЙОУЛЙ ЛМБЧЙЫ META, -НПЦЕ ДБ ЧЯЧЕЦДБФЕ C-M-v ЪБДЯТЦБКЛЙ ЕДОПЧТЕНЕООП CONTROL Й META ДПЛБФП -ЧЯЧЕЦДБФЕ v. оСНБ ЪОБЮЕОЙЕ ДБМЙ CONTROL ЙМЙ META "Е ОБФЙУОБФ РЯТЧЙ", -ЪБЭПФП Й ДЧБФБ ЛМБЧЙЫБ ДЕКУФЧБФ НПДЙЖЙГЙТБКЛЙ ЪОБЛБ, ЛПКФП УФЕ ЧЯЧЕМЙ. +C-M-v е пример за знак CONTROL-META. Ако имате истински клавиш META, +може да въвеждате C-M-v, задържайки едновременно CONTROL и META, +докато въвеждате v. Няма значение дали CONTROL или META "е натиснат +първи", защото и двата клавиша действат, модифицирайки знака, който +сте въвели. -бЛП ОСНБФЕ ЙУФЙОУЛЙ ЛМБЧЙЫ META, Й ЙЪРПМЪЧБФЕ ESC ЧНЕУФП ФПЧБ, ТЕДЯФ -ЙНБ ЪОБЮЕОЙЕ: ФТСВЧБ ДБ ЧЯЧЕЦДБФЕ ESC РПУМЕДЧБО ПФ CONTROL-v, ЪБЭПФП -CONTROL-ESC v ОСНБ ДБ ТБВПФЙ. фПЧБ Е ФБЛБ, ЪБЭПФП ESC Е УПВУФЧЕО -ЪОБЛ, Б ОЕ НПДЙЖЙЛБФПТ. +Ако нямате истински клавиш META и използвате ESC вместо това, редът +има значение: трябва да въвеждате ESC, последван от CONTROL-v, защото +CONTROL-ESC v няма да работи. Това е така, защото ESC е собствен +знак, а не модификатор. ->> чЯЧЕДЕФЕ C-x 1 (Ч ЗПТОЙС РТПЪПТЕГ) ЪБ ДБ НБИОЕФЕ ДПМОЙС РТПЪПТЕГ. +>> Въведете C-x 1 (в горния прозорец), за да махнете долния прозорец. -(бЛП УФЕ ЧЯЧЕМЙ C-x 1 Ч ДПМОЙС РТПЪПТЕГ, ФПЧБ ЭЕ НБИОЕ ЗПТОЙС. -нЙУМЕФЕ ЪБ ФБЪЙ ЛПНБОДБ ЛБФП "ъБДТЯЦ ФПЮОП ЕДЙО РТПЪПТЕГ -- ФПЪЙ, Ч -ЛПКФП УЯН УЕЗБ".) +(Ако сте въвели C-x 1 в долния прозорец, това ще махне горния. +Мислете за тази команда като "Задръж точно един прозорец -- този, в +който съм сега".) -оСНБ ОХЦДБ ДБ ЙЪЧЕЦДБФЕ ЕДЙО Й УЯЭЙ ВХЖЕТ Ч ДЧБФБ РТПЪПТЕГБ. бЛП -ЙЪРПМЪЧБФЕ C-x C-f ЪБ ДБ ОБНЕТЙФЕ ЖБКМ Ч ЕДЙОЙС РТПЪПТЕГ, ДТХЗЙСФ -РТПЪПТЕГ ОЕ УЕ РТПНЕОС. нПЦЕ ДБ ОБНЙТБФЕ ЖБКМ ПФДЕМОП ЧЯЧ ЧУЕЛЙ ЖБКМ. +Няма нужда да извеждате един и същи буфер в двата прозореца. Ако +използвате C-x C-f, за да намерите файл в единия прозорец, другият +прозорец не се променя. Може да намирате файл във всеки прозорец, +независимо от това какво има в другите прозорци. -еФП ПЭЕ ЕДЙО ОБЮЙО ДБ ЙЪРПМЪЧБФЕ ДЧБ РТПЪПТЕГБ ЪБ ДБ РПЛБЦЕФЕ ДЧЕ -ТБЪМЙЮОЙ ОЕЭБ: +Ето още един начин да използвате два прозореца, за да покажете две +различни неща: ->> чЯЧЕДЕФЕ C-x 4 C-f РПУМЕДЧБОП ПФ ЙНЕФП ОБ ЕДЙО ПФ ЧБЫЙФЕ ЖБКМПЧЕ. - ъБЧЯТЫЕФЕ У <Return>. чЙЦФЕ ЛБЛ ФПЪЙ ЖБКМ УЕ РПСЧСЧБ Ч ДПМОЙС - РТПЪПТЕГ. лХТУПТЯФ УЯЭП ПФЙЧБ ФБН. +>> Въведете C-x 4 C-f, последвано от името на един от вашите файлове. + Завършете с <Return>. Вижте как този файл се появява в долния + прозорец. Курсорът също отива там. ->> чЯЧЕДЕФЕ C-x o, ЪБ ДБ УЕ ЧЯТОЕФЕ Ч ЗПТОЙС РТПЪПТЕГ, Й C-x 1 ЪБ ДБ - ЙЪФТЙЕФЕ ДПМОЙС. +>> Въведете C-x o, за да се върнете в горния прозорец, и C-x 1, за да + изтриете долния. -* чмпцеой ойчб об тедблфйтбое --------------------------------- +* ВЛОЖЕНИ НИВА НА РЕДАКТИРАНЕ +----------------------------- -рПОСЛПЗБ ЭЕ УЕ ПЪПЧЕФЕ Ч ФПЧБ, ЛПЕФП УЕ ОБТЙЮБ "ЧМПЦЕОП ОЙЧП ОБ -ТЕДБЛФЙТБОЕ" (recursive editing level). фПЧБ УЕ ПФВЕМСЪЧБ ПФ -ЛЧБДТБФОЙ УЛПВЙ Ч ТЕДБ ОБ ТЕЦЙНБ, ЛПЙФП ПЗТБЦДБФ УЛПВЙФЕ ПЛПМП ЙНЕФП -ОБ ЗМБЧОЙС ТЕЦЙН. оБРТЙНЕТ, НПЦЕ ДБ ЧЙДЙФЕ [(Fundamental)] ЧНЕУФП +Понякога ще се озовете в това, което се нарича "вложено ниво на +редактиране" (recursive editing level). Това се отбелязва от +квадратни скоби в реда на режима, които ограждат скобите около името +на главния режим. Например, може да видите [(Fundamental)] вместо (Fundamental). -ъБ ДБ УЕ НБИОЕФЕ ПФ ЧМПЦЕОПФП ОЙЧП ОБ ТЕДБЛФЙТБОЕ, ЧЯЧЕДЕФЕ ESC ESC -ESC. фПЧБ Е ПВЭБ ЛПНБОДБ ЪБ "ЙЪМЙЪБОЕ". нПЦЕ Й ДБ С ЙЪРПМЪЧБФЕ ЪБ -НБИБОЕ ОБ ДПРЯМОЙФЕМОЙ РТПЪПТГЙ, Й НБИБОЕ ПФ НЙОЙВХЖЕТБ. +За да се махнете от вложеното ниво на редактиране, въведете ESC ESC +ESC. Това е обща команда за "излизане". Може и да я използвате за +махане (скриване) на допълнителни прозорци, както и за да се махнете +от минибуфера. ->> чЯЧЕДЕФЕ M-x ЪБ ДБ ЧМЕЪЕФЕ Ч НЙОЙВХЖЕТ; ФПЗБЧБ ЧЯЧЕДЕФЕ ESC ESC ESC - ЪБ ДБ ЙЪМЕЪЕФЕ. +>> Въведете M-x, за да влезете в минибуфер; тогава въведете ESC ESC + ESC, за да излезете. -оЕ НПЦЕФЕ ДБ ЙЪРПМЪЧБФЕ C-g ЪБ ДБ ЙЪМЕЪЕФЕ ПФ ЧМПЦЕОП ОЙЧП ОБ -ТЕДБЛФЙТБОЕ. фПЧБ Е ФБЛБ, ЪБЭПФП C-g УЕ ЙЪРПМЪЧБ ЪБ РТЕЛТБФСЧБОЕ ОБ -ЛПНБОДЙ Й БТЗХНЕОФЙ чяфте ЧЯЧ ЧМПЦЕОП ОЙЧП ОБ ТЕДБЛФЙТБОЕ. +Не можете да използвате C-g, за да излезете от вложено ниво на +редактиране. Това е така, защото C-g се използва за прекратяване на +команди и аргументи ВЪТРЕ във вложено ниво на редактиране. -* рпмхюбчбое об дпрямойфемоб рпнпэ +* ПОЛУЧАВАНЕ НА ДОПЪЛНИТЕЛНА ПОМОЩ ---------------------------------- -ч ФПЧБ ЧЯЧЕДЕОЙЕ УЕ ПРЙФБИНЕ ДБ ПУЙЗХТЙН ДПУФБФЯЮОП ЙОЖПТНБГЙС, ЪБ ДБ -ЪБРПЮОЕФЕ ДБ ЙЪРПМЪЧБФЕ еНБЛУ. йНБ ФПМЛПЧБ НОПЗП ПЭЕ Ч еНБЛУ, ЮЕ ОЕ Е -ЧЯЪНПЦОП ФП ДБ ВЯДЕ ПВСУОЕОП ЧУЙЮЛПФП ФХЛ. пВБЮЕ НПЦЕ ДБ РПЙУЛБФЕ ДБ -ОБХЮЙФЕ РПЧЕЮЕ ЪБ еНБЛУ, ФЯК ЛБФП ФПК РТЙФЕЦБЧБ ПЭЕ НОПЗП РПМЕЪОЙ -УРПУПВОПУФЙ. еНБЛУ ЙНБ ЛПНБОДЙ ЪБ ЮЕФЕОЕ ОБ ДПЛХНЕОФБГЙСФБ ОБ еНБЛУ -ЛПНБОДЙФЕ. фЕЪЙ "РПНПЭОЙ" ЛПНБОДЙ ЧУЙЮЛЙ ЪБРПЮЧБФ УЯУ ЪОБЛБ -CONTROL-h, ЛПКФП УЕ ОБТЙЮБ "ЪОБЛЯФ ЪБ РПНПЭ". +В това въведение се опитахме да осигурим достатъчно информация, за да +започнете да използвате Емакс. Има толкова много още в Емакс, че не е +възможно то да бъде обяснено всичкото тук. Обаче може да поискате да +научите повече за Емакс, тъй като той притежава още много полезни +способности. Емакс има команди за четене на документацията на Емакс +командите. Тези "помощни" команди всички започват със знака +CONTROL-h, който се нарича "знакът за помощ". -ъБ ДБ ЙЪРПМЪЧБФЕ УРПУПВОПУФЙФЕ ОБ ФБЪЙ РПНПЭ, ЧЯЧЕДЕФЕ ЪОБЛБ C-h, Й -УМЕД ФПЧБ ЪОБЛБ, ЛБЪЧБЭ ЛБЛЯЧ ЧЙД РПНПЭ ЙУЛБФЕ. бЛП обйуфйоб УФЕ УЕ -ЙЪЗХВЙМЙ ЧЯЧЕДЕФЕ C-h ? Й еНБЛУ ЭЕ ЧЙ ЛБЦЕ У ЛБЛЧП НПЦЕ ДБ ЧЙ -РПНПЗОЕ. бЛП УФЕ ЧЯЧЕМЙ C-h Й ТЕЫЙФЕ, ЮЕ ОЕ УЕ ОХЦДБЕФЕ ПФ РПНПЭ, -РТПУФП ЧЯЧЕДЕФЕ C-g ЪБ ДБ С РТЕЛТБФЙФЕ. +За да използвате възможностите на тази помощ, въведете знака C-h и +след това знака, казващ какъв вид помощ искате. Ако НАИСТИНА сте се +изгубили, въведете C-h ? и Емакс ще ви каже с какво може да ви +помогне. Ако сте въвели C-h и решите, че не се нуждаете от помощ, +просто въведете C-g, за да я прекратите. -(оСЛПЙ ЛПНРАФТЙ РТПНЕОСФ ЪОБЮЕОЙЕФП ОБ ЪОБЛБ C-h. фЕ ОБЙУФЙОБ ОЕ -ФТСВЧБ ДБ РТБЧСФ ФПЧБ ЛБФП УМСРБ НСТЛБ ЪБ ЧУЙЮЛЙ РПФТЕВЙФЕМЙ, ФБЛБ ЮЕ -ЙНБФЕ ПУОПЧБОЙЕ ДБ УЕ ПРМБЮЕФЕ ОБ УЙУФЕНОЙС БДНЙОЙУФТБФПТ. нЕЦДХ -ДТХЗПФП, БЛП C-h ОЕ ЙЪЧЕЦДБ УЯПВЭЕОЙЕ ЪБ РПНПЭ Ч ДЯОПФП ОБ ЕЛТБОБ, -ПРЙФБКФЕ ЛМБЧЙЫБ F1 ЙМЙ M-x help <Return> ЧНЕУФП ФПЧБ.) +(Някои компютри променят значението на знака C-h. Те наистина не +трябва да правят това като сляпа мярка за всички потребители, така че +имате основание да се оплачете на системния администратор. Между +другото, ако C-h не извежда съобщение за помощ в дъното на екрана, +опитайте клавиша F1 или M-x help <Return> вместо това.) -оБК-ПУОПЧОБФБ РПНПЭОБ УРПУПВОПУФ Е C-h c. чЯЧЕДЕФЕ C-h, ЪОБЛБ c, Й -ЛПНБОДЕО ЪОБЛ ЙМЙ РПУМЕДПЧБФЕМОПУФ ПФ ЪОБГЙ ПВТБЪХЧБЭБ ЛПНБОДБ; ФПЗБЧБ -еНБЛУ ЭЕ ЙЪЧЕДЕ НОПЗП ЛТБФЛП ПРЙУБОЙЕ ОБ ЛПНБОДБФБ. +Най-основното помощно средство е C-h c. Въведете C-h, знака c и +команден знак или последователност от знаци, образуващи команда; +тогава Емакс ще изведе много кратко описание на командата. >> Type C-h c C-p. - фПЧБ УЯПВЭЕОЙЕ ФТСВЧБ ДБ ЙЪЧЕДЕ ОЕЭП ЛБФП + +Изведеното описание трябва да бъде нещо като C-p runs the command previous-line - (C-p ЙЪРЯМОСЧБ ЛПНБОДБФБ РТЕДЙЫЕО-ТЕД) + (C-p изпълнява командата предишен-ред) -фПЧБ ЧЙ ЛБЪЧБ "ЙНЕФП ОБ ЖХОЛГЙСФБ". йНЕОБФБ ОБ ЖХОЛГЙЙФЕ УЕ ЙЪРПМЪЧБФ -ОБК-ЧЕЮЕ ЪБ ОБУФТПКЧБОЕ Й ТБЪЫЙТСЧБОЕ ОБ еНБЛУ. оП ФЯК ЛБФП ЙНЕОБФБ -ОБ ЖХОЛГЙЙФЕ УБ ЙЪВТБОЙ ФБЛБ, ЮЕ ДБ РПЛБЪЧБФ ЛБЛЧП РТБЧЙ ЛПНБОДБФБ, ФЕ -НПЗБФ ДБ УМХЦБФ Й ЪБ НОПЗП ЛТБФЛБ ДПЛХНЕОФБГЙС -- ДПУФБФЯЮОБ ЪБ ДБ ЧЙ -РТЙРПНОЙ ЛПНБОДЙ, ЛПЙФП ЧЕЮЕ УФЕ ХЮЙМЙ. +Това ви казва "името на функцията". Имената на функциите се използват +най-вече за настройване и разширяване на Емакс. Но тъй като имената +на функциите са избрани така, че да показват какво прави командата, те +могат да служат и за много кратка документация -- достатъчна, за да ви +припомни команди, които вече сте учили. -нОПЗПЪОБЛПЧЙ ЛПНБОДЙ, ЛБФП C-x C-s Й (БЛП ОСНБФЕ ЛМБЧЙЫ META ЙМЙ EDIT -ЙМЙ ALT) <ESC>v УЯЭП УБ РПЪЧПМЕОЙ УМЕД C-h c. +Многознакови команди, като C-x C-s и (ако нямате клавиш META или EDIT +или ALT) <ESC>v, също са позволени след C-h c. -ъБ ДБ РПМХЮЙФЕ ПЭЕ ЙОЖПТНБГЙС ЪБ ЛПНБОДБ, ЙЪРПМЪЧБКФЕ C-h k ЧНЕУФП C-h +За да получите още информация за команда, използвайте C-h k вместо C-h c. ->> чЯЧЕДЕФЕ C-h k C-p. +>> Въведете C-h k C-p. -фПЧБ ЙЪЧЕЦДБ ДПЛХНЕОФБГЙСФБ ОБ ЖХОЛГЙСФБ, ЛБЛФП Й ОЕКОПФП ЙНЕ, Ч -ПФДЕМЕО еНБЛУ РТПЪПТЕГ. лПЗБФП С РТПЮЕФЕФЕ, ЧЯЧЕДЕФЕ C-x 1 ЪБ ДБ -НБИОЕФЕ РПНПЭОЙС ФЕЛУФ. оЕ Е ОХЦОП ДБ РТБЧЙФЕ ФПЧБ ФПЮОП УЕЗБ. нПЦЕ -ДБ ТЕДБЛФЙТБФЕ ДПЛБФП УЕ ПВТЯЭБФЕ ЛЯН РПНПЭОЙС ФЕЛУФ ЪБ УРТБЧЛБ, Й -УМЕД ФПЧБ ДБ ЧЯЧЕДЕФЕ C-x 1. +Това извежда документацията на функцията, както и нейното име, в +отделен Емакс прозорец. Когато я прочетете, въведете C-x 1, за да +махнете помощния текст. Не е нужно да правите това точно сега. Може +да редактирате, докато се обръщате към помощния текст за справка, и +след това да въведете C-x 1. -еФП ПЭЕ ОСЛПМЛП РПМЕЪОЙ C-h ЧЯЪНПЦОПУФЙ: +Ето още няколко полезни C-h възможности: - C-h f пРЙУЧБ ЖХОЛГЙС. фТСВЧБ ДБ ЧЯЧЕДЕФЕ ЙНЕФП ОБ - ЖХОЛГЙСФБ. + C-h f Описва функция. Трябва да въведете името на + функцията. ->> пРЙФБКФЕ У ЧЯЧЕЦДБОЕ ОБ C-h f previous-line<Return>. - фПЧБ ЙЪЧЕЦДБ ГСМБФБ ЙОЖПТНБГЙС, ЛПСФП еНБЛУ ЪОБЕ ЪБ ЖХОЛГЙСФБ, - ЛПСФП ПУЯЭЕУФЧСЧБ ЛПНБОДБФБ C-p. +>> Опитайте с въвеждане на C-h f previous-line<Return>. + Това извежда цялата информация, която Емакс знае за функцията, + която осъществява командата C-p. -рПДПВОБ ЛПНБОДБ, C-h v, ЙЪЧЕЦДБ ДПЛХНЕОФБГЙСФБ ОБ РТПНЕОМЙЧЙФЕ, ЛПЙФП -НПЦЕ ДБ РТПНЕОСФЕ, ЪБ ДБ ОБУФТПКЧБФЕ РПЧЕДЕОЙЕФП ОБ еНБЛУ. фТСВЧБ ДБ -ЧЯЧЕДЕФЕ ЙНЕФП ОБ РТПНЕОМЙЧБФБ, ЛПЗБФП еНБЛУ ЧЙ РПДУЛБЦЕ ФПЧБ. +Подобна команда, C-h v, извежда документацията на променливите, които +може да променяте, за да настройвате поведението на Емакс. Трябва да +въведете името на променливата, когато Емакс ви подскаже това. - C-h a лПНБОДБ бРТПРПУ. чЯЧЕЦДБФЕ ЛМАЮПЧБ ДХНБ Й еНБЛУ ЭЕ - РПЛБЦЕ УРЙУЯЛ ОБ ЧУЙЮЛЙ ЛПНБОДЙ, ЮЙЕФП ЙНЕ УЯДЯТЦБ - ФБЪЙ ЛМАЮПЧБ ДХНБ. фЕЪЙ ЛПНБОДЙ НПЗБФ ЧУЙЮЛЙ ДБ ВЯДБФ - ЙЪЧЙЛБОЙ ЮТЕЪ META-x. ъБ ОСЛПЙ ЛПНБОДЙ ЛПНБОДБФБ - бРТПРПУ ЭЕ ЙЪЧЕДЕ ДПРЯМОЙФЕМОП ЕДОПЪОБЛПЧБ ЙМЙ - ДЧХЪОБЛПЧБ РПУМЕДПЧБФЕМОПУФ ПФ ЛМБЧЙЫЙ, ЛПСФП РХУЛБФ - УЯЭБФБ ЛПНБОДБ. + C-h a Команда Апропос. Въведете ключова дума и Емакс ще + покаже списък на всички команди, чието име съдържа + тази ключова дума. Тези команди могат всички да бъдат + извикани чрез META-x. За някои команди командата + Апропос ще изведе допълнително еднознакова или + двузнакова последователност от клавиши, която пуска + същата команда. ->> чЯЧЕДЕФЕ C-h a file<Return>. +>> Въведете C-h a file<Return>. -фПЧБ ЙЪЧЕЦДБ Ч ДТХЗ РТПЪПТЕГ УРЙУЯЛ ОБ ЧУЙЮЛЙ M-x ЛПНБОДЙ, ЛПЙФП -УЯДЯТЦБФ "file" Ч ФСИОПФП ЙНЕ. эЕ ЧЙДЙФЕ ЪОБЛПЧЙ ЛПНБОДЙ ЛБФП C-x C-f -ЙЪВТПЕОЙ ЙЪНЕЦДХ УЯПФЧЕФОЙФЕ ЙНЕОБ ОБ ЛПНБОДЙ, ЛБФП find-file. +Това извежда в друг прозорец списък на всички M-x команди, които +съдържат "file" в тяхното име. Ще видите знакови команди като C-x +C-f, изброени измежду съответните имена на команди, като find-file. ->> чЯЧЕДЕФЕ C-M-v ЪБ ДБ УЛТПМЙТБФЕ РПНПЭОЙС РТПЪПТЕГ. оБРТБЧЕФЕ ЗП - ОСЛПМЛП РЯФЙ. +>> Въведете C-M-v, за да скролирате помощния прозорец. Направете го + няколко пъти. ->> чЯЧЕДЕФЕ C-x 1 ЪБ ДБ ЙЪФТЙЕФЕ РПНПЭОЙС РТПЪПТЕГ. +>> Въведете C-x 1, за да изтриете помощния прозорец. - C-h i юЕФЕОЕ ОБ ТЯЛПЧПДУФЧБ (Info). фБЪЙ ЛПНБОДБ ЧЙ РТБЭБ Ч - УРЕГЙБМЕО ВХЖЕТ ОБТЙЮБО `*info*', ЛЯДЕФП НПЦЕ ДБ - ЮЕФЕФЕ ТЯЛПЧПДУФЧБФБ ОБ ЙОУФБМЙТБОЙФЕ ЧЯЧ ЧБЫБФБ - УЙУФЕНБ РБЛЕФЙ. чЯЧЕДЕФЕ m emacs <Return> ЪБ ДБ - ЮЕФЕФЕ ТЯЛПЧПДУФЧПФП ОБ еНБЛУ. бЛП ОЙЛПЗБ РТЕДЙ ФПЧБ - ОЕ УФЕ ЙЪРПМЪЧБМЙ Info, ЧЯЧЕДЕФЕ ? Й еНБЛУ ЭЕ ЧЛМАЮЙ - ЧЯЧЕДЕОЙЕ ЪБ ЧЯЪНПЦОПУФЙФЕ ОБ ТЕЦЙНБ йОЖП. чЕДОЯЦ УМЕД - ЛБФП УФЕ РТЕНЙОБМЙ ФПЧБ ЧЯЧЕДЕОЙЕ, ФТСВЧБ ДБ УЕ - ЛПОУХМФЙТБФЕ У еНБЛУ йОЖП ТЯЛПЧПДУФЧПФП ЛБФП ЧБЫБ - ПУОПЧОБ ДПЛХНЕОФБГЙС. + C-h i Четене на ръководства (Info). Тази команда ви праща в + специален буфер, наричан "*info*", където може да + четете ръководствата на инсталираните във вашата + система пакети. Въведете m emacs <Return>, за да + четете ръководството на Емакс. Ако никога преди това + не сте използвали Info, въведете ? и Емакс ще включи + въведение във възможностите на режима Инфо. Веднъж + след като сте преминали това въведение, трябва да се + консултирате с Емакс Инфо ръководството като ваша + основна документация. -* пэе чяънпцопуфй +* ОЩЕ ВЪЗМОЖНОСТИ ----------------- -нПЦЕ ДБ ОБХЮЙФЕ РПЧЕЮЕ ЪБ еНБЛУ У ЮЕФЕОЕ ОБ ОЕЗПЧПФП ТЯЛПЧПДУФЧП, ЙМЙ -ЛБФП ЛОЙЗБ, ЙМЙ Ч йОЖП (ЙЪРПМЪЧБКФЕ НЕОАФП РПНПЭ (Help) ЙМЙ ЧЯЧЕДЕФЕ -F10 h r). дЧЕ ЧЯЪНПЦОПУФЙ, ЛПЙФП НПЦЕ ДБ ЦЕМБЕФЕ Ч ОБЮБМПФП, УБ -ДПЧЯТЫЧБОЕ (completion), ЛПЕФП УРЕУФСЧБ РЙУБОЕ, Й dired, ЛПКФП -ПРТПУФСЧБ ВПТБЧЕОЕФП У ЖБКМПЧЕ. +Може да научите повече за Емакс с четене на неговото ръководство, или +като книга, или в Инфо (използвайте менюто помощ (Help) или въведете +F10 h r). Две възможности, които може да желаете в началото, са +довършване (completion), което спестява писане, и dired, който +опростява боравенето с файлове. -дПЧЯТЫЧБОЕФП Е ОБЮЙО ДБ ЙЪВСЗЧБФЕ ОЕОХЦОП РЙУБОЕ. оБРЙТНЕТ, БЛП -ЙУЛБФЕ ДБ РТЕЧЛМАЮЙФЕ ЛЯН ВХЖЕТБ *Messages*, НПЦЕ ДБ ЧЯЧЕДЕФЕ C-x b -*M<Tab> Й еНБЛУ ЭЕ ЪБРЯМОЙ ПУФБОБМБФБ ЮБУФ ПФ ЙНЕФП ОБ ВХЖЕТБ, -ДПЛПМЛПФП НПЦЕ ДБ УЕ ПРТЕДЕМЙ ПФ ФПЧБ, ЛПКФП УФЕ ЧЯЧЕМЙ. дПЧЯТЫЧБОЕФП -Е ПРЙУБОП Ч йОЖП-ТЯЛПЧПДУФЧПФП ОБ еНБЛУ Ч РБТЮЕФП "дПЧЯТЫЧБОЕ" +Довършването е начин да избягвате ненужно писане. Например, ако +искате да превключите към буфера *Messages*, може да въведете C-x b +*M<Tab> и Емакс ще запълни останалата част от името на буфера, +доколкото може да се определи от това, което сте въвели. Довършването +е описано в Инфо-ръководството на Емакс в страницата "Довършване" ("Completion"). -Dired ЧЙ РПЪЧПМСЧБ ДБ ЗМЕДБФЕ УРЙУЯЛБ ПФ ЖБКМПЧЕ Ч ДЙТЕЛФПТЙС (Й ЛБФП -ЧЯЪНПЦОПУФ ОЕКОЙФЕ РПДДЙТЕЛФПТЙЙ), ДБ УЕ РТЙДЧЙЦЧБФЕ Ч ФПЪЙ УРЙУЯЛ, ДБ -РПУЕЭБЧБФЕ, РТЕЙНЕОХЧБФЕ, ЙЪФТЙЧБФЕ Й ЙЪПВЭП ДЕКУФЧБФЕ ЧЯТИХ -ЖБКМПЧЕФЕ. Dired Е ПРЙУБО Ч йОЖП-ТЯЛПЧПДУФЧПФП ОБ еНБЛУ Ч РБТЮЕФП +Dired ви позволява да гледате списъка от файлове в директория (и като +възможност: нейните поддиректории), да се придвижвате в този списък, +да посещавате, преименувате, изтривате и изобщо действате върху +файловете. Dired е описан в Инфо-ръководството на Емакс в страницата "Dired". -тЯЛПЧПДУФЧПФП ОБ еНБЛУ ПРЙУЧБ ПЭЕ НОПЗП ДТХЗЙ ЧЯЪНПЦОПУФЙ ОБ -ТЕДБЛФПТБ. +Ръководството на Емакс описва още много други възможности на +редактора. -* ъблмаюеойе +* ЗАКЛЮЧЕНИЕ ------------ -ъБРПНОЕФЕ, ЪБ ДБ ЙЪМЕЪЕФЕ ВЕЪЧЯЪЧТБФОП ПФ еНБЛУ ЙЪРПМЪЧБКФЕ C-x C-c. -ъБ ДБ ЙЪМЕЪЕФЕ ЧТЕНЕООП Ч ПВЧЙЧЛБ, ФБЛБ ЮЕ ДБ УЕ ЧЯТОЕФЕ Ч еНБЛУ -РП-ЛЯУОП, ЙЪРПМЪЧБКФЕ C-z. +Запомнете: за да излезете безвъзвратно от Емакс, използвайте C-x C-c. +За да излезете временно в обвивка, така че да се върнете в Емакс +по-късно, използвайте C-z. -фПЧБ ЧЯЧЕДЕОЙЕ Е РТЕДЧЙДЕОП ДБ ВЯДЕ ТБЪВЙТБЕНП ЪБ ЧУЙЮЛЙ ОПЧЙ -РПФТЕВЙФЕМЙ, ФБЛБ ЮЕ БЛП ОБНЙТБФЕ ОЕЭП ОЕСУОП, ОЕ УЕ УБНППВЧЙОСЧБКФЕ --- ПРМБЮЕФЕ УЕ! +Това въведение е предвидено да бъде разбираемо за всички нови +потребители, така че ако намирате нещо неясно, не се самообвинявайте +-- оплачете се! -* лпрйтбое +* КОПИРАНЕ ---------- -фПЧБ ЧЯЧЕДЕОЙЕ РТПЙЪМЙЪБ ПФ ДЯМЗБ РПТЕДЙГБ ЧЯЧЕДЕОЙС Ч еНБЛУ -ЪБРПЮЧБКЛЙ ПФ ЕДОП ОБРЙУБОП ПФ уФАЯТФ лТБЛТБЖФ ЪБ ОБЮБМОЙС еНБЛУ. +Това въведение произлиза от дълга поредица въведения в Емакс, +започвайки от едно, написано от Стюърт Кракрафт за началния Емакс. -фБЪЙ ЧЕТУЙС ОБ ЧЯЧЕДЕОЙЕФП, ЛБЛФП Й зох еНБЛУ, Е ЪБЭЙФЕОБ У БЧФПТУЛЙ -РТБЧБ Й ЙДЧБ У ТБЪТЕЫЕОЙЕ ДБ ТБЪРТПУФТБОСЧБФЕ ЛПРЙС РТЙ УМЕДОЙФЕ -ХУМПЧЙС: +Тази версия на въведението, както и ГНУ Емакс, е защитена с авторски +права и идва с разрешение да разпространявате копия при следните +условия: This version of the tutorial, like GNU Emacs, is copyrighted, and comes with permission to distribute copies on certain conditions: @@ -1181,15 +1183,15 @@ under the above conditions, provided also that they carry prominent notices stating who last altered them. -хУМПЧЙСФБ ЪБ ЛПРЙТБОЕ ОБ УБНЙС еНБЛУ УБ РП-УМПЦОЙ, ОП Ч УЯЭЙС ДХИ. -нПМС РТПЮЕФЕФЕ ЖБКМБ COPYING Й ФПЗБЧБ ДБЧБКФЕ ЛПРЙС ОБ зох еНБЛУ ОБ -УЧПЙ РТЙСФЕМЙ. рПНПЗОЕФЕ ДБ УРТЕН ЪБФЧПТЕОПУФФБ ОБ РТПЗТБНЙФЕ -("РТЙФЕЦБОЙЕФП") ЛБФП ЙЪРПМЪЧБНЕ, РЙЫЕН Й УРПДЕМСНЕ УЧПВПДЕО УПЖФХЕТ! +Условията за копиране на самия Емакс са по-сложни, но в същия дух. +Моля, прочетете файла COPYING и тогава давайте копия на ГНУ Емакс на +свои приятели. Помогнете да спрем затвореността на програмите +("притежанието"), като използваме, пишем и споделяме свободен софтуер! -рТЕЧПДЯФ ОБ ВЯМЗБТУЛЙ Е ЙЪЧЯТЫЕО ПФ пЗОСО лХМЕЧ +Преводът на български е извършен от Огнян Кулев <ogi@fmi.uni-sofia.bg>. ;;; Local Variables: -;;; coding: koi8-r +;;; coding: windows-1251 ;;; End: ;;; arch-tag: 70cf6ad7-c2e4-41fe-8199-74aa52683b0e
--- a/lisp/ChangeLog Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/ChangeLog Tue Dec 30 17:05:05 2003 +0000 @@ -1,3 +1,192 @@ +2003-12-30 Eli Zaretskii <eliz@elta.co.il> + + * mail/rmail.el (rmail-convert-to-babyl-format): Fix off-by-one + error in arguments to base64-decode-region. Remove ^M characters + after decoding base64. + +2003-12-30 Simon Josefsson <jas@extundo.com> + + * textmodes/texinfo.el: Change maintainer to FSF. Suggested by + karl@freefriends.org (Karl Berry), since the Texinfo Elisp files + have only been distributed with Emacs for some years. + (texinfo-mode-hook): Customize. + +2003-12-30 Eli Zaretskii <eliz@elta.co.il> + + * mail/rmail.el (rmail-convert-to-babyl-format): Make the code + cleaner (suggested by Richard Stallman). + + * progmodes/gud.el (gud-tool-bar-map): Modify names of icon files + for gud-next, gud-nexti, gud-step and gud-stepi to prevent + file-name clashes on 8+3 DOS filesystems. + + * toolbar/gud-next.pbm, toolbar/gud-next.xpm + * toolbar/gud-nexti.pbm, toolbar/gud-nexti.xpm + * toolbar/gud-step.pbm, toolbar/gud-step.xpm + * toolbar/gud-stepi.pbm, toolbar/gud-stepi.xpm: Renamed to + gud-n.*, gud-ni.*, gud-s.*, and gud-si.*, respectively, to avoid + file-name clashes on 8+3 filesystems. + + * emacs-lisp/tcover-unsafep.el, emacs-lisp/tcover-ses.el: Renamed + from testcover-unsafep.el and testcover-ses.el to avoid file-name + clashes on 8+3 DOS filesystems. + +2003-12-29 Richard M. Stallman <rms@gnu.org> + + * textmodes/flyspell.el (mail-mode-flyspell-verify): + Search for header separator alone on a line, literally, + and search for it backward, not forward. + (flyspell-abbrev-table): Always use global-abbrev-table + if there is no local one. + + * progmodes/sh-script.el (sh-get-indent-info): + Don't move point back if at bob. + + * progmodes/antlr-mode.el (save-buffer-state-x): Use with-no-warnings. + + * play/handwrite.el (handwrite): Make the handwrite credit message + a comment rather than an output command. + + * obsolete/sc.el: Display message that this file is obsolete. + + * net/ange-ftp.el (ange-ftp-start-process): Copy the environment. + + * mail/rfc822.el (rfc822-address-start): Declare variable. + Renamed from address-start. All uses changed. + + * term.el (term-exec): Set up sentinel. + (term-sentinel): New function. + (term-handle-exit): New function. + + * subr.el (assoc-ignore-case, assoc-ignore-representation): + Use assoc-string, and mark them obsolete. + (delay-mode-hooks): Mark as permanent local. + + * simple.el (sendmail-user-agent-compose): Use assoc-string. + + * register.el (copy-rectangle-to-register): Doc fix. + + * info.el (Info-insert-dir): Use assoc-string. + + * info-look.el (info-lookup): Use assoc-string. + + * frame.el (pop-up-frame-function): Use quote, not `function'. + (frame-notice-user-settings): Calculate ADJUSTED-TOP + copying with lists as coordinate values. + + * font-lock.el (font-lock-after-change-function): Bind inhibit-quit. + + * find-dired.el (kill-find): New command. + (find-dired): Make buffer read-only. + Set up a keymap with C-c C-k running kill-find. + (find-dired-filter, find-dired-sentinel): Bind inhibit-read-only. + + * files.el (backup-buffer-copy): If MODES is nil, don't set modes. + + * filecache.el (file-cache-ignore-case): New variable. + (file-cache-assoc-function): Var deleted. Use assoc-string instead. + + * comint.el (comint-arguments): Set COUNT after ARGS is complete. + (comint-dynamic-complete-as-filename): Rename local vars. + (comint-dynamic-list-filename-completions): Likewise. + + * comint.el (comint-dynamic-list-completions-config): New var. + (comint-dynamic-list-completions): Handle both SPC and TAB right. + + * comint.el (comint-file-name-chars): Add []. + (comint-word): Use skip-chars-backward, not search. + + * shell.el (shell-file-name-chars): Add []. + + * shell.el (shell-dynamic-complete-as-command): Rename local vars. + + * bookmark.el (bookmark-get-bookmark): Use assoc-string. + + * generic.el (define-generic-mode): Doc fix. + +2003-12-29 Eli Zaretskii <eliz@elta.co.il> + + * files.el (kill-some-buffers): Doc fix. + +2003-12-29 David Herring <sdh6@ra.msstate.edu> (tiny change) + + * comint.el (comint-watch-for-password-prompt): Pass `string' as + arg to send-invisible + (send-invisible): Doc fix. The argument is now a prompt, not the + string to send. + (comint-read-noecho): Doc fix. + +2003-12-29 Michael R. Wolf <MichaelRWolf@att.net> (tiny change) + + * net/ange-ftp.el (ange-ftp-name-format): Allow USER to contain + "@", as required by some ISP hosting service. Fix defcustom + argument syntax errors that prevented use of customization. + +2003-12-29 Eli Zaretskii <eliz@elta.co.il> + + * xml.el (xml-get-attribute-or-nil): Doc fix. + +2003-12-29 Peter 'Luna' Runestig <peter@runestig.com> + + * net/zone-mode.el (zone-mode): Use write-file-functions, not + write-file-hooks. + +2003-12-29 Eric Hanchrow <offby1@blarg.net> (tiny change) + + * autorevert.el (auto-revert-interval): Doc fix. + +2003-12-29 Mark A. Hershberger <mah@everybody.org> + + * xml.el (xml-get-attribute-or-nil): New function, like + xml-get-attribute, but returns nil if the attribute was not found. + (xml-get-attribute): Converted to defsubst, uses + xml-get-attribute-or-nil. + +2003-12-29 Eli Zaretskii <eliz@elta.co.il> + + * emacs-lisp/easymenu.el (easy-menu-define): Doc fix. + +2003-12-29 Alex Schroeder <alex@emacswiki.org> (tiny change) + + * custom.el (custom-declare-theme): Use `value' when putting + properties on `theme'. + +2003-12-29 Takaaki Ota <Takaaki.Ota@am.sony.com> + + * subr.el (insert-for-yank): Call insert-for-yank-1 repetitively + for each yank-handler segment. + (insert-for-yank-1): New function, with the body of the previous + insert-for-yank. + + * textmodes/table.el (table-yank-handler): New defcustom. + (table--put-cell-indicator-property): Put yank-handler property + that indicates the yank handler for the table cell. + +2003-12-29 Jesper Harder <harder@ifa.au.dk> (tiny change) + + * generic-x.el (etc-modules-conf-generic-mode): A more complete + set of keywords. + +2003-12-29 Eli Zaretskii <eliz@elta.co.il> + + * international/mule-cmds.el (reset-language-environment) + (set-language-environment): Don't invoke fontset-related functions + if fontset-list is not fboundp. + +2003-12-29 Kenichi Handa <handa@m17n.org> + + * international/mule-cmds.el (reset-language-environment): Call + set-overriding-fontspec-internal with nil. + (set-language-environment): Call set-overriding-fontspec-internal + if the language environment specify `overriding-fontspec'. + (language-info-alist): Doc added. + + * language/cyrillic.el (ccl-encode-koi8-font): Make it work for + characters of mule-unicode-0100-24ff. + (ccl-encode-windows-1251-font): New CCL program. + ("Bulgarian"): Specify overriding-fontspec. + ("Belarusian"): Likewise. + 2003-12-28 Sam Steingold <sds@gnu.org> * net/ange-ftp.el (ange-ftp-file-attributes): Add new optional @@ -46,6 +235,14 @@ * ffap.el (ffap-read-file-or-url): Revert previous change. +2003-12-25 Robert J. Chassell <bob@rattlesnake.com> + + * textmodes/texnfo-upd.el (texinfo-multi-file-update): Create a + new list of included files called `files-with-node-lines', that + only have node lines. This way @include commands can include any + file, such as version and update files without node lines, not + just files that are chapters. + 2003-12-25 Andreas Schwab <schwab@suse.de> * jka-compr.el (jka-compr-insert-file-contents): Avoid error when @@ -542,10 +739,18 @@ 2003-11-01 Mark A. Hershberger <mah@everybody.org> - * xml.el: Allow comments following the top-level element. - Separate out namespace parsing into special functions. - Change namespace parsing to return ('ns-uri . "local-name") - instead of '{ns-uri}local-name. + * xml.el (xml-parse-region): Allow comments to appear after the + topmost element has closed. + (xml-ns-parse-ns-attrs, xml-ns-expand-el) + (xml-ns-expand-attr): New functions to do namespace handling. + (xml-intern-attrlist): Back-compatible handling of attribute + names. + (xml-parse-tag): Move namespace handling to seperate functions. + Now produces elements in the form ((:ns . "element") (attr-list) + children) instead of ('ns:element (attr-list) children). + (xml-parse-attlist): Fix attribute parsing. + (xml-parse-dtd): Change parsing so that it produces strings + instead of interned symbols. 2003-11-01 era@iki.fi <era@iki.fi> (tiny change)
--- a/lisp/arc-mode.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/arc-mode.el Tue Dec 30 17:05:05 2003 +0000 @@ -2,7 +2,7 @@ ;; Copyright (C) 1995, 1997, 1998, 2003 Free Software Foundation, Inc. -;; Author: Morten Welinder <terra@diku.dk> +;; Author: Morten Welinder <terra@gnu.org> ;; Keywords: archives msdog editing major-mode ;; Favourite-brand-of-beer: None, I hate beer.
--- a/lisp/autorevert.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/autorevert.el Tue Dec 30 17:05:05 2003 +0000 @@ -97,7 +97,10 @@ (put 'auto-revert-mode 'permanent-local t) (defcustom auto-revert-interval 5 - "Time, in seconds, between Auto-Revert Mode file checks." + "Time, in seconds, between Auto-Revert Mode file checks. +Setting this variable has no effect on buffers that are already in +auto-revert-mode; it only affects buffers that are put into +auto-revert-mode afterwards." :group 'auto-revert :type 'integer)
--- a/lisp/bookmark.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/bookmark.el Tue Dec 30 17:05:05 2003 +0000 @@ -335,10 +335,7 @@ "Return the full entry for BOOKMARK in bookmark-alist. If BOOKMARK is not a string, return nil." (when (stringp bookmark) - (apply (if bookmark-completion-ignore-case - #'assoc-ignore-case - #'assoc) - (list bookmark bookmark-alist)))) + (assoc-string bookmark bookmark-alist bookmark-completion-ignore-case))) (defun bookmark-get-bookmark-record (bookmark)
--- a/lisp/comint.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/comint.el Tue Dec 30 17:05:05 2003 +0000 @@ -1344,16 +1344,16 @@ ;; Put the previous arg, if there was one, onto ARGS. (setq str (substring string beg pos) args (if quotes (cons str args) - (nconc (comint-delim-arg str) args)) - count (1+ count))) + (nconc (comint-delim-arg str) args)))) + (setq count (length args)) (setq quotes (match-beginning 1)) (setq beg (match-beginning 0)) (setq pos (match-end 0)))) (if beg (setq str (substring string beg pos) args (if quotes (cons str args) - (nconc (comint-delim-arg str) args)) - count (1+ count))) + (nconc (comint-delim-arg str) args)))) + (setq count (length args)) (let ((n (or nth (1- count))) (m (if mth (1- (- count mth)) 0))) (mapconcat @@ -1901,7 +1901,8 @@ filter and C-g is pressed, this function returns nil rather than a string). Note that the keystrokes comprising the text can still be recovered -\(temporarily) with \\[view-lossage]. Some people find this worrysome. +\(temporarily) with \\[view-lossage]. Some people find this worrysome (see, +however, `clear-this-command-keys'). Once the caller uses the password, it can erase the password by doing (clear-string STRING)." (let ((ans "") @@ -1948,24 +1949,22 @@ (message "") ans))) -(defun send-invisible (str) +(defun send-invisible (&optional prompt) "Read a string without echoing. Then send it to the process running in the current buffer. The string is sent using `comint-input-sender'. Security bug: your string can still be temporarily recovered with -\\[view-lossage]." +\\[view-lossage]; `clear-this-command-keys' can fix that." (interactive "P") ; Defeat snooping via C-x ESC ESC (let ((proc (get-buffer-process (current-buffer)))) - (cond ((not proc) - (error "Current buffer has no process")) - ((stringp str) - (comint-snapshot-last-prompt) - (funcall comint-input-sender proc str)) - (t - (let ((str (comint-read-noecho "Non-echoed text: " t))) - (if (stringp str) - (send-invisible str) - (message "Warning: text will be echoed"))))))) + (if proc + (let ((str (comint-read-noecho (or prompt "Non-echoed text: ") t))) + (if (stringp str) + (progn + (comint-snapshot-last-prompt) + (funcall comint-input-sender proc str)) + (message "Warning: text will be echoed"))) + (error "Current buffer has no process")))) (defun comint-watch-for-password-prompt (string) "Prompt in the minibuffer for password and send without echoing. @@ -1977,8 +1976,7 @@ (when (string-match comint-password-prompt-regexp string) (when (string-match "^[ \n\r\t\v\f\b\a]+" string) (setq string (replace-match "" t t string))) - (let ((pw (comint-read-noecho string t))) - (send-invisible pw)))) + (send-invisible string))) ;; Low-level process communication @@ -2084,7 +2082,7 @@ (comint-skip-input) (interrupt-process nil comint-ptyp) ;; (process-send-string nil "\n") - ) +) (defun comint-kill-subjob () "Send kill signal to the current subjob. @@ -2553,7 +2551,7 @@ (defvar comint-file-name-chars (if (memq system-type '(ms-dos windows-nt cygwin)) "~/A-Za-z0-9_^$!#%&{}@`'.,:()-" - "~/A-Za-z0-9+@:_.$#%,={}-") + "[]~/A-Za-z0-9+@:_.$#%,={}-") "String of characters valid in a file name. Note that all non-ASCII characters are considered valid in a file name regardless of what this variable says. @@ -2579,15 +2577,19 @@ inside of a \"[...]\" (see `skip-chars-forward'), plus all non-ASCII characters." (save-excursion - (let ((non-word-chars (concat "[^\\\\" word-chars "]")) (here (point))) - (while (and (re-search-backward non-word-chars nil 'move) - ;;(memq (char-after (point)) shell-file-name-quote-list) - (or (>= (following-char) 128) - (eq (preceding-char) ?\\))) - (backward-char 1)) - ;; Don't go forward over a word-char (this can happen if we're at bob). - (when (or (not (bobp)) (looking-at non-word-chars)) - (forward-char 1)) + (let ((here (point)) + giveup) + (while (not giveup) + (let ((startpoint (point))) + (skip-chars-backward (concat "\\\\" word-chars)) + (if (and (> (- (point) 2) (point-min)) + (= (char-after (- (point) 2)) ?\\)) + (forward-char -2)) + (if (and (> (- (point) 1) (point-min)) + (>= (char-after (- (point) 1)) 128)) + (forward-char -1)) + (if (= (point) startpoint) + (setq giveup t)))) ;; Set match-data to match the entire string. (when (< (point) here) (set-match-data (list (point) here)) @@ -2699,10 +2701,10 @@ (t (cdr comint-completion-addsuffix)))) (filename (or (comint-match-partial-filename) "")) - (pathdir (file-name-directory filename)) - (pathnondir (file-name-nondirectory filename)) - (directory (if pathdir (comint-directory pathdir) default-directory)) - (completion (file-name-completion pathnondir directory))) + (filedir (file-name-directory filename)) + (filenondir (file-name-nondirectory filename)) + (directory (if filedir (comint-directory filedir) default-directory)) + (completion (file-name-completion filenondir directory))) (cond ((null completion) (message "No completions of %s" filename) (setq success nil)) @@ -2716,21 +2718,21 @@ (let ((file (concat (file-name-as-directory directory) completion))) (insert (comint-quote-filename (substring (directory-file-name completion) - (length pathnondir)))) + (length filenondir)))) (cond ((symbolp (file-name-completion completion directory)) ;; We inserted a unique completion. (insert (if (file-directory-p file) dirsuffix filesuffix)) (unless minibuffer-p (message "Completed"))) ((and comint-completion-recexact comint-completion-addsuffix - (string-equal pathnondir completion) + (string-equal filenondir completion) (file-exists-p file)) ;; It's not unique, but user wants shortest match. (insert (if (file-directory-p file) dirsuffix filesuffix)) (unless minibuffer-p (message "Completed shortest"))) ((or comint-completion-autolist - (string-equal pathnondir completion)) + (string-equal filenondir completion)) ;; It's not unique, list possible completions. (comint-dynamic-list-filename-completions)) (t @@ -2814,10 +2816,10 @@ ;; but subsequent changes may have made this unnecessary. sm. ;;(file-name-handler-alist nil) (filename (or (comint-match-partial-filename) "")) - (pathdir (file-name-directory filename)) - (pathnondir (file-name-nondirectory filename)) - (directory (if pathdir (comint-directory pathdir) default-directory)) - (completions (file-name-all-completions pathnondir directory))) + (filedir (file-name-directory filename)) + (filenondir (file-name-nondirectory filename)) + (directory (if filedir (comint-directory filedir) default-directory)) + (completions (file-name-all-completions filenondir directory))) (if (not completions) (message "No completions of %s" filename) (comint-dynamic-list-completions @@ -2829,6 +2831,8 @@ ;; command is repeatedly used without the set of completions changing. (defvar comint-displayed-dynamic-completions nil) +(defvar comint-dynamic-list-completions-config nil) + (defun comint-dynamic-list-completions (completions) "List in help buffer sorted COMPLETIONS. Typing SPC flushes the help buffer." @@ -2858,30 +2862,35 @@ (select-window window) (scroll-up)))) - (let ((conf (current-window-configuration))) - (with-output-to-temp-buffer "*Completions*" - (display-completion-list completions)) - (message "Type space to flush; repeat completion command to scroll") - (let (key first) - (if (save-excursion - (set-buffer (get-buffer "*Completions*")) - (set (make-local-variable - 'comint-displayed-dynamic-completions) - completions) - (setq key (read-key-sequence nil) - first (aref key 0)) - (and (consp first) (consp (event-start first)) - (eq (window-buffer (posn-window (event-start first))) - (get-buffer "*Completions*")) - (eq (key-binding key) 'mouse-choose-completion))) - ;; If the user does mouse-choose-completion with the mouse, - ;; execute the command, then delete the completion window. - (progn - (mouse-choose-completion first) - (set-window-configuration conf)) - (if (eq first ?\ ) - (set-window-configuration conf) - (setq unread-command-events (listify-key-sequence key))))))))) + ;; Display a completion list for the first time. + (setq comint-dynamic-list-completions-config + (current-window-configuration)) + (with-output-to-temp-buffer "*Completions*" + (display-completion-list completions)) + (message "Type space to flush; repeat completion command to scroll")) + + ;; Read the next key, to process SPC. + (let (key first) + (if (save-excursion + (set-buffer (get-buffer "*Completions*")) + (set (make-local-variable + 'comint-displayed-dynamic-completions) + completions) + (setq key (read-key-sequence nil) + first (aref key 0)) + (and (consp first) (consp (event-start first)) + (eq (window-buffer (posn-window (event-start first))) + (get-buffer "*Completions*")) + (eq (key-binding key) 'mouse-choose-completion))) + ;; If the user does mouse-choose-completion with the mouse, + ;; execute the command, then delete the completion window. + (progn + (mouse-choose-completion first) + (set-window-configuration comint-dynamic-list-completions-config)) + (unless (eq first ?\ ) + (setq unread-command-events (listify-key-sequence key))) + (unless (eq first ?\t) + (set-window-configuration comint-dynamic-list-completions-config)))))) (defun comint-get-next-from-history ()
--- a/lisp/custom.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/custom.el Tue Dec 30 17:05:05 2003 +0000 @@ -558,17 +558,17 @@ (error "Keyword %s is missing an argument" keyword)) (setq args (cdr args)) (cond ((eq keyword :short-description) - (put theme 'theme-short-description short-description)) + (put theme 'theme-short-description value)) ((eq keyword :immediate) - (put theme 'theme-immediate immediate)) + (put theme 'theme-immediate value)) ((eq keyword :variable-set-string) - (put theme 'theme-variable-set-string variable-set-string)) + (put theme 'theme-variable-set-string value)) ((eq keyword :variable-reset-string) - (put theme 'theme-variable-reset-string variable-reset-string)) + (put theme 'theme-variable-reset-string value)) ((eq keyword :face-set-string) - (put theme 'theme-face-set-string face-set-string)) + (put theme 'theme-face-set-string value)) ((eq keyword :face-reset-string) - (put theme 'theme-face-reset-string face-reset-string))))))) + (put theme 'theme-face-reset-string value))))))) (defmacro deftheme (theme &optional doc &rest args) "Declare custom theme THEME.
--- a/lisp/emacs-lisp/easymenu.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/emacs-lisp/easymenu.el Tue Dec 30 17:05:05 2003 +0000 @@ -59,8 +59,8 @@ :filter FUNCTION -FUNCTION is a function with one argument, the menu. It returns the actual -menu displayed. +FUNCTION is a function with one argument, the rest of menu items. +It returns the remaining items of the displayed menu. :visible INCLUDE
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/emacs-lisp/tcover-ses.el Tue Dec 30 17:05:05 2003 +0000 @@ -0,0 +1,712 @@ +;;;; testcover-ses.el -- Example use of `testcover' to test "SES" + +;; Copyright (C) 2002 Free Software Foundation, Inc. + +;; Author: Jonathan Yavner <jyavner@engineer.com> +;; Maintainer: Jonathan Yavner <jyavner@engineer.com> +;; Keywords: spreadsheet lisp utility + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +(require 'testcover) + +;;;Here are some macros that exercise SES. Set `pause' to t if you want the +;;;macros to pause after each step. +(let* ((pause nil) + (x (if pause "q" "")) + (y "ses-test.ses\r<")) + ;;Fiddle with the existing spreadsheet + (fset 'ses-exercise-example + (concat "" data-directory "ses-example.ses\r<" + x "10" + x "" + x "" + x "pses-center\r" + x "p\r" + x "\t\t" + x "\r A9 B9\r" + x "" + x "\r2\r" + x "" + x "50\r" + x "4" + x "" + x "" + x "(+ o\0" + x "-1o \r" + x "" + x)) + ;;Create a new spreadsheet + (fset 'ses-exercise-new + (concat y + x "\"%.8g\"\r" + x "2\r" + x "" + x "" + x "2" + x "\"Header\r" + x "(sqrt 1\r" + x "pses-center\r" + x "\t" + x "(+ A2 A3\r" + x "(* B2 A3\r" + x "2" + x "\rB3\r" + x "" + x)) + ;;Basic cell display + (fset 'ses-exercise-display + (concat y ":(revert-buffer t t)\r" + x "" + x "\"Very long\r" + x "w3\r" + x "w3\r" + x "(/ 1 0\r" + x "234567\r" + x "5w" + x "\t1\r" + x "" + x "234567\r" + x "\t" + x "" + x "345678\r" + x "3w" + x "\0>" + x "" + x "" + x "" + x "" + x "" + x "" + x "" + x "1\r" + x "" + x "" + x "\"1234567-1234567-1234567\r" + x "123\r" + x "2" + x "\"1234567-1234567-1234567\r" + x "123\r" + x "w8\r" + x "\"1234567\r" + x "w5\r" + x)) + ;;Cell formulas + (fset 'ses-exercise-formulas + (concat y ":(revert-buffer t t)\r" + x "\t\t" + x "\t" + x "(* B1 B2 D1\r" + x "(* B2 B3\r" + x "(apply '+ (ses-range B1 B3)\r" + x "(apply 'ses+ (ses-range B1 B3)\r" + x "(apply 'ses+ (ses-range A2 A3)\r" + x "(mapconcat'number-to-string(ses-range B2 B4) \"-\"\r" + x "(apply 'concat (reverse (ses-range A3 D3))\r" + x "(* (+ A2 A3) (ses+ B2 B3)\r" + x "" + x "2" + x "5\t" + x "(apply 'ses+ (ses-range E1 E2)\r" + x "(apply 'ses+ (ses-range A5 B5)\r" + x "(apply 'ses+ (ses-range E1 F1)\r" + x "(apply 'ses+ (ses-range D1 E1)\r" + x "\t" + x "(ses-average (ses-range A2 A5)\r" + x "(apply 'ses+ (ses-range A5 A6)\r" + x "k" + x "" + x "" + x "2" + x "3" + x "o" + x "2o" + x "3k" + x "(ses-average (ses-range B3 E3)\r" + x "k" + x "12345678\r" + x)) + ;;Recalculating and reconstructing + (fset 'ses-exercise-recalc + (concat y ":(revert-buffer t t)\r" + x "" + x "\t\t" + x "" + x "(/ 1 0\r" + x "" + x "\n" + x "" + x "\"%.6g\"\r" + x "" + x ">nw" + x "\0>xdelete-region\r" + x "" + x "8" + x "\0>xdelete-region\r" + x "" + x "" + x "k" + x "" + x "\"Very long\r" + x "" + x "\r\r" + x "" + x "o" + x "" + x "\"Very long2\r" + x "o" + x "" + x "\rC3\r" + x "\rC2\r" + x "\0" + x "\rC4\r" + x "\rC2\r" + x "\0" + x "" + x "xses-mode\r" + x "<" + x "2k" + x)) + ;;Header line + (fset 'ses-exercise-header-row + (concat y ":(revert-buffer t t)\r" + x "<" + x ">" + x "6<" + x ">" + x "7<" + x ">" + x "8<" + x "2<" + x ">" + x "3w" + x "10<" + x ">" + x "2" + x)) + ;;Detecting unsafe formulas and printers + (fset 'ses-exercise-unsafe + (concat y ":(revert-buffer t t)\r" + x "p(lambda (x) (delete-file x))\rn" + x "p(lambda (x) (delete-file \"ses-nothing\"))\ry" + x "\0n" + x "(delete-file \"x\"\rn" + x "(delete-file \"ses-nothing\"\ry" + x "\0n" + x "(open-network-stream \"x\" nil \"localhost\" \"smtp\"\ry" + x "\0n" + x)) + ;;Inserting and deleting rows + (fset 'ses-exercise-rows + (concat y ":(revert-buffer t t)\r" + x "" + x "\"%s=\"\r" + x "20" + x "p\"%s+\"\r" + x "" + x "123456789\r" + x "\021" + x "" + x "" + x "(not B25\r" + x "k" + x "jA3\r" + x "19" + x "" + x "100" ;Make this approx your CPU speed in MHz + x)) + ;;Inserting and deleting columns + (fset 'ses-exercise-columns + (concat y ":(revert-buffer t t)\r" + x "\"%s@\"\r" + x "o" + x "" + x "o" + x "" + x "k" + x "w8\r" + x "p\"%.7s*\"\r" + x "o" + x "" + x "2o" + x "3k" + x "\"%.6g\"\r" + x "26o" + x "\026\t" + x "26o" + x "0\r" + x "26\t" + x "400" + x "50k" + x "\0D" + x)) + (fset 'ses-exercise-editing + (concat y ":(revert-buffer t t)\r" + x "1\r" + x "('x\r" + x "" + x "" + x "\r\r" + x "w9\r" + x "\r.5\r" + x "\r 10\r" + x "w12\r" + x "\r'\r" + x "\r\r" + x "jA4\r" + x "(+ A2 100\r" + x "3\r" + x "jB1\r" + x "(not A1\r" + x "\"Very long\r" + x "" + x "h" + x "H" + x "" + x ">\t" + x "" + x "" + x "2" + x "" + x "o" + x "h" + x "\0" + x "\"Also very long\r" + x "H" + x "\0'\r" + x "'Trial\r" + x "'qwerty\r" + x "(concat o<\0" + x "-1o\r" + x "(apply '+ o<\0-1o\r" + x "2" + x "-2" + x "-2" + x "2" + x "" + x "H" + x "\0" + x "\"Another long one\r" + x "H" + x "" + x "<" + x "" + x ">" + x "\0" + x)) + ;;Sorting of columns + (fset 'ses-exercise-sort-column + (concat y ":(revert-buffer t t)\r" + x "\"Very long\r" + x "99\r" + x "o13\r" + x "(+ A3 B3\r" + x "7\r8\r(* A4 B4\r" + x "\0A\r" + x "\0B\r" + x "\0C\r" + x "o" + x "\0C\r" + x)) + ;;Simple cell printers + (fset 'ses-exercise-cell-printers + (concat y ":(revert-buffer t t)\r" + x "\"4\t76\r" + x "\"4\n7\r" + x "p\"{%S}\"\r" + x "p(\"[%s]\")\r" + x "p(\"<%s>\")\r" + x "\0" + x "p\r" + x "pnil\r" + x "pses-dashfill\r" + x "48\r" + x "\t" + x "\0p\r" + x "p\r" + x "pses-dashfill\r" + x "\0pnil\r" + x "5\r" + x "pses-center\r" + x "\"%s\"\r" + x "w8\r" + x "p\r" + x "p\"%.7g@\"\r" + x "\r" + x "\"%.6g#\"\r" + x "\"%.6g.\"\r" + x "\"%.6g.\"\r" + x "pidentity\r" + x "6\r" + x "\"UPCASE\r" + x "pdowncase\r" + x "(* 3 4\r" + x "p(lambda (x) '(\"Hi\"))\r" + x "p(lambda (x) '(\"Bye\"))\r" + x)) + ;;Spanning cell printers + (fset 'ses-exercise-spanning-printers + (concat y ":(revert-buffer t t)\r" + x "p\"%.6g*\"\r" + x "pses-dashfill-span\r" + x "5\r" + x "pses-tildefill-span\r" + x "\"4\r" + x "p\"$%s\"\r" + x "p(\"$%s\")\r" + x "8\r" + x "p(\"!%s!\")\r" + x "\t\"12345678\r" + x "pses-dashfill-span\r" + x "\"23456789\r" + x "\t" + x "(not t\r" + x "w6\r" + x "\"5\r" + x "o" + x "k" + x "k" + x "\t" + x "" + x "o" + x "2k" + x "k" + x)) + ;;Cut/copy/paste - within same buffer + (fset 'ses-exercise-paste-1buf + (concat y ":(revert-buffer t t)\r" + x "\0w" + x "" + x "o" + x "\"middle\r" + x "\0" + x "w" + x "\0" + x "w" + x "" + x "" + x "2y" + x "y" + x "y" + x ">" + x "y" + x ">y" + x "<" + x "p\"<%s>\"\r" + x "pses-dashfill\r" + x "\0" + x "" + x "" + x "y" + x "\r\0w" + x "\r" + x "3(+ G2 H1\r" + x "\0w" + x ">" + x "" + x "8(ses-average (ses-range G2 H2)\r" + x "\0k" + x "7" + x "" + x "(ses-average (ses-range E7 E9)\r" + x "\0" + x "" + x "(ses-average (ses-range E7 F7)\r" + x "\0k" + x "" + x "(ses-average (ses-range D6 E6)\r" + x "\0k" + x "" + x "2" + x "\"Line A\r" + x "pses-tildefill-span\r" + x "\"Subline A(1)\r" + x "pses-dashfill-span\r" + x "\0w" + x "" + x "" + x "\0w" + x "" + x)) + ;;Cut/copy/paste - between two buffers + (fset 'ses-exercise-paste-2buf + (concat y ":(revert-buffer t t)\r" + x "o\"middle\r\0" + x "" + x "4bses-test.txt\r" + x " " + x "\"xxx\0" + x "wo" + x "" + x "" + x "o\"\0" + x "wo" + x "o123.45\0" + x "o" + x "o1 \0" + x "o" + x ">y" + x "o symb\0" + x "oy2y" + x "o1\t\0" + x "o" + x "w9\np\"<%s>\"\n" + x "o\n2\t\"3\nxxx\t5\n\0" + x "oy" + x)) + ;;Export text, import it back + (fset 'ses-exercise-import-export + (concat y ":(revert-buffer t t)\r" + x "\0xt" + x "4bses-test.txt\r" + x "\n-1o" + x "xTo-1o" + x "'crunch\r" + x "pses-center-span\r" + x "\0xT" + x "o\n-1o" + x "\0y" + x "\0xt" + x "\0y" + x "12345678\r" + x "'bunch\r" + x "\0xtxT" + x))) + +(defun ses-exercise-macros () + "Executes all SES coverage-test macros." + (dolist (x '(ses-exercise-example + ses-exercise-new + ses-exercise-display + ses-exercise-formulas + ses-exercise-recalc + ses-exercise-header-row + ses-exercise-unsafe + ses-exercise-rows + ses-exercise-columns + ses-exercise-editing + ses-exercise-sort-column + ses-exercise-cell-printers + ses-exercise-spanning-printers + ses-exercise-paste-1buf + ses-exercise-paste-2buf + ses-exercise-import-export)) + (message "<Testing %s>" x) + (execute-kbd-macro x))) + +(defun ses-exercise-signals () + "Exercise code paths that lead to error signals, other than those for +spreadsheet files with invalid formatting." + (message "<Checking for expected errors>") + (switch-to-buffer "ses-test.ses") + (deactivate-mark) + (ses-jump 'A1) + (ses-set-curcell) + (dolist (x '((ses-column-widths 14) + (ses-column-printers "%s") + (ses-column-printers ["%s" "%s" "%s"]) ;Should be two + (ses-column-widths [14]) + (ses-delete-column -99) + (ses-delete-column 2) + (ses-delete-row -1) + (ses-goto-data 'hogwash) + (ses-header-row -56) + (ses-header-row 99) + (ses-insert-column -14) + (ses-insert-row 0) + (ses-jump 'B8) ;Covered by preceding cell + (ses-printer-validate '("%s" t)) + (ses-printer-validate '([47])) + (ses-read-header-row -1) + (ses-read-header-row 32767) + (ses-relocate-all 0 0 -1 1) + (ses-relocate-all 0 0 1 -1) + (ses-select (ses-range A1 A2) 'x (ses-range B1 B1)) + (ses-set-cell 0 0 'hogwash nil) + (ses-set-column-width 0 0) + (ses-yank-cells #("a\nb" + 0 1 (ses (A1 nil nil)) + 2 3 (ses (A3 nil nil))) + nil) + (ses-yank-cells #("ab" + 0 1 (ses (A1 nil nil)) + 1 2 (ses (A2 nil nil))) + nil) + (ses-yank-pop nil) + (ses-yank-tsf "1\t2\n3" nil) + (let ((curcell nil)) (ses-check-curcell)) + (let ((curcell 'A1)) (ses-check-curcell 'needrange)) + (let ((curcell '(A1 . A2))) (ses-check-curcell 'end)) + (let ((curcell '(A1 . A2))) (ses-sort-column "B")) + (let ((curcell '(C1 . D2))) (ses-sort-column "B")) + (execute-kbd-macro "jB10\n2") + (execute-kbd-macro [?j ?B ?9 ?\n ?\C-@ ?\C-f ?\C-f cut]) + (progn (kill-new "x") (execute-kbd-macro ">n")) + (execute-kbd-macro "\0w"))) + (condition-case nil + (progn + (eval x) + (signal 'singularity-error nil)) ;Shouldn't get here + (singularity-error (error "No error from %s?" x)) + (error nil))) + ;;Test quit-handling in ses-update-cells. Cant' use `eval' here. + (let ((inhibit-quit t)) + (setq quit-flag t) + (condition-case nil + (progn + (ses-update-cells '(A1)) + (signal 'singularity-error nil)) + (singularity-error (error "Quit failure in ses-update-cells")) + (error nil)) + (setq quit-flag nil))) + +(defun ses-exercise-invalid-spreadsheets () + "Execute code paths that detect invalid spreadsheet files." + ;;Detect invalid spreadsheets + (let ((p&d "\n\n\n(ses-cell A1 nil nil nil nil)\n\n") + (cw "(ses-column-widths [7])\n") + (cp "(ses-column-printers [ses-center])\n") + (dp "(ses-default-printer \"%.7g\")\n") + (hr "(ses-header-row 0)\n") + (p11 "(2 1 1)") + (igp ses-initial-global-parameters)) + (dolist (x (list "(1)" + "(x 2 3)" + "(1 x 3)" + "(1 -1 0)" + "(1 2 x)" + "(1 2 -1)" + "(3 1 1)" + "\n\n(2 1 1)" + "\n\n\n(ses-cell)(2 1 1)" + "\n\n\n(x)\n(2 1 1)" + "\n\n\n\n(ses-cell A2)\n(2 2 2)" + "\n\n\n\n(ses-cell B1)\n(2 2 2)" + "\n\n\n(ses-cell A1 nil nil nil nil)\n(2 1 1)" + (concat p&d "(x)\n(x)\n(x)\n(x)\n" p11) + (concat p&d "(ses-column-widths)(x)\n(x)\n(x)\n" p11) + (concat p&d cw "(x)\n(x)\n(x)\n(2 1 1)") + (concat p&d cw "(ses-column-printers)(x)\n(x)\n" p11) + (concat p&d cw cp "(x)\n(x)\n" p11) + (concat p&d cw cp "(ses-default-printer)(x)\n" p11) + (concat p&d cw cp dp "(x)\n" p11) + (concat p&d cw cp dp "(ses-header-row)" p11) + (concat p&d cw cp dp hr p11) + (concat p&d cw cp dp "\n" hr igp))) + (condition-case nil + (with-temp-buffer + (insert x) + (ses-load) + (signal 'singularity-error nil)) ;Shouldn't get here + (singularity-error (error "%S is an invalid spreadsheet!" x)) + (error nil))))) + +(defun ses-exercise-startup () + "Prepare for coverage tests" + ;;Clean up from any previous runs + (condition-case nil (kill-buffer "ses-example.ses") (error nil)) + (condition-case nil (kill-buffer "ses-test.ses") (error nil)) + (condition-case nil (delete-file "ses-test.ses") (file-error nil)) + (delete-other-windows) ;Needed for "\C-xo" in ses-exercise-editing + (setq ses-mode-map nil) ;Force rebuild + (testcover-unmark-all "ses.el") + ;;Enable + (let ((testcover-1value-functions + ;;forward-line always returns 0, for us. + ;;remove-text-properties always returns t for us. + ;;ses-recalculate-cell returns the same " " any time curcell is a cons + ;;Macros ses-dorange and ses-dotimes-msg generate code that always + ;; returns nil + (append '(forward-line remove-text-properties ses-recalculate-cell + ses-dorange ses-dotimes-msg) + testcover-1value-functions)) + (testcover-constants + ;;These maps get initialized, then never changed again + (append '(ses-mode-map ses-mode-print-map ses-mode-edit-map) + testcover-constants))) + (testcover-start "ses.el" t)) + (require 'unsafep)) ;In case user has safe-functions = t! + + +;;;######################################################################### +(defun ses-exercise () + "Executes all SES coverage tests and displays the results." + (interactive) + (ses-exercise-startup) + ;;Run the keyboard-macro tests + (let ((safe-functions nil) + (ses-initial-size '(1 . 1)) + (ses-initial-column-width 7) + (ses-initial-default-printer "%.7g") + (ses-after-entry-functions '(forward-char)) + (ses-mode-hook nil)) + (ses-exercise-macros) + (ses-exercise-signals) + (ses-exercise-invalid-spreadsheets) + ;;Upgrade of old-style spreadsheet + (with-temp-buffer + (insert " \n\n\n(ses-cell A1 nil nil nil nil)\n\n(ses-column-widths [7])\n(ses-column-printers [nil])\n(ses-default-printer \"%.7g\")\n\n( ;Global parameters (these are read first)\n 1 ;SES file-format\n 1 ;numrows\n 1 ;numcols\n)\n\n") + (ses-load)) + ;;ses-vector-delete is always called from buffer-undo-list with the same + ;;symbol as argument. We'll give it a different one here. + (let ((x [1 2 3])) + (ses-vector-delete 'x 0 0)) + ;;ses-create-header-string behaves differently in a non-window environment + ;;but we always test under windows. + (let ((window-system (not window-system))) + (scroll-left 7) + (ses-create-header-string)) + ;;Test for nonstandard after-entry functions + (let ((ses-after-entry-functions '(forward-line)) + ses-mode-hook) + (ses-read-cell 0 0 1) + (ses-read-symbol 0 0 t))) + ;;Tests with unsafep disabled + (let ((safe-functions t) + ses-mode-hook) + (message "<Checking safe-functions = t>") + (kill-buffer "ses-example.ses") + (find-file "ses-example.ses")) + ;;Checks for nonstandard default values for new spreadsheets + (let (ses-mode-hook) + (dolist (x '(("%.6g" 8 (2 . 2)) + ("%.8g" 6 (3 . 3)))) + (let ((ses-initial-size (nth 2 x)) + (ses-initial-column-width (nth 1 x)) + (ses-initial-default-printer (nth 0 x))) + (with-temp-buffer + (set-buffer-modified-p t) + (ses-mode))))) + ;;Test error-handling in command hook, outside a macro. + ;;This will ring the bell. + (let (curcell-overlay) + (ses-command-hook)) + ;;Due to use of run-with-timer, ses-command-hook sometimes gets called + ;;after we switch to another buffer. + (switch-to-buffer "*scratch*") + (ses-command-hook) + ;;Print results + (message "<Marking source code>") + (testcover-mark-all "ses.el") + (testcover-next-mark) + ;;Cleanup + (delete-other-windows) + (kill-buffer "ses-test.txt") + ;;Could do this here: (testcover-end "ses.el") + (message "Done")) + +;;; arch-tag: 87052ba4-5cf8-46cf-9375-fe245f3360b8 +;; testcover-ses.el ends here.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/emacs-lisp/tcover-unsafep.el Tue Dec 30 17:05:05 2003 +0000 @@ -0,0 +1,140 @@ +;;;; testcover-unsafep.el -- Use testcover to test unsafep's code coverage + +;; Copyright (C) 2002 Free Software Foundation, Inc. + +;; Author: Jonathan Yavner <jyavner@engineer.com> +;; Maintainer: Jonathan Yavner <jyavner@engineer.com> +;; Keywords: safety lisp utility + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +(require 'testcover) + +;;;These forms are all considered safe +(defconst testcover-unsafep-safe + '(((lambda (x) (* x 2)) 14) + (apply 'cdr (mapcar '(lambda (x) (car x)) y)) + (cond ((= x 4) 5) (t 27)) + (condition-case x (car y) (error (car x))) + (dolist (x y) (message "here: %s" x)) + (dotimes (x 14 (* x 2)) (message "here: %d" x)) + (let (x) (dolist (y '(1 2 3) (1+ y)) (push y x))) + (let (x) (apply '(lambda (x) (* x 2)) 14)) + (let ((x '(2))) (push 1 x) (pop x) (add-to-list 'x 2)) + (let ((x 1) (y 2)) (setq x (+ x y))) + (let ((x 1)) (let ((y (+ x 3))) (* x y))) + (let* nil (current-time)) + (let* ((x 1) (y (+ x 3))) (* x y)) + (mapcar (lambda (x &optional y &rest z) (setq y (+ x 2)) (* y 3)) '(1 2 3)) + (mapconcat #'(lambda (var) (propertize var 'face 'bold)) '("1" "2") ", ") + (setq buffer-display-count 14 mark-active t) + ;;This is not safe if you insert it into a buffer! + (propertize "x" 'display '(height (progn (delete-file "x") 1)))) + "List of forms that `unsafep' should decide are safe.") + +;;;These forms are considered unsafe +(defconst testcover-unsafep-unsafe + '(( (add-to-list x y) + . (unquoted x)) + ( (add-to-list y x) + . (unquoted y)) + ( (add-to-list 'y x) + . (global-variable y)) + ( (not (delete-file "unsafep.el")) + . (function delete-file)) + ( (cond (t (aset local-abbrev-table 0 0))) + . (function aset)) + ( (cond (t (setq unsafep-vars ""))) + . (risky-local-variable unsafep-vars)) + ( (condition-case format-alist 1) + . (risky-local-variable format-alist)) + ( (condition-case x 1 (error (setq format-alist ""))) + . (risky-local-variable format-alist)) + ( (dolist (x (sort globalvar 'car)) (princ x)) + . (function sort)) + ( (dotimes (x 14) (delete-file "x")) + . (function delete-file)) + ( (let ((post-command-hook "/tmp/")) 1) + . (risky-local-variable post-command-hook)) + ( (let ((x (delete-file "x"))) 2) + . (function delete-file)) + ( (let (x) (add-to-list 'x (delete-file "x"))) + . (function delete-file)) + ( (let (x) (condition-case y (setq x 1 z 2))) + . (global-variable z)) + ( (let (x) (condition-case z 1 (error (delete-file "x")))) + . (function delete-file)) + ( (let (x) (mapc (lambda (x) (setcar x 1)) '((1 . 2) (3 . 4)))) + . (function setcar)) + ( (let (y) (push (delete-file "x") y)) + . (function delete-file)) + ( (let* ((x 1)) (setq y 14)) + . (global-variable y)) + ( (mapc 'car (list '(1 . 2) (cons 3 4) (kill-buffer "unsafep.el"))) + . (function kill-buffer)) + ( (mapcar x y) + . (unquoted x)) + ( (mapcar '(lambda (x) (rename-file x "x")) '("unsafep.el")) + . (function rename-file)) + ( (mapconcat x1 x2 " ") + . (unquoted x1)) + ( (pop format-alist) + . (risky-local-variable format-alist)) + ( (push 1 format-alist) + . (risky-local-variable format-alist)) + ( (setq buffer-display-count (delete-file "x")) + . (function delete-file)) + ;;These are actualy safe (they signal errors) + ( (apply '(x) '(1 2 3)) + . (function (x))) + ( (let (((x))) 1) + . (variable (x))) + ( (let (1) 2) + . (variable 1)) + ) + "A-list of (FORM . REASON)... that`unsafep' should decide are unsafe.") + + +;;;######################################################################### +(defun testcover-unsafep () + "Executes all unsafep tests and displays the coverage results." + (interactive) + (testcover-unmark-all "unsafep.el") + (testcover-start "unsafep.el") + (let (save-functions) + (dolist (x testcover-unsafep-safe) + (if (unsafep x) + (error "%S should be safe" x))) + (dolist (x testcover-unsafep-unsafe) + (if (not (equal (unsafep (car x)) (cdr x))) + (error "%S should be unsafe: %s" (car x) (cdr x)))) + (setq safe-functions t) + (if (or (unsafep '(delete-file "x")) + (unsafep-function 'delete-file)) + (error "safe-functions=t should allow delete-file")) + (setq safe-functions '(setcar)) + (if (unsafep '(setcar x 1)) + (error "safe-functions=(setcar) should allow setcar")) + (if (not (unsafep '(setcdr x 1))) + (error "safe-functions=(setcar) should not allow setcdr"))) + (testcover-mark-all "unsafep.el") + (testcover-end "unsafep.el") + (message "Done")) + +;;; arch-tag: a7616c27-1998-47ae-9304-76d1439dbf29 +;; testcover-unsafep.el ends here.
--- a/lisp/emacs-lisp/testcover-ses.el Tue Dec 30 17:02:33 2003 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,712 +0,0 @@ -;;;; testcover-ses.el -- Example use of `testcover' to test "SES" - -;; Copyright (C) 2002 Free Software Foundation, Inc. - -;; Author: Jonathan Yavner <jyavner@engineer.com> -;; Maintainer: Jonathan Yavner <jyavner@engineer.com> -;; Keywords: spreadsheet lisp utility - -;; GNU Emacs is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -(require 'testcover) - -;;;Here are some macros that exercise SES. Set `pause' to t if you want the -;;;macros to pause after each step. -(let* ((pause nil) - (x (if pause "q" "")) - (y "ses-test.ses\r<")) - ;;Fiddle with the existing spreadsheet - (fset 'ses-exercise-example - (concat "" data-directory "ses-example.ses\r<" - x "10" - x "" - x "" - x "pses-center\r" - x "p\r" - x "\t\t" - x "\r A9 B9\r" - x "" - x "\r2\r" - x "" - x "50\r" - x "4" - x "" - x "" - x "(+ o\0" - x "-1o \r" - x "" - x)) - ;;Create a new spreadsheet - (fset 'ses-exercise-new - (concat y - x "\"%.8g\"\r" - x "2\r" - x "" - x "" - x "2" - x "\"Header\r" - x "(sqrt 1\r" - x "pses-center\r" - x "\t" - x "(+ A2 A3\r" - x "(* B2 A3\r" - x "2" - x "\rB3\r" - x "" - x)) - ;;Basic cell display - (fset 'ses-exercise-display - (concat y ":(revert-buffer t t)\r" - x "" - x "\"Very long\r" - x "w3\r" - x "w3\r" - x "(/ 1 0\r" - x "234567\r" - x "5w" - x "\t1\r" - x "" - x "234567\r" - x "\t" - x "" - x "345678\r" - x "3w" - x "\0>" - x "" - x "" - x "" - x "" - x "" - x "" - x "" - x "1\r" - x "" - x "" - x "\"1234567-1234567-1234567\r" - x "123\r" - x "2" - x "\"1234567-1234567-1234567\r" - x "123\r" - x "w8\r" - x "\"1234567\r" - x "w5\r" - x)) - ;;Cell formulas - (fset 'ses-exercise-formulas - (concat y ":(revert-buffer t t)\r" - x "\t\t" - x "\t" - x "(* B1 B2 D1\r" - x "(* B2 B3\r" - x "(apply '+ (ses-range B1 B3)\r" - x "(apply 'ses+ (ses-range B1 B3)\r" - x "(apply 'ses+ (ses-range A2 A3)\r" - x "(mapconcat'number-to-string(ses-range B2 B4) \"-\"\r" - x "(apply 'concat (reverse (ses-range A3 D3))\r" - x "(* (+ A2 A3) (ses+ B2 B3)\r" - x "" - x "2" - x "5\t" - x "(apply 'ses+ (ses-range E1 E2)\r" - x "(apply 'ses+ (ses-range A5 B5)\r" - x "(apply 'ses+ (ses-range E1 F1)\r" - x "(apply 'ses+ (ses-range D1 E1)\r" - x "\t" - x "(ses-average (ses-range A2 A5)\r" - x "(apply 'ses+ (ses-range A5 A6)\r" - x "k" - x "" - x "" - x "2" - x "3" - x "o" - x "2o" - x "3k" - x "(ses-average (ses-range B3 E3)\r" - x "k" - x "12345678\r" - x)) - ;;Recalculating and reconstructing - (fset 'ses-exercise-recalc - (concat y ":(revert-buffer t t)\r" - x "" - x "\t\t" - x "" - x "(/ 1 0\r" - x "" - x "\n" - x "" - x "\"%.6g\"\r" - x "" - x ">nw" - x "\0>xdelete-region\r" - x "" - x "8" - x "\0>xdelete-region\r" - x "" - x "" - x "k" - x "" - x "\"Very long\r" - x "" - x "\r\r" - x "" - x "o" - x "" - x "\"Very long2\r" - x "o" - x "" - x "\rC3\r" - x "\rC2\r" - x "\0" - x "\rC4\r" - x "\rC2\r" - x "\0" - x "" - x "xses-mode\r" - x "<" - x "2k" - x)) - ;;Header line - (fset 'ses-exercise-header-row - (concat y ":(revert-buffer t t)\r" - x "<" - x ">" - x "6<" - x ">" - x "7<" - x ">" - x "8<" - x "2<" - x ">" - x "3w" - x "10<" - x ">" - x "2" - x)) - ;;Detecting unsafe formulas and printers - (fset 'ses-exercise-unsafe - (concat y ":(revert-buffer t t)\r" - x "p(lambda (x) (delete-file x))\rn" - x "p(lambda (x) (delete-file \"ses-nothing\"))\ry" - x "\0n" - x "(delete-file \"x\"\rn" - x "(delete-file \"ses-nothing\"\ry" - x "\0n" - x "(open-network-stream \"x\" nil \"localhost\" \"smtp\"\ry" - x "\0n" - x)) - ;;Inserting and deleting rows - (fset 'ses-exercise-rows - (concat y ":(revert-buffer t t)\r" - x "" - x "\"%s=\"\r" - x "20" - x "p\"%s+\"\r" - x "" - x "123456789\r" - x "\021" - x "" - x "" - x "(not B25\r" - x "k" - x "jA3\r" - x "19" - x "" - x "100" ;Make this approx your CPU speed in MHz - x)) - ;;Inserting and deleting columns - (fset 'ses-exercise-columns - (concat y ":(revert-buffer t t)\r" - x "\"%s@\"\r" - x "o" - x "" - x "o" - x "" - x "k" - x "w8\r" - x "p\"%.7s*\"\r" - x "o" - x "" - x "2o" - x "3k" - x "\"%.6g\"\r" - x "26o" - x "\026\t" - x "26o" - x "0\r" - x "26\t" - x "400" - x "50k" - x "\0D" - x)) - (fset 'ses-exercise-editing - (concat y ":(revert-buffer t t)\r" - x "1\r" - x "('x\r" - x "" - x "" - x "\r\r" - x "w9\r" - x "\r.5\r" - x "\r 10\r" - x "w12\r" - x "\r'\r" - x "\r\r" - x "jA4\r" - x "(+ A2 100\r" - x "3\r" - x "jB1\r" - x "(not A1\r" - x "\"Very long\r" - x "" - x "h" - x "H" - x "" - x ">\t" - x "" - x "" - x "2" - x "" - x "o" - x "h" - x "\0" - x "\"Also very long\r" - x "H" - x "\0'\r" - x "'Trial\r" - x "'qwerty\r" - x "(concat o<\0" - x "-1o\r" - x "(apply '+ o<\0-1o\r" - x "2" - x "-2" - x "-2" - x "2" - x "" - x "H" - x "\0" - x "\"Another long one\r" - x "H" - x "" - x "<" - x "" - x ">" - x "\0" - x)) - ;;Sorting of columns - (fset 'ses-exercise-sort-column - (concat y ":(revert-buffer t t)\r" - x "\"Very long\r" - x "99\r" - x "o13\r" - x "(+ A3 B3\r" - x "7\r8\r(* A4 B4\r" - x "\0A\r" - x "\0B\r" - x "\0C\r" - x "o" - x "\0C\r" - x)) - ;;Simple cell printers - (fset 'ses-exercise-cell-printers - (concat y ":(revert-buffer t t)\r" - x "\"4\t76\r" - x "\"4\n7\r" - x "p\"{%S}\"\r" - x "p(\"[%s]\")\r" - x "p(\"<%s>\")\r" - x "\0" - x "p\r" - x "pnil\r" - x "pses-dashfill\r" - x "48\r" - x "\t" - x "\0p\r" - x "p\r" - x "pses-dashfill\r" - x "\0pnil\r" - x "5\r" - x "pses-center\r" - x "\"%s\"\r" - x "w8\r" - x "p\r" - x "p\"%.7g@\"\r" - x "\r" - x "\"%.6g#\"\r" - x "\"%.6g.\"\r" - x "\"%.6g.\"\r" - x "pidentity\r" - x "6\r" - x "\"UPCASE\r" - x "pdowncase\r" - x "(* 3 4\r" - x "p(lambda (x) '(\"Hi\"))\r" - x "p(lambda (x) '(\"Bye\"))\r" - x)) - ;;Spanning cell printers - (fset 'ses-exercise-spanning-printers - (concat y ":(revert-buffer t t)\r" - x "p\"%.6g*\"\r" - x "pses-dashfill-span\r" - x "5\r" - x "pses-tildefill-span\r" - x "\"4\r" - x "p\"$%s\"\r" - x "p(\"$%s\")\r" - x "8\r" - x "p(\"!%s!\")\r" - x "\t\"12345678\r" - x "pses-dashfill-span\r" - x "\"23456789\r" - x "\t" - x "(not t\r" - x "w6\r" - x "\"5\r" - x "o" - x "k" - x "k" - x "\t" - x "" - x "o" - x "2k" - x "k" - x)) - ;;Cut/copy/paste - within same buffer - (fset 'ses-exercise-paste-1buf - (concat y ":(revert-buffer t t)\r" - x "\0w" - x "" - x "o" - x "\"middle\r" - x "\0" - x "w" - x "\0" - x "w" - x "" - x "" - x "2y" - x "y" - x "y" - x ">" - x "y" - x ">y" - x "<" - x "p\"<%s>\"\r" - x "pses-dashfill\r" - x "\0" - x "" - x "" - x "y" - x "\r\0w" - x "\r" - x "3(+ G2 H1\r" - x "\0w" - x ">" - x "" - x "8(ses-average (ses-range G2 H2)\r" - x "\0k" - x "7" - x "" - x "(ses-average (ses-range E7 E9)\r" - x "\0" - x "" - x "(ses-average (ses-range E7 F7)\r" - x "\0k" - x "" - x "(ses-average (ses-range D6 E6)\r" - x "\0k" - x "" - x "2" - x "\"Line A\r" - x "pses-tildefill-span\r" - x "\"Subline A(1)\r" - x "pses-dashfill-span\r" - x "\0w" - x "" - x "" - x "\0w" - x "" - x)) - ;;Cut/copy/paste - between two buffers - (fset 'ses-exercise-paste-2buf - (concat y ":(revert-buffer t t)\r" - x "o\"middle\r\0" - x "" - x "4bses-test.txt\r" - x " " - x "\"xxx\0" - x "wo" - x "" - x "" - x "o\"\0" - x "wo" - x "o123.45\0" - x "o" - x "o1 \0" - x "o" - x ">y" - x "o symb\0" - x "oy2y" - x "o1\t\0" - x "o" - x "w9\np\"<%s>\"\n" - x "o\n2\t\"3\nxxx\t5\n\0" - x "oy" - x)) - ;;Export text, import it back - (fset 'ses-exercise-import-export - (concat y ":(revert-buffer t t)\r" - x "\0xt" - x "4bses-test.txt\r" - x "\n-1o" - x "xTo-1o" - x "'crunch\r" - x "pses-center-span\r" - x "\0xT" - x "o\n-1o" - x "\0y" - x "\0xt" - x "\0y" - x "12345678\r" - x "'bunch\r" - x "\0xtxT" - x))) - -(defun ses-exercise-macros () - "Executes all SES coverage-test macros." - (dolist (x '(ses-exercise-example - ses-exercise-new - ses-exercise-display - ses-exercise-formulas - ses-exercise-recalc - ses-exercise-header-row - ses-exercise-unsafe - ses-exercise-rows - ses-exercise-columns - ses-exercise-editing - ses-exercise-sort-column - ses-exercise-cell-printers - ses-exercise-spanning-printers - ses-exercise-paste-1buf - ses-exercise-paste-2buf - ses-exercise-import-export)) - (message "<Testing %s>" x) - (execute-kbd-macro x))) - -(defun ses-exercise-signals () - "Exercise code paths that lead to error signals, other than those for -spreadsheet files with invalid formatting." - (message "<Checking for expected errors>") - (switch-to-buffer "ses-test.ses") - (deactivate-mark) - (ses-jump 'A1) - (ses-set-curcell) - (dolist (x '((ses-column-widths 14) - (ses-column-printers "%s") - (ses-column-printers ["%s" "%s" "%s"]) ;Should be two - (ses-column-widths [14]) - (ses-delete-column -99) - (ses-delete-column 2) - (ses-delete-row -1) - (ses-goto-data 'hogwash) - (ses-header-row -56) - (ses-header-row 99) - (ses-insert-column -14) - (ses-insert-row 0) - (ses-jump 'B8) ;Covered by preceding cell - (ses-printer-validate '("%s" t)) - (ses-printer-validate '([47])) - (ses-read-header-row -1) - (ses-read-header-row 32767) - (ses-relocate-all 0 0 -1 1) - (ses-relocate-all 0 0 1 -1) - (ses-select (ses-range A1 A2) 'x (ses-range B1 B1)) - (ses-set-cell 0 0 'hogwash nil) - (ses-set-column-width 0 0) - (ses-yank-cells #("a\nb" - 0 1 (ses (A1 nil nil)) - 2 3 (ses (A3 nil nil))) - nil) - (ses-yank-cells #("ab" - 0 1 (ses (A1 nil nil)) - 1 2 (ses (A2 nil nil))) - nil) - (ses-yank-pop nil) - (ses-yank-tsf "1\t2\n3" nil) - (let ((curcell nil)) (ses-check-curcell)) - (let ((curcell 'A1)) (ses-check-curcell 'needrange)) - (let ((curcell '(A1 . A2))) (ses-check-curcell 'end)) - (let ((curcell '(A1 . A2))) (ses-sort-column "B")) - (let ((curcell '(C1 . D2))) (ses-sort-column "B")) - (execute-kbd-macro "jB10\n2") - (execute-kbd-macro [?j ?B ?9 ?\n ?\C-@ ?\C-f ?\C-f cut]) - (progn (kill-new "x") (execute-kbd-macro ">n")) - (execute-kbd-macro "\0w"))) - (condition-case nil - (progn - (eval x) - (signal 'singularity-error nil)) ;Shouldn't get here - (singularity-error (error "No error from %s?" x)) - (error nil))) - ;;Test quit-handling in ses-update-cells. Cant' use `eval' here. - (let ((inhibit-quit t)) - (setq quit-flag t) - (condition-case nil - (progn - (ses-update-cells '(A1)) - (signal 'singularity-error nil)) - (singularity-error (error "Quit failure in ses-update-cells")) - (error nil)) - (setq quit-flag nil))) - -(defun ses-exercise-invalid-spreadsheets () - "Execute code paths that detect invalid spreadsheet files." - ;;Detect invalid spreadsheets - (let ((p&d "\n\n\n(ses-cell A1 nil nil nil nil)\n\n") - (cw "(ses-column-widths [7])\n") - (cp "(ses-column-printers [ses-center])\n") - (dp "(ses-default-printer \"%.7g\")\n") - (hr "(ses-header-row 0)\n") - (p11 "(2 1 1)") - (igp ses-initial-global-parameters)) - (dolist (x (list "(1)" - "(x 2 3)" - "(1 x 3)" - "(1 -1 0)" - "(1 2 x)" - "(1 2 -1)" - "(3 1 1)" - "\n\n(2 1 1)" - "\n\n\n(ses-cell)(2 1 1)" - "\n\n\n(x)\n(2 1 1)" - "\n\n\n\n(ses-cell A2)\n(2 2 2)" - "\n\n\n\n(ses-cell B1)\n(2 2 2)" - "\n\n\n(ses-cell A1 nil nil nil nil)\n(2 1 1)" - (concat p&d "(x)\n(x)\n(x)\n(x)\n" p11) - (concat p&d "(ses-column-widths)(x)\n(x)\n(x)\n" p11) - (concat p&d cw "(x)\n(x)\n(x)\n(2 1 1)") - (concat p&d cw "(ses-column-printers)(x)\n(x)\n" p11) - (concat p&d cw cp "(x)\n(x)\n" p11) - (concat p&d cw cp "(ses-default-printer)(x)\n" p11) - (concat p&d cw cp dp "(x)\n" p11) - (concat p&d cw cp dp "(ses-header-row)" p11) - (concat p&d cw cp dp hr p11) - (concat p&d cw cp dp "\n" hr igp))) - (condition-case nil - (with-temp-buffer - (insert x) - (ses-load) - (signal 'singularity-error nil)) ;Shouldn't get here - (singularity-error (error "%S is an invalid spreadsheet!" x)) - (error nil))))) - -(defun ses-exercise-startup () - "Prepare for coverage tests" - ;;Clean up from any previous runs - (condition-case nil (kill-buffer "ses-example.ses") (error nil)) - (condition-case nil (kill-buffer "ses-test.ses") (error nil)) - (condition-case nil (delete-file "ses-test.ses") (file-error nil)) - (delete-other-windows) ;Needed for "\C-xo" in ses-exercise-editing - (setq ses-mode-map nil) ;Force rebuild - (testcover-unmark-all "ses.el") - ;;Enable - (let ((testcover-1value-functions - ;;forward-line always returns 0, for us. - ;;remove-text-properties always returns t for us. - ;;ses-recalculate-cell returns the same " " any time curcell is a cons - ;;Macros ses-dorange and ses-dotimes-msg generate code that always - ;; returns nil - (append '(forward-line remove-text-properties ses-recalculate-cell - ses-dorange ses-dotimes-msg) - testcover-1value-functions)) - (testcover-constants - ;;These maps get initialized, then never changed again - (append '(ses-mode-map ses-mode-print-map ses-mode-edit-map) - testcover-constants))) - (testcover-start "ses.el" t)) - (require 'unsafep)) ;In case user has safe-functions = t! - - -;;;######################################################################### -(defun ses-exercise () - "Executes all SES coverage tests and displays the results." - (interactive) - (ses-exercise-startup) - ;;Run the keyboard-macro tests - (let ((safe-functions nil) - (ses-initial-size '(1 . 1)) - (ses-initial-column-width 7) - (ses-initial-default-printer "%.7g") - (ses-after-entry-functions '(forward-char)) - (ses-mode-hook nil)) - (ses-exercise-macros) - (ses-exercise-signals) - (ses-exercise-invalid-spreadsheets) - ;;Upgrade of old-style spreadsheet - (with-temp-buffer - (insert " \n\n\n(ses-cell A1 nil nil nil nil)\n\n(ses-column-widths [7])\n(ses-column-printers [nil])\n(ses-default-printer \"%.7g\")\n\n( ;Global parameters (these are read first)\n 1 ;SES file-format\n 1 ;numrows\n 1 ;numcols\n)\n\n") - (ses-load)) - ;;ses-vector-delete is always called from buffer-undo-list with the same - ;;symbol as argument. We'll give it a different one here. - (let ((x [1 2 3])) - (ses-vector-delete 'x 0 0)) - ;;ses-create-header-string behaves differently in a non-window environment - ;;but we always test under windows. - (let ((window-system (not window-system))) - (scroll-left 7) - (ses-create-header-string)) - ;;Test for nonstandard after-entry functions - (let ((ses-after-entry-functions '(forward-line)) - ses-mode-hook) - (ses-read-cell 0 0 1) - (ses-read-symbol 0 0 t))) - ;;Tests with unsafep disabled - (let ((safe-functions t) - ses-mode-hook) - (message "<Checking safe-functions = t>") - (kill-buffer "ses-example.ses") - (find-file "ses-example.ses")) - ;;Checks for nonstandard default values for new spreadsheets - (let (ses-mode-hook) - (dolist (x '(("%.6g" 8 (2 . 2)) - ("%.8g" 6 (3 . 3)))) - (let ((ses-initial-size (nth 2 x)) - (ses-initial-column-width (nth 1 x)) - (ses-initial-default-printer (nth 0 x))) - (with-temp-buffer - (set-buffer-modified-p t) - (ses-mode))))) - ;;Test error-handling in command hook, outside a macro. - ;;This will ring the bell. - (let (curcell-overlay) - (ses-command-hook)) - ;;Due to use of run-with-timer, ses-command-hook sometimes gets called - ;;after we switch to another buffer. - (switch-to-buffer "*scratch*") - (ses-command-hook) - ;;Print results - (message "<Marking source code>") - (testcover-mark-all "ses.el") - (testcover-next-mark) - ;;Cleanup - (delete-other-windows) - (kill-buffer "ses-test.txt") - ;;Could do this here: (testcover-end "ses.el") - (message "Done")) - -;;; arch-tag: 87052ba4-5cf8-46cf-9375-fe245f3360b8 -;; testcover-ses.el ends here.
--- a/lisp/emacs-lisp/testcover-unsafep.el Tue Dec 30 17:02:33 2003 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,140 +0,0 @@ -;;;; testcover-unsafep.el -- Use testcover to test unsafep's code coverage - -;; Copyright (C) 2002 Free Software Foundation, Inc. - -;; Author: Jonathan Yavner <jyavner@engineer.com> -;; Maintainer: Jonathan Yavner <jyavner@engineer.com> -;; Keywords: safety lisp utility - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -(require 'testcover) - -;;;These forms are all considered safe -(defconst testcover-unsafep-safe - '(((lambda (x) (* x 2)) 14) - (apply 'cdr (mapcar '(lambda (x) (car x)) y)) - (cond ((= x 4) 5) (t 27)) - (condition-case x (car y) (error (car x))) - (dolist (x y) (message "here: %s" x)) - (dotimes (x 14 (* x 2)) (message "here: %d" x)) - (let (x) (dolist (y '(1 2 3) (1+ y)) (push y x))) - (let (x) (apply '(lambda (x) (* x 2)) 14)) - (let ((x '(2))) (push 1 x) (pop x) (add-to-list 'x 2)) - (let ((x 1) (y 2)) (setq x (+ x y))) - (let ((x 1)) (let ((y (+ x 3))) (* x y))) - (let* nil (current-time)) - (let* ((x 1) (y (+ x 3))) (* x y)) - (mapcar (lambda (x &optional y &rest z) (setq y (+ x 2)) (* y 3)) '(1 2 3)) - (mapconcat #'(lambda (var) (propertize var 'face 'bold)) '("1" "2") ", ") - (setq buffer-display-count 14 mark-active t) - ;;This is not safe if you insert it into a buffer! - (propertize "x" 'display '(height (progn (delete-file "x") 1)))) - "List of forms that `unsafep' should decide are safe.") - -;;;These forms are considered unsafe -(defconst testcover-unsafep-unsafe - '(( (add-to-list x y) - . (unquoted x)) - ( (add-to-list y x) - . (unquoted y)) - ( (add-to-list 'y x) - . (global-variable y)) - ( (not (delete-file "unsafep.el")) - . (function delete-file)) - ( (cond (t (aset local-abbrev-table 0 0))) - . (function aset)) - ( (cond (t (setq unsafep-vars ""))) - . (risky-local-variable unsafep-vars)) - ( (condition-case format-alist 1) - . (risky-local-variable format-alist)) - ( (condition-case x 1 (error (setq format-alist ""))) - . (risky-local-variable format-alist)) - ( (dolist (x (sort globalvar 'car)) (princ x)) - . (function sort)) - ( (dotimes (x 14) (delete-file "x")) - . (function delete-file)) - ( (let ((post-command-hook "/tmp/")) 1) - . (risky-local-variable post-command-hook)) - ( (let ((x (delete-file "x"))) 2) - . (function delete-file)) - ( (let (x) (add-to-list 'x (delete-file "x"))) - . (function delete-file)) - ( (let (x) (condition-case y (setq x 1 z 2))) - . (global-variable z)) - ( (let (x) (condition-case z 1 (error (delete-file "x")))) - . (function delete-file)) - ( (let (x) (mapc (lambda (x) (setcar x 1)) '((1 . 2) (3 . 4)))) - . (function setcar)) - ( (let (y) (push (delete-file "x") y)) - . (function delete-file)) - ( (let* ((x 1)) (setq y 14)) - . (global-variable y)) - ( (mapc 'car (list '(1 . 2) (cons 3 4) (kill-buffer "unsafep.el"))) - . (function kill-buffer)) - ( (mapcar x y) - . (unquoted x)) - ( (mapcar '(lambda (x) (rename-file x "x")) '("unsafep.el")) - . (function rename-file)) - ( (mapconcat x1 x2 " ") - . (unquoted x1)) - ( (pop format-alist) - . (risky-local-variable format-alist)) - ( (push 1 format-alist) - . (risky-local-variable format-alist)) - ( (setq buffer-display-count (delete-file "x")) - . (function delete-file)) - ;;These are actualy safe (they signal errors) - ( (apply '(x) '(1 2 3)) - . (function (x))) - ( (let (((x))) 1) - . (variable (x))) - ( (let (1) 2) - . (variable 1)) - ) - "A-list of (FORM . REASON)... that`unsafep' should decide are unsafe.") - - -;;;######################################################################### -(defun testcover-unsafep () - "Executes all unsafep tests and displays the coverage results." - (interactive) - (testcover-unmark-all "unsafep.el") - (testcover-start "unsafep.el") - (let (save-functions) - (dolist (x testcover-unsafep-safe) - (if (unsafep x) - (error "%S should be safe" x))) - (dolist (x testcover-unsafep-unsafe) - (if (not (equal (unsafep (car x)) (cdr x))) - (error "%S should be unsafe: %s" (car x) (cdr x)))) - (setq safe-functions t) - (if (or (unsafep '(delete-file "x")) - (unsafep-function 'delete-file)) - (error "safe-functions=t should allow delete-file")) - (setq safe-functions '(setcar)) - (if (unsafep '(setcar x 1)) - (error "safe-functions=(setcar) should allow setcar")) - (if (not (unsafep '(setcdr x 1))) - (error "safe-functions=(setcar) should not allow setcdr"))) - (testcover-mark-all "unsafep.el") - (testcover-end "unsafep.el") - (message "Done")) - -;;; arch-tag: a7616c27-1998-47ae-9304-76d1439dbf29 -;; testcover-unsafep.el ends here.
--- a/lisp/filecache.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/filecache.el Tue Dec 30 17:05:05 2003 +0000 @@ -212,13 +212,10 @@ :group 'file-cache ) -(defcustom file-cache-assoc-function - (if (memq system-type (list 'ms-dos 'windows-nt 'cygwin)) - 'assoc-ignore-case - 'assoc) - "Function to use to check completions in the file cache. -Defaults to `assoc-ignore-case' on DOS and Windows, and `assoc' on -other systems." +(defcustom file-cache-ignore-case + (memq system-type (list 'ms-dos 'windows-nt 'cygwin)) + "Non-nil means ignore case when checking completions in the file cache. +Defaults to nil on DOS and Windows, and t on other systems." :type 'sexp :group 'file-cache ) @@ -301,8 +298,9 @@ (message "File %s does not exist" file) (let* ((file-name (file-name-nondirectory file)) (dir-name (file-name-directory file)) - (the-entry (funcall file-cache-assoc-function - file-name file-cache-alist)) + (the-entry (assoc-string + file-name file-cache-alist + file-cache-ignore-case)) ) ;; Does the entry exist already? (if the-entry @@ -402,7 +400,7 @@ (interactive (list (completing-read "Delete file from cache: " file-cache-alist))) (setq file-cache-alist - (delq (funcall file-cache-assoc-function file file-cache-alist) + (delq (assoc-string file file-cache-alist file-cache-ignore-case) file-cache-alist))) (defun file-cache-delete-file-list (file-list) @@ -458,8 +456,9 @@ ;; Returns the name of a directory for a file in the cache (defun file-cache-directory-name (file) - (let* ((directory-list (cdr (funcall file-cache-assoc-function - file file-cache-alist))) + (let* ((directory-list (cdr (assoc-string + file file-cache-alist + file-cache-ignore-case))) (len (length directory-list)) (directory) (num) @@ -556,7 +555,8 @@ ;; If we've already inserted a unique string, see if the user ;; wants to use that one (if (and (string= string completion-string) - (funcall file-cache-assoc-function string file-cache-alist)) + (assoc-string string file-cache-alist + file-cache-ignore-case)) (if (and (eq last-command this-command) (string= file-cache-last-completion completion-string)) (progn @@ -725,7 +725,8 @@ "Debugging function." (interactive (list (completing-read "File Cache: " file-cache-alist))) - (message "%s" (funcall file-cache-assoc-function file file-cache-alist)) + (message "%s" (assoc-string file file-cache-alist + file-cache-ignore-case)) ) (defun file-cache-display ()
--- a/lisp/files.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/files.el Tue Dec 30 17:05:05 2003 +0000 @@ -2552,7 +2552,8 @@ (not (file-writable-p to-name))) (delete-file to-name)) (copy-file from-name to-name t t))) - (set-file-modes to-name (logand modes #o1777))) + (and modes + (set-file-modes to-name (logand modes #o1777)))) (defun file-name-sans-versions (name &optional keep-backup-version) "Return file NAME sans backup versions or strings. @@ -3727,8 +3728,9 @@ (kill-buffer buffer)))) (defun kill-some-buffers (&optional list) - "For each buffer in LIST, ask whether to kill it. -LIST defaults to all existing live buffers." + "Kill some buffers. Asks the user whether to kill each one of them. +Non-interactively, if optional argument LIST is non-`nil', it +specifies the list of buffers to kill, asking for approval for each one." (interactive) (if (null list) (setq list (buffer-list)))
--- a/lisp/find-dired.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/find-dired.el Tue Dec 30 17:05:05 2003 +0000 @@ -123,6 +123,10 @@ (car find-ls-option))) ;; The next statement will bomb in classic dired (no optional arg allowed) (dired-mode dir (cdr find-ls-option)) + (let ((map (make-sparse-keymap))) + (set-keymap-parent map (current-local-map)) + (define-key map "\C-c\C-k" 'kill-find) + (use-local-map map)) (make-local-variable 'dired-sort-inhibit) (setq dired-sort-inhibit t) (set (make-local-variable 'revert-buffer-function) @@ -144,6 +148,7 @@ ;; Make second line a ``find'' line in analogy to the ``total'' or ;; ``wildcard'' line. (insert " " args "\n") + (setq buffer-read-only t) ;; Start the find process. (let ((proc (start-process-shell-command find-dired-find-program (current-buffer) args))) (set-process-filter proc (function find-dired-filter)) @@ -152,6 +157,16 @@ (move-marker (process-mark proc) 1 (current-buffer))) (setq mode-line-process '(":%s")))) +(defun kill-find () + "Kill the `find' process running in the current buffer." + (interactive) + (let ((find (get-buffer-process (current-buffer)))) + (and find (eq (process-status find) 'run) + (eq (process-filter find) (function find-dired-filter)) + (condition-case nil + (delete-process find) + (error nil))))) + ;;;###autoload (defun find-name-dired (dir pattern) "Search DIR recursively for files matching the globbing pattern PATTERN, @@ -192,7 +207,8 @@ (defun find-dired-filter (proc string) ;; Filter for \\[find-dired] processes. - (let ((buf (process-buffer proc))) + (let ((buf (process-buffer proc)) + (inhibit-read-only t)) (if (buffer-name buf) ; not killed? (save-excursion (set-buffer buf) @@ -229,7 +245,8 @@ (defun find-dired-sentinel (proc state) ;; Sentinel for \\[find-dired] processes. - (let ((buf (process-buffer proc))) + (let ((buf (process-buffer proc)) + (inhibit-read-only t)) (if (buffer-name buf) (save-excursion (set-buffer buf)
--- a/lisp/font-lock.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/font-lock.el Tue Dec 30 17:05:05 2003 +0000 @@ -1031,7 +1031,8 @@ ;; Called when any modification is made to buffer text. (defun font-lock-after-change-function (beg end old-len) - (let ((inhibit-point-motion-hooks t)) + (let ((inhibit-point-motion-hooks t) + (inhibit-quit t)) (save-excursion (save-match-data ;; Rescan between start of lines enclosing the region.
--- a/lisp/frame.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/frame.el Tue Dec 30 17:05:05 2003 +0000 @@ -85,8 +85,9 @@ :group 'frames) (setq pop-up-frame-function - (function (lambda () - (make-frame pop-up-frame-alist)))) + ;; Using `function' here caused some sort of problem. + '(lambda () + (make-frame pop-up-frame-alist))) (defcustom special-display-frame-alist '((height . 14) (width . 80) (unsplittable . t)) @@ -335,10 +336,22 @@ frame-initial-geometry-arguments))) (top (frame-parameter frame-initial-frame 'top))) (when (and (consp initial-top) (eq '- (car initial-top))) - (setq newparms - (append newparms - `((top . ,(+ top (* lines char-height)))) - nil))) + (let ((adjusted-top + (cond ((and (consp top) + (eq '+ (car top))) + (list '+ + (+ (cadr top) + (* lines char-height)))) + ((and (consp top) + (eq '- (car top))) + (list '- + (- (cadr top) + (* lines char-height)))) + (t (+ top (* lines char-height)))))) + (setq newparms + (append newparms + `((top . ,adjusted-top)) + nil)))) (modify-frame-parameters frame-initial-frame newparms) (tool-bar-mode -1)))))
--- a/lisp/generic-x.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/generic-x.el Tue Dec 30 17:05:05 2003 +0000 @@ -1868,7 +1868,38 @@ ;;List of comment characters (list ?#) ;;List of keywords - (list "alias" "pre-install" "post-install" "options" "probeall") + (list + "above" + "alias" + "below" + "define" + "depfile" + "else" + "elseif" + "endif" + "if" + "include" + "insmod_opt" + "install" + "keep" + "options" + "path" + "generic_stringfile" + "pcimapfile" + "isapnpmapfile" + "usbmapfile" + "parportmapfile" + "ieee1394mapfile" + "pnpbiosmapfile" + "probe" + "probeall" + "prune" + "post-install" + "post-remove" + "pre-install" + "pre-remove" + "remove" + "persistdir") ;;List of additional font-lock-expressions nil ;;List of additional automode-alist expressions
--- a/lisp/generic.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/generic.el Tue Dec 30 17:05:05 2003 +0000 @@ -54,7 +54,7 @@ ;; ;; * Additional expressions to font-lock. This should be a list of ;; expressions, each of which should be of the same form -;; as those in `font-lock-defaults-alist'. +;; as those in `font-lock-keywords'. ;; ;; * List of regular expressions to be placed in auto-mode-alist. ;; @@ -206,7 +206,7 @@ Each keyword should be a string. FONT-LOCK-LIST is a list of additional expressions to highlight. Each entry -in the list should have the same form as an entry in `font-lock-defaults-alist' +in the list should have the same form as an entry in `font-lock-keywords'. AUTO-MODE-LIST is a list of regular expressions to add to `auto-mode-alist'. These regexps are added to `auto-mode-alist' as soon as `define-generic-mode'
--- a/lisp/info-look.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/info-look.el Tue Dec 30 17:05:05 2003 +0000 @@ -321,7 +321,7 @@ (let* ((completions (info-lookup->completions topic mode)) (ignore-case (info-lookup->ignore-case topic mode)) (entry (or (assoc (if ignore-case (downcase item) item) completions) - (assoc-ignore-case item completions) + (assoc-string item completions t) (error "Not documented as a %s: %s" topic (or item "")))) (modes (info-lookup->all-modes topic mode)) (window (selected-window))
--- a/lisp/info.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/info.el Tue Dec 30 17:05:05 2003 +0000 @@ -918,7 +918,7 @@ (beginning-of-line) (setq end (point)) (push (list nodename other beg end) this-buffer-nodes))) - (if (assoc-ignore-case "top" this-buffer-nodes) + (if (assoc-string "top" this-buffer-nodes t) (setq nodes (nconc this-buffer-nodes nodes)) (setq problems t) (message "No `top' node in %s" Info-dir-file-name)))))
--- a/lisp/international/mule-cmds.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/international/mule-cmds.el Tue Dec 30 17:05:05 2003 +0000 @@ -1006,6 +1006,12 @@ environment. features value is a list of features requested in this language environment. + ctext-non-standard-encodings + value is a list of non-standard encoding + names used in extended segments of CTEXT. + See the variable + `ctext-non-standard-encodings' for more + detail. The following keys take effect only when multibyte characters are globally disabled, i.e. the value of `default-enable-multibyte-characters' @@ -1685,7 +1691,12 @@ ;; (set-keyboard-coding-system-internal nil) (setq nonascii-translation-table nil - nonascii-insert-offset 0)) + nonascii-insert-offset 0) + + ;; Don't invoke fontset-related functions if fontsets aren't + ;; supported in this build of Emacs. + (and (fboundp 'fontset-list) + (set-overriding-fontspec-internal nil))) (reset-language-environment) @@ -1791,6 +1802,15 @@ (while required-features (require (car required-features)) (setq required-features (cdr required-features)))) + + ;; Don't invoke fontset-related functions if fontsets aren't + ;; supported in this build of Emacs. + (when (fboundp 'fontset-list) + (let ((overriding-fontspec (get-language-info language-name + 'overriding-fontspec))) + (if overriding-fontspec + (set-overriding-fontspec-internal overriding-fontspec)))) + (let ((func (get-language-info language-name 'setup-function))) (if (functionp func) (funcall func)))
--- a/lisp/language/cyrillic.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/language/cyrillic.el Tue Dec 30 17:05:05 2003 +0000 @@ -204,6 +204,9 @@ ;; The table is set up later to encode both Unicode and 8859-5. (define-ccl-program ccl-encode-koi8-font `(0 + (if (r2 >= 0) + ((r1 <<= 7) + (r1 += r2))) (translate-character cyrillic-koi8-r-encode-table r0 r1)) "CCL program to encode Cyrillic chars to KOI font.") @@ -472,10 +475,25 @@ (setcdr slot (cdr elt)) (push elt ctext-non-standard-encodings-alist))) +(define-ccl-program ccl-encode-windows-1251-font + '(0 + ((r1 <<= 7) + (r1 += r2) + (translate-character encode-windows-1251 r0 r1) + ))) + +(add-to-list 'font-ccl-encoder-alist + '("microsoft-cp1251" . ccl-encode-windows-1251-font)) + (set-language-info-alist "Bulgarian" `((coding-system windows-1251) (coding-priority windows-1251) (ctext-non-standard-encodings "microsoft-cp1251") + (overriding-fontspec + (,(get 'encode-windows-1251 'translation-table) + . (nil . "microsoft-cp1251")) + (,(get 'cyrillic-koi8-r-encode-table 'translation-table) + . (nil . "koi8-r"))) (nonascii-translation . ,(get 'decode-windows-1251 'translation-table)) (input-method . "bulgarian-bds") @@ -488,6 +506,11 @@ "Belarusian" `((coding-system windows-1251) (coding-priority windows-1251) (ctext-non-standard-encodings "microsoft-cp1251") + (overriding-fontspec + (,(get 'encode-windows-1251 'translation-table) + . (nil . "microsoft-cp1251")) + (,(get 'cyrillic-koi8-r-encode-table 'translation-table) + . (nil . "koi8-r"))) (nonascii-translation . ,(get 'decode-windows-1251 'translation-table)) (input-method . "belarusian")
--- a/lisp/mail/rfc822.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/mail/rfc822.el Tue Dec 30 17:05:05 2003 +0000 @@ -30,11 +30,13 @@ ;;; Code: -;; uses address-start free, throws to address +(defvar rfc822-address-start) + +;; uses rfc822-address-start free, throws to address (defun rfc822-bad-address (reason) (save-restriction (insert "_^_") - (narrow-to-region address-start + (narrow-to-region rfc822-address-start (if (re-search-forward "[,;]" nil t) (max (point-min) (1- (point))) (point-max))) @@ -52,7 +54,7 @@ ": \"") (goto-char (point-max)) (insert "\")")) (rfc822-nuke-whitespace) - (throw 'address (buffer-substring address-start (point)))) + (throw 'address (buffer-substring rfc822-address-start (point)))) (defun rfc822-nuke-whitespace (&optional leave-space) (let (ch) @@ -179,7 +181,7 @@ ;; domain-literal is "[" *(dtext | quoted-pair) "]" ;; dtext is "[^][\\n" ;; domain-ref is atom - (let ((address-start (point)) + (let ((rfc822-address-start (point)) (n 0)) (catch 'address ;; optimize common cases: @@ -198,14 +200,14 @@ (or (bobp) (/= (preceding-char) ?\ ) (delete-char -1)) ;; relying on the fact that rfc822-looking-at <char> ;; doesn't mung match-data - (throw 'address (buffer-substring address-start (match-end 0))))) - (goto-char address-start) + (throw 'address (buffer-substring rfc822-address-start (match-end 0))))) + (goto-char rfc822-address-start) (while t (cond ((and (= n 1) (rfc822-looking-at ?@)) ;; local-part@domain (rfc822-snarf-domain) (throw 'address - (buffer-substring address-start (point)))) + (buffer-substring rfc822-address-start (point)))) ((rfc822-looking-at ?:) (cond ((not allow-groups) (rfc822-bad-address "A group name may not appear here")) @@ -261,7 +263,7 @@ (throw 'address nil)) ((= n 1) ; allow "foo" (losing unix seems to do this) (throw 'address - (buffer-substring address-start (point)))) + (buffer-substring rfc822-address-start (point)))) ((> n 1) (rfc822-bad-address "Missing comma between addresses or badly-formatted address")) ((or (eobp) (= (following-char) ?,)) @@ -289,12 +291,12 @@ (replace-match "\\1 " t)) (goto-char (point-min)) - (rfc822-nuke-whitespace) (let ((list ()) tem - address-start); this is for rfc822-bad-address + rfc822-address-start); this is for rfc822-bad-address + (rfc822-nuke-whitespace) (while (not (eobp)) - (setq address-start (point)) + (setq rfc822-address-start (point)) (setq tem (catch 'address ; this is for rfc822-bad-address (cond ((rfc822-looking-at ?\,)
--- a/lisp/mail/rmail.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/mail/rmail.el Tue Dec 30 17:05:05 2003 +0000 @@ -1687,19 +1687,22 @@ (delete-region (point) (search-backward ":")) (insert ": 8bit"))) (if base64-header-field-end - (condition-case nil - (save-excursion - (base64-decode-region (1+ header-end) - (- (point) 2)) - ;; Change "base64" to "8bit", to reflect the - ;; decoding we just did. - (goto-char (1+ header-end)) - (while (search-forward "\r\n" (point-max) t) - (replace-match "\n")) - (goto-char base64-header-field-end) - (delete-region (point) (search-backward ":")) - (insert ": 8bit")) - (error nil))) + (save-excursion + (when + (condition-case nil + (progn + (base64-decode-region (1+ header-end) + (- (point) 2)) + t) + (error nil)) + ;; Change "base64" to "8bit", to reflect the + ;; decoding we just did. + (goto-char (1+ header-end)) + (while (search-forward "\r\n" (point-max) t) + (replace-match "\n")) + (goto-char base64-header-field-end) + (delete-region (point) (search-backward ":")) + (insert ": 8bit")))) (setq last-coding-system-used nil) (or rmail-enable-mime (not rmail-enable-multibyte) @@ -1829,15 +1832,21 @@ (delete-region (point) (search-backward ":")) (insert ": 8bit"))) (if base64-header-field-end - (condition-case nil - (save-excursion - (base64-decode-region header-end (point)) - ;; Change "base64" to "8bit", to reflect the - ;; decoding we just did. - (goto-char base64-header-field-end) - (delete-region (point) (search-backward ":")) - (insert ": 8bit")) - (error nil)))) + (save-excursion + (when + (condition-case nil + (progn + (base64-decode-region (1+ header-end) (point)) + t) + (error nil)) + (goto-char header-end) + (while (search-forward "\r\n" (point-max) t) + (replace-match "\n")) + ;; Change "base64" to "8bit", to reflect the + ;; decoding we just did. + (goto-char base64-header-field-end) + (delete-region (point) (search-backward ":")) + (insert ": 8bit"))))) (save-excursion (save-restriction
--- a/lisp/net/ange-ftp.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/net/ange-ftp.el Tue Dec 30 17:05:05 2003 +0000 @@ -686,7 +686,7 @@ :prefix "ange-ftp-") (defcustom ange-ftp-name-format - '("^/\\(\\([^@/:]*\\)@\\)?\\([^@/:]*[^@/:.]\\):\\(.*\\)" . (3 2 4)) + '("^/\\(\\([^/:]*\\)@\\)?\\([^@/:]*[^@/:.]\\):\\(.*\\)" . (3 2 4)) "*Format of a fully expanded remote file name. This is a list of the form \(REGEXP HOST USER NAME\), @@ -694,7 +694,7 @@ the full remote name, and HOST, USER, and NAME are the numbers of parenthesized expressions in REGEXP for the components (in that order)." :group 'ange-ftp - :type '(list regexp + :type '(list (regexp :tag "Name regexp") (integer :tag "Host group") (integer :tag "User group") (integer :tag "Name group"))) @@ -1918,7 +1918,8 @@ ;; but that doesn't work: ftp never responds. ;; Can anyone find a fix for that? (let ((process-connection-type t) - (process-environment process-environment) + ;; Copy this so we don't alter it permanently. + (process-environment (copy-tree process-environment)) (buffer (get-buffer-create name))) (save-excursion (set-buffer buffer)
--- a/lisp/net/zone-mode.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/net/zone-mode.el Tue Dec 30 17:05:05 2003 +0000 @@ -92,7 +92,7 @@ - fontification" - (add-hook 'write-file-hooks 'zone-mode-update-serial-hook nil t) + (add-hook 'write-file-functions 'zone-mode-update-serial-hook nil t) (if (null zone-mode-syntax-table) (zone-mode-load-time-setup)) ;; should have been run at load-time
--- a/lisp/obsolete/sc.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/obsolete/sc.el Tue Dec 30 17:05:05 2003 +0000 @@ -11,5 +11,7 @@ (require 'supercite) (provide 'sc) +(message "The name `sc' works but is obsolete; please use `supercite' instead") + ;;; arch-tag: 31e8ae19-689e-4b7d-9161-6d7dd60c6ece ;;; sc.el ends here
--- a/lisp/play/handwrite.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/play/handwrite.el Tue Dec 30 17:05:05 2003 +0000 @@ -159,8 +159,7 @@ (setq next-line-add-newlines t) (switch-to-buffer ps-buf-name) (handwrite-insert-header buf-name) - (insert "\n(\\nCreated by GNU Emacs' handwrite version " - emacs-version "\\n\\n)=print flush\n") + (insert "%%Creator: GNU Emacs' handwrite version " emacs-version "\n") (handwrite-insert-preamble) (handwrite-insert-info) (handwrite-insert-font)
--- a/lisp/progmodes/antlr-mode.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/progmodes/antlr-mode.el Tue Dec 30 17:05:05 2003 +0000 @@ -161,7 +161,7 @@ ;; More compile-time-macros (eval-when-compile (defmacro save-buffer-state-x (&rest body) ; similar to EMACS/lazy-lock.el - (let ((modified (gensym "save-buffer-state-x-modified-"))) + (let ((modified (with-no-warnings (gensym "save-buffer-state-x-modified-")))) `(let ((,modified (buffer-modified-p))) (unwind-protect (let ((buffer-undo-list t) (inhibit-read-only t)
--- a/lisp/progmodes/gud.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/progmodes/gud.el Tue Dec 30 17:05:05 2003 +0000 @@ -162,11 +162,14 @@ (gud-run . "gud-run") (gud-until . "gud-until") (gud-cont . "gud-cont") - (gud-step . "gud-step") - (gud-next . "gud-next") + ;; gud-s, gud-si etc. instead of gud-step, + ;; gud-stepi, to avoid file-name clashes on DOS + ;; 8+3 filesystems. + (gud-step . "gud-s") + (gud-next . "gud-n") (gud-finish . "gud-finish") - (gud-stepi . "gud-stepi") - (gud-nexti . "gud-nexti") + (gud-stepi . "gud-si") + (gud-nexti . "gud-ni") (gud-up . "gud-up") (gud-down . "gud-down")) map)
--- a/lisp/progmodes/sh-script.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/progmodes/sh-script.el Tue Dec 30 17:05:05 2003 +0000 @@ -2052,7 +2052,8 @@ (progn (setq result (append result val)) (setq align-point (point)))) - (forward-char -1) + (or (bobp) + (forward-char -1)) (skip-chars-forward "[a-z0-9]*?") ) ((string-match "[])}]" x)
--- a/lisp/register.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/register.el Tue Dec 30 17:05:05 2003 +0000 @@ -304,8 +304,10 @@ (defun copy-rectangle-to-register (register start end &optional delete-flag) "Copy rectangular region into register REGISTER. -With prefix arg, delete as well. -Called from program, takes four args: REGISTER, START, END and DELETE-FLAG. +With prefix arg, delete as well. To insert this register +in the buffer, use \\[insert-register]. + +Called from a program, takes four args: REGISTER, START, END and DELETE-FLAG. START and END are buffer positions giving two corners of rectangle." (interactive "cCopy rectangle to register: \nr\nP") (set-register register
--- a/lisp/shell.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/shell.el Tue Dec 30 17:05:05 2003 +0000 @@ -167,7 +167,7 @@ (defvar shell-file-name-chars (if (memq system-type '(ms-dos windows-nt cygwin)) "~/A-Za-z0-9_^$!#%&{}@`'.,:()-" - "~/A-Za-z0-9+@:_.$#%,={}-") + "[]~/A-Za-z0-9+@:_.$#%,={}-") "String of characters valid in a file name. This variable is used to initialize `comint-file-name-chars' in the shell buffer. The value may depend on the operating system or shell. @@ -941,36 +941,37 @@ "Dynamically complete at point as a command. See `shell-dynamic-complete-filename'. Returns t if successful." (let* ((filename (or (comint-match-partial-filename) "")) - (pathnondir (file-name-nondirectory filename)) - (paths (cdr (reverse exec-path))) + (filenondir (file-name-nondirectory filename)) + (path-dirs (cdr (reverse exec-path))) (cwd (file-name-as-directory (expand-file-name default-directory))) (ignored-extensions (and comint-completion-fignore (mapconcat (function (lambda (x) (concat (regexp-quote x) "$"))) comint-completion-fignore "\\|"))) - (path "") (comps-in-path ()) (file "") (filepath "") (completions ())) - ;; Go thru each path in the search path, finding completions. - (while paths - (setq path (file-name-as-directory (comint-directory (or (car paths) "."))) - comps-in-path (and (file-accessible-directory-p path) - (file-name-all-completions pathnondir path))) + (dir "") (comps-in-dir ()) + (file "") (abs-file-name "") (completions ())) + ;; Go thru each dir in the search path, finding completions. + (while path-dirs + (setq dir (file-name-as-directory (comint-directory (or (car path-dirs) "."))) + comps-in-dir (and (file-accessible-directory-p dir) + (file-name-all-completions filenondir dir))) ;; Go thru each completion found, to see whether it should be used. - (while comps-in-path - (setq file (car comps-in-path) - filepath (concat path file)) + (while comps-in-dir + (setq file (car comps-in-dir) + abs-file-name (concat dir file)) (if (and (not (member file completions)) (not (and ignored-extensions (string-match ignored-extensions file))) - (or (string-equal path cwd) - (not (file-directory-p filepath))) + (or (string-equal dir cwd) + (not (file-directory-p abs-file-name))) (or (null shell-completion-execonly) - (file-executable-p filepath))) + (file-executable-p abs-file-name))) (setq completions (cons file completions))) - (setq comps-in-path (cdr comps-in-path))) - (setq paths (cdr paths))) + (setq comps-in-dir (cdr comps-in-dir))) + (setq path-dirs (cdr path-dirs))) ;; OK, we've got a list of completions. (let ((success (let ((comint-completion-addsuffix nil)) - (comint-dynamic-simple-complete pathnondir completions)))) + (comint-dynamic-simple-complete filenondir completions)))) (if (and (memq success '(sole shortest)) comint-completion-addsuffix (not (file-directory-p (comint-match-partial-filename)))) (insert " "))
--- a/lisp/simple.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/simple.el Tue Dec 30 17:05:05 2003 +0000 @@ -3735,9 +3735,9 @@ (same-window-buffer-names nil) (same-window-regexps nil)) (funcall switch-function "*mail*"))) - (let ((cc (cdr (assoc-ignore-case "cc" other-headers))) - (in-reply-to (cdr (assoc-ignore-case "in-reply-to" other-headers))) - (body (cdr (assoc-ignore-case "body" other-headers)))) + (let ((cc (cdr (assoc-string "cc" other-headers t))) + (in-reply-to (cdr (assoc-string "in-reply-to" other-headers t))) + (body (cdr (assoc-string "body" other-headers t)))) (or (mail continue to subject in-reply-to cc yank-action send-actions) continue (error "Message aborted"))
--- a/lisp/subr.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/subr.el Tue Dec 30 17:05:05 2003 +0000 @@ -298,27 +298,19 @@ (setq tail (cdr tail))) value)) +(make-obsolete 'assoc-ignore-case 'assoc-string) (defun assoc-ignore-case (key alist) "Like `assoc', but ignores differences in case and text representation. KEY must be a string. Upper-case and lower-case letters are treated as equal. Unibyte strings are converted to multibyte for comparison." - (let (element) - (while (and alist (not element)) - (if (eq t (compare-strings key 0 nil (car (car alist)) 0 nil t)) - (setq element (car alist))) - (setq alist (cdr alist))) - element)) + (assoc-string key alist t)) +(make-obsolete 'assoc-ignore-representation 'assoc-string) (defun assoc-ignore-representation (key alist) "Like `assoc', but ignores differences in text representation. KEY must be a string. Unibyte strings are converted to multibyte for comparison." - (let (element) - (while (and alist (not element)) - (if (eq t (compare-strings key 0 nil (car (car alist)) 0 nil)) - (setq element (car alist))) - (setq alist (cdr alist))) - element)) + (assoc-string key alist nil)) (defun member-ignore-case (elt list) "Like `member', but ignores differences in case and text representation. @@ -1563,7 +1555,18 @@ (defvar yank-undo-function) (defun insert-for-yank (string) + "Calls `insert-for-yank-1' repetitively for each `yank-handler' segment. + +See `insert-for-yank-1' for more details." + (let (to) + (while (setq to (next-single-property-change 0 'yank-handler string)) + (insert-for-yank-1 (substring string 0 to)) + (setq string (substring string to)))) + (insert-for-yank-1 string)) + +(defun insert-for-yank-1 (string) "Insert STRING at point, stripping some text properties. + Strip text properties from the inserted text according to `yank-excluded-properties'. Otherwise just like (insert STRING). @@ -1809,6 +1812,7 @@ (defvar delayed-mode-hooks nil "List of delayed mode hooks waiting to be run.") (make-variable-buffer-local 'delayed-mode-hooks) +(put 'delay-mode-hooks 'permanent-local t) (defun run-mode-hooks (&rest hooks) "Run mode hooks `delayed-mode-hooks' and HOOKS, or delay HOOKS.
--- a/lisp/term.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/term.el Tue Dec 30 17:05:05 2003 +0000 @@ -1290,6 +1290,7 @@ (goto-char (point-max)) (set-marker (process-mark proc) (point)) (set-process-filter proc 'term-emulate-terminal) + (set-process-sentinel proc 'term-sentinel) ;; Feed it the startfile. (cond (startfile ;;This is guaranteed to wait long enough @@ -1306,6 +1307,49 @@ (run-hooks 'term-exec-hook) buffer))) +(defun term-sentinel (proc msg) + "Sentinel for term buffers. +The main purpose is to get rid of the local keymap." + (let ((buffer (process-buffer proc))) + (if (memq (process-status proc) '(signal exit)) + (progn + (if (null (buffer-name buffer)) + ;; buffer killed + (set-process-buffer proc nil) + (let ((obuf (current-buffer))) + ;; save-excursion isn't the right thing if + ;; process-buffer is current-buffer + (unwind-protect + (progn + ;; Write something in the compilation buffer + ;; and hack its mode line. + (set-buffer buffer) + ;; Get rid of local keymap. + (use-local-map nil) + (term-handle-exit (process-name proc) + msg) + ;; Since the buffer and mode line will show that the + ;; process is dead, we can delete it now. Otherwise it + ;; will stay around until M-x list-processes. + (delete-process proc)) + (set-buffer obuf)))) + )))) + +(defun term-handle-exit (process-name msg) + "Write process exit (or other change) message MSG in the current buffer." + (let ((buffer-read-only nil) + (omax (point-max)) + (opoint (point))) + ;; Record where we put the message, so we can ignore it + ;; later on. + (goto-char omax) + (insert ?\n "Process " process-name " " msg) + ;; Force mode line redisplay soon. + (force-mode-line-update) + (if (and opoint (< opoint omax)) + (goto-char opoint)))) + + ;;; Name to use for TERM. ;;; Using "emacs" loses, because bash disables editing if TERM == emacs. (defvar term-term-name "eterm")
--- a/lisp/textmodes/flyspell.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/textmodes/flyspell.el Tue Dec 30 17:05:05 2003 +0000 @@ -267,7 +267,9 @@ (defun mail-mode-flyspell-verify () "This function is used for `flyspell-generic-check-word-p' in Mail mode." (let ((in-headers (save-excursion - (re-search-forward mail-header-separator nil t))) + ;; When mail-header-separator is "", + ;; it is likely to be found in both directions. + (not (re-search-backward (concat "^" (regexp-quote mail-header-separator) "$") nil t)))) (in-signature (save-excursion (re-search-backward message-signature-separator nil t)))) (cond (in-headers @@ -1628,7 +1630,7 @@ (defun flyspell-abbrev-table () (if flyspell-use-global-abbrev-table-p global-abbrev-table - local-abbrev-table)) + (or local-abbrev-table global-abbrev-table))) ;*---------------------------------------------------------------------*/ ;* flyspell-define-abbrev ... */
--- a/lisp/textmodes/table.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/textmodes/table.el Tue Dec 30 17:05:05 2003 +0000 @@ -5,7 +5,7 @@ ;; Keywords: wp, convenience ;; Author: Takaaki Ota <Takaaki.Ota@am.sony.com> ;; Created: Sat Jul 08 2000 13:28:45 (PST) -;; Revised: jue jun 05 2003 22:00:02 (Hora de verano romance) +;; Revised: Tue Dec 09 2003 14:36:50 (PST) ;; This file is part of GNU Emacs. @@ -837,6 +837,9 @@ :type 'hook :group 'table-hooks) +(defcustom table-yank-handler '(nil nil t nil) + "*yank-handler for table.") + (setplist 'table-disable-incompatibility-warning nil) (defvar table-disable-menu (null (and (locate-library "easymenu") @@ -5228,7 +5231,8 @@ (defun table--put-cell-indicator-property (beg end &optional object) "Put cell property which indicates that the location is within a table cell." - (put-text-property beg end 'table-cell t object)) + (put-text-property beg end 'table-cell t object) + (put-text-property beg end 'yank-handler table-yank-handler object)) (defun table--put-cell-face-property (beg end &optional object) "Put cell face property."
--- a/lisp/textmodes/texinfo.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/textmodes/texinfo.el Tue Dec 30 17:05:05 2003 +0000 @@ -5,7 +5,7 @@ ;; Author: Robert J. Chassell ;; Date: [See date below for texinfo-version] -;; Maintainer: bug-texinfo@gnu.org +;; Maintainer: FSF ;; Keywords: maint, tex, docs ;; This file is part of GNU Emacs. @@ -59,6 +59,12 @@ :type 'string :group 'texinfo) +(defcustom texinfo-mode-hook nil + "Normal hook run when entering Texinfo mode." + :type 'hook + :options '(turn-on-auto-fill flyspell-mode) + :group 'texinfo) + ;;; Autoloads:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/toolbar/gud-n.xpm Tue Dec 30 17:05:05 2003 +0000 @@ -0,0 +1,34 @@ +/* XPM */ +static char * next_xpm[] = { +"24 24 7 1", +" c #c0c0c0", +". c #cc0033", +"X c #616161", +"o c #2a1f55", +"O c #adadad", +"+ c #d40000", +"@ c #cc9999", +" ", +" ", +" ", +" ", +" .......... ", +" . . ", +" . . ", +" . Xo oX . ", +" . XoO OoX . ", +" . oo oo +@.@+ ", +" oo oo @...@ ", +" oo oo ... ", +" oX Xo @.@ ", +" oo oo . ", +" oX Xo ", +" oo oo ", +" oo oo ", +" oo oo ", +" XoO OoX ", +" Xo oX ", +" ", +" ", +" ", +" "};
--- a/lisp/toolbar/gud-next.xpm Tue Dec 30 17:02:33 2003 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -/* XPM */ -static char * next_xpm[] = { -"24 24 7 1", -" c #c0c0c0", -". c #cc0033", -"X c #616161", -"o c #2a1f55", -"O c #adadad", -"+ c #d40000", -"@ c #cc9999", -" ", -" ", -" ", -" ", -" .......... ", -" . . ", -" . . ", -" . Xo oX . ", -" . XoO OoX . ", -" . oo oo +@.@+ ", -" oo oo @...@ ", -" oo oo ... ", -" oX Xo @.@ ", -" oo oo . ", -" oX Xo ", -" oo oo ", -" oo oo ", -" oo oo ", -" XoO OoX ", -" Xo oX ", -" ", -" ", -" ", -" "};
--- a/lisp/toolbar/gud-nexti.xpm Tue Dec 30 17:02:33 2003 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/* XPM */ -static char * gud_nexti_xpm[] = { -"24 24 6 1", -" c #C0C0C0C0C0C0", -". c #CCCC00003333", -"X c #616161616161", -"o c #D4D400000000", -"O c #CCCC99999999", -"+ c #2A2A1F1F5555", -" ", -" ", -" ", -" ", -" .......... ", -" . . ", -" . . ", -" . . ", -" . . ", -" . X X oO.Oo ", -" X+ +X O...O ", -" X+ +X ... ", -" X+ +X O.O ", -" X+ +X . ", -" +X X+ ", -" +X X+ ", -" +X X+ ", -" +X X+ ", -" + + ", -" ", -" ", -" ", -" ", -" "};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/toolbar/gud-ni.xpm Tue Dec 30 17:05:05 2003 +0000 @@ -0,0 +1,33 @@ +/* XPM */ +static char * gud_nexti_xpm[] = { +"24 24 6 1", +" c #C0C0C0C0C0C0", +". c #CCCC00003333", +"X c #616161616161", +"o c #D4D400000000", +"O c #CCCC99999999", +"+ c #2A2A1F1F5555", +" ", +" ", +" ", +" ", +" .......... ", +" . . ", +" . . ", +" . . ", +" . . ", +" . X X oO.Oo ", +" X+ +X O...O ", +" X+ +X ... ", +" X+ +X O.O ", +" X+ +X . ", +" +X X+ ", +" +X X+ ", +" +X X+ ", +" +X X+ ", +" + + ", +" ", +" ", +" ", +" ", +" "};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/toolbar/gud-s.xpm Tue Dec 30 17:05:05 2003 +0000 @@ -0,0 +1,33 @@ +/* XPM */ +static char * step_xpm[] = { +"24 24 6 1", +" c #c0c0c0", +". c #d40000", +"X c #616161", +"o c #2a1f55", +"O c #adadad", +"+ c #cc9999", +" ", +" ", +" ", +" ", +" ..... ", +" . . ", +" . . ", +" . Xo . oX ", +" . XoO . OoX ", +" . oo .+.+. oo ", +" oo +...+ oo ", +" oo ... oo ", +" oX +.+ Xo ", +" oo . oo ", +" oX Xo ", +" oo oo ", +" oo oo ", +" oo oo ", +" XoO OoX ", +" Xo oX ", +" ", +" ", +" ", +" "};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/toolbar/gud-si.xpm Tue Dec 30 17:05:05 2003 +0000 @@ -0,0 +1,32 @@ +/* XPM */ +static char * gud_stepi_xpm[] = { +"24 24 5 1", +" c #C0C0C0C0C0C0", +". c #D4D400000000", +"X c #616161616161", +"o c #2A2A1F1F5555", +"O c #CCCC99999999", +" ", +" ", +" ", +" ", +" ..... ", +" . . ", +" . . ", +" . . ", +" . X . X ", +" . Xo .O.O. oX ", +" Xo O...O oX ", +" Xo ... oX ", +" Xo O.O oX ", +" oX . Xo ", +" oX Xo ", +" oX Xo ", +" oX Xo ", +" o o ", +" ", +" ", +" ", +" ", +" ", +" "};
--- a/lisp/toolbar/gud-step.xpm Tue Dec 30 17:02:33 2003 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/* XPM */ -static char * step_xpm[] = { -"24 24 6 1", -" c #c0c0c0", -". c #d40000", -"X c #616161", -"o c #2a1f55", -"O c #adadad", -"+ c #cc9999", -" ", -" ", -" ", -" ", -" ..... ", -" . . ", -" . . ", -" . Xo . oX ", -" . XoO . OoX ", -" . oo .+.+. oo ", -" oo +...+ oo ", -" oo ... oo ", -" oX +.+ Xo ", -" oo . oo ", -" oX Xo ", -" oo oo ", -" oo oo ", -" oo oo ", -" XoO OoX ", -" Xo oX ", -" ", -" ", -" ", -" "};
--- a/lisp/toolbar/gud-stepi.xpm Tue Dec 30 17:02:33 2003 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -/* XPM */ -static char * gud_stepi_xpm[] = { -"24 24 5 1", -" c #C0C0C0C0C0C0", -". c #D4D400000000", -"X c #616161616161", -"o c #2A2A1F1F5555", -"O c #CCCC99999999", -" ", -" ", -" ", -" ", -" ..... ", -" . . ", -" . . ", -" . . ", -" . X . X ", -" . Xo .O.O. oX ", -" Xo O...O oX ", -" Xo ... oX ", -" Xo O.O oX ", -" oX . Xo ", -" oX Xo ", -" oX Xo ", -" oX Xo ", -" o o ", -" ", -" ", -" ", -" ", -" ", -" "};
--- a/lisp/xml.el Tue Dec 30 17:02:33 2003 +0000 +++ b/lisp/xml.el Tue Dec 30 17:05:05 2003 +0000 @@ -104,15 +104,22 @@ (push child match)))) (nreverse match))) -(defun xml-get-attribute (node attribute) +(defun xml-get-attribute-or-nil (node attribute) "Get from NODE the value of ATTRIBUTE. -An empty string is returned if the attribute was not found." - (if (xml-node-attributes node) - (let ((value (assoc attribute (xml-node-attributes node)))) - (if value - (cdr value) - "")) - "")) +Return `nil' if the attribute was not found. + +See also `xml-get-attribute'." + (when (xml-node-attributes node) + (let ((value (assoc attribute (xml-node-attributes node)))) + (when value + (cdr value))))) + +(defsubst xml-get-attribute (node attribute) + "Get from NODE the value of ATTRIBUTE. +An empty string is returned if the attribute was not found. + +See also `xml-get-attribute-or-nil'." + (or (xml-get-attribute-or-nil node attribute) "")) ;;******************************************************************* ;;** @@ -286,7 +293,6 @@ attr-list) attr-list) - (defun xml-intern-attrlist (attr-list) "Convert attribute names to symbols for backward compatibility." (mapcar (lambda (attr) @@ -349,12 +355,12 @@ (let* ((node-name (match-string 1)) (attr-list (xml-parse-attlist)) (children (if (consp xml-ns) ;; take care of namespace parsing - (progn + (progn (setq xml-ns (xml-ns-parse-ns-attrs attr-list xml-ns)) - (list (xml-ns-expand-attr + (list (xml-ns-expand-attr attr-list xml-ns) - (xml-ns-expand-el + (xml-ns-expand-el node-name xml-ns))) (list (xml-intern-attrlist attr-list) (intern node-name))))
--- a/lispintro/texinfo.tex Tue Dec 30 17:02:33 2003 +0000 +++ b/lispintro/texinfo.tex Tue Dec 30 17:05:05 2003 +0000 @@ -3,7 +3,7 @@ % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % -\def\texinfoversion{2003-07-16.18} +\def\texinfoversion{2003-12-30.09} % % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. @@ -6772,4 +6772,6 @@ @c time-stamp-end: "}" @c End: -% arch-tag: 53261dd3-7df7-4ec3-9d90-af7a955d3c87 +@ignore + arch-tag: 53261dd3-7df7-4ec3-9d90-af7a955d3c87 +@end ignore
--- a/lispref/ChangeLog Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/ChangeLog Tue Dec 30 17:05:05 2003 +0000 @@ -1,3 +1,53 @@ +2003-12-29 Richard M. Stallman <rms@gnu.org> + + * windows.texi (Choosing Window): Add same-window-p, special-display-p. + (Window Configurations): Add window-configuration-frame. + + * variables.texi (Creating Buffer-Local): Add local-variable-if-set-p. + + * text.texi (Examining Properties): Add get-char-property-and-overlay. + Change arg name in get-char-property. + (Special Properties): Update handling of keymap property. + + * strings.texi (Modifying Strings): Add clear-string. + (Text Comparison): Add assoc-string and remove + assoc-ignore-case, assoc-ignore-representation. + + * os.texi (Time of Day): Add set-time-zone-rule. + + * numbers.texi (Math Functions): asin, acos, log, log10 + report domain-error errors. + + * nonascii.texi (Converting Representations): + Add multibyte-char-to-unibyte and unibyte-char-to-multibyte. + (Encoding and I/O): Add file-name-coding-system. + + * modes.texi (Search-based Fontification): Explain that + face specs are symbols with face names as values. + + * minibuf.texi (Minibuffer Misc): Add set-minibuffer-window. + + * lists.texi (Building Lists): remq moved elsewhere. + (Sets And Lists): remq moved here. + (Association Lists): Refer to assoc-string. + + * internals.texi (Garbage Collection): Add memory-use-counts. + + * frames.texi (Frames and Windows): Add set-frame-selected-window + and frame-root-window. + + * files.texi (Contents of Directories): + Add directory-files-and-attributes. + + * display.texi (Refresh Screen): Add force-window-update. + (Invisible Text): Explain about moving point out of invis text. + (Overlay Properties): Add overlay-properties. + (Managing Overlays): Add overlayp. + (GIF Images): Invalid image number displays a hollow box. + + * buffers.texi (Buffer Modification): Add restore-buffer-modified-p. + (Killing Buffers): Add buffer-live-p. + 2003-12-25 Markus Rost <rost@mathematik.uni-bielefeld.de> * display.texi (Fringes): Fix typo "set-buffer-window".
--- a/lispref/buffers.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/buffers.texi Tue Dec 30 17:05:05 2003 +0000 @@ -517,6 +517,11 @@ @end example @end defun +@defun restore-buffer-modified-p flag +Like @code{set-buffer-modified-p}, but does not force redisplay +of mode lines. +@end defun + @deffn Command not-modified This command marks the current buffer as unmodified, and not needing to be saved. With prefix arg, it marks the buffer as modified, so that it @@ -953,6 +958,11 @@ when set for any reason. @xref{Buffer-Local Variables}. @end defvar +@defun buffer-live-p buffer +This function returns @code{t} if @var{object} is a buffer which has +not been killed, @code{nil} otherwise. +@end defun + @node Indirect Buffers @section Indirect Buffers @cindex indirect buffers
--- a/lispref/display.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/display.texi Tue Dec 30 17:05:05 2003 +0000 @@ -53,6 +53,17 @@ This function clears and redisplays all visible frames. @end deffn + This function forces certain windows to be redisplayed +but does not clear them. + +@defun force-window-update object +This function forces redisplay of some or all windows. If +@var{object} is a window, it forces redisplay of that window. If +@var{object} is a buffer or buffer name, it forces redisplay of all +windows displaying that buffer. If @var{object} is @code{nil}, it +forces redisplay of all windows. +@end defun + Processing user input takes absolute priority over redisplay. If you call these functions when input is available, they do nothing immediately, but a full redisplay does happen eventually---after all the @@ -517,6 +528,7 @@ symbols. If it matches the first few elements in a warning type, then that warning is not logged. @end defopt + @node Invisible Text @section Invisible Text @@ -613,12 +625,22 @@ @end example @vindex line-move-ignore-invisible - Ordinarily, commands that operate on text or move point do not care + Ordinarily, functions that operate on text or move point do not care whether the text is invisible. The user-level line motion commands explicitly ignore invisible newlines if @code{line-move-ignore-invisible} is non-@code{nil}, but only because they are explicitly programmed to do so. + However, if a command ends with point inside or immediately after +invisible text, the main editing loop moves point further forward or +further backward (in the same direction that the command already moved +it) until that condition is no longer true. Thus, if the command +moved point back into an invisible range, Emacs moves point back to +the beginning of that range, following the previous visible character. +If the command moved point forward into an invisible range, Emacs +moves point forward past the first visible character that follows the +invisible text. + Incremental search can make invisible overlays visible temporarily and/or permanently when a match includes invisible text. To enable this, the overlay should have a non-@code{nil} @@ -980,6 +1002,10 @@ @var{overlay} to @var{value}. It returns @var{value}. @end defun +@defun overlay-properties overlay +This returns a copy of the property list of @var{overlay}. +@end defun + See also the function @code{get-char-property} which checks both overlay properties and text properties for a given character. @xref{Examining Properties}. @@ -1155,6 +1181,10 @@ This section describes the functions to create, delete and move overlays, and to examine their contents. +@defun overlayp object +This function returns @code{t} if @var{object} is an overlay. +@end defun + @defun make-overlay start end &optional buffer front-advance rear-advance This function creates and returns an overlay that belongs to @var{buffer} and ranges from @var{start} to @var{end}. Both @var{start} @@ -3114,8 +3144,8 @@ @item :index @var{index} You can use @code{:index} to specify one image from a GIF file that contains more than one image. This property specifies use of image -number @var{index} from the file. An error is signaled if the GIF file -doesn't contain an image with index @var{index}. +number @var{index} from the file. If the GIF file doesn't contain an +image with index @var{index}, the image displays as a hollow box. @end table @ignore
--- a/lispref/files.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/files.texi Tue Dec 30 17:05:05 2003 +0000 @@ -2165,6 +2165,14 @@ that can be read. @end defun +@defun directory-files-and-attributes directory &optional full-name match-regexp nosort +This is similar to @code{directory-files} in deciding which files +to report on and how to report their names. However, instead +of returning a list of file names, it returns for each file a +list @code{(@var{filename} . @var{attributes})}, where @var{attributes} +is what @code{file-attributes} would return for that file. +@end defun + @defun file-name-all-versions file dirname This function returns a list of all versions of the file named @var{file} in directory @var{dirname}.
--- a/lispref/frames.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/frames.texi Tue Dec 30 17:05:05 2003 +0000 @@ -923,9 +923,20 @@ @var{frame}. @end defun +@defun set-frame-selected-window frame window +This sets the selected window of frame @var{frame} to @var{window}. +If @var{frame} is @code{nil}, it operates on the selected frame. If +@var{frame} is the selected frame, this makes @var{window} the +selected window. +@end defun + Conversely, selecting a window for Emacs with @code{select-window} also makes that window selected within its frame. @xref{Selecting Windows}. +@defun frame-root-window frame +This function returns the window at the top left corner of @var{frame}. +@end defun + Another function that (usually) returns one of the windows in a given frame is @code{minibuffer-window}. @xref{Minibuffer Misc}.
--- a/lispref/internals.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/internals.texi Tue Dec 30 17:05:05 2003 +0000 @@ -383,6 +383,12 @@ memory usage. @end defun +@defun memory-use-counts +This returns a list of numbers that count the number of objects +created in this Emacs session. Each of these counters increments for +a certain kind of object. See the documentation string for details. +@end defun + @defvar gcs-done This variable contains the total number of garbage collections done so far in this Emacs session.
--- a/lispref/lists.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/lists.texi Tue Dec 30 17:05:05 2003 +0000 @@ -707,31 +707,6 @@ @end example @end defun -@defun remq object list -This function returns a copy of @var{list}, with all elements removed -which are @code{eq} to @var{object}. The letter @samp{q} in @code{remq} -says that it uses @code{eq} to compare @var{object} against the elements -of @code{list}. - -@example -@group -(setq sample-list '(a b c a b c)) - @result{} (a b c a b c) -@end group -@group -(remq 'a sample-list) - @result{} (b c b c) -@end group -@group -sample-list - @result{} (a b c a b c) -@end group -@end example -@noindent -The function @code{delq} offers a way to perform this operation -destructively. See @ref{Sets And Lists}. -@end defun - @defun copy-tree tree &optional vecp This function returns a copy the tree @code{tree}. If @var{tree} is a cons cell, this makes a new cons cell with the same @sc{car} and @@ -1346,9 +1321,34 @@ @end group @end example -The following two functions are like @code{memq} and @code{delq} but use -@code{equal} rather than @code{eq} to compare elements. @xref{Equality -Predicates}. +@defun remq object list +This function returns a copy of @var{list}, with all elements removed +which are @code{eq} to @var{object}. The letter @samp{q} in @code{remq} +says that it uses @code{eq} to compare @var{object} against the elements +of @code{list}. + +@example +@group +(setq sample-list '(a b c a b c)) + @result{} (a b c a b c) +@end group +@group +(remq 'a sample-list) + @result{} (b c b c) +@end group +@group +sample-list + @result{} (a b c a b c) +@end group +@end example +@noindent +The function @code{delq} offers a way to perform this operation +destructively. See @ref{Sets And Lists}. +@end defun + +The following three functions are like @code{memq}, @code{delq} and +@code{remq}, but use @code{equal} rather than @code{eq} to compare +elements. @xref{Equality Predicates}. @defun member object list The function @code{member} tests to see whether @var{object} is a member @@ -1541,9 +1541,9 @@ @end smallexample @end defun - The functions @code{assoc-ignore-representation} and -@code{assoc-ignore-case} are much like @code{assoc} except using -@code{compare-strings} to do the comparison. @xref{Text Comparison}. + The function @code{assoc-string} is much like @code{assoc} except +that it ignores certain differences between strings. @xref{Text +Comparison}. @defun rassoc value alist This function returns the first association with value @var{value} in
--- a/lispref/minibuf.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/minibuf.texi Tue Dec 30 17:05:05 2003 +0000 @@ -1645,6 +1645,14 @@ other frame's minibuffer window. @end defun +@defun set-minibuffer-window window +This function specifies @var{window} as the minibuffer window to use. +This affects where the minibuffer is displayed if you put text in it +without invoking the usual minibuffer commands. It has no effect on +the usual minibuffer input functions because they all start by +choosing the minibuffer window according to the current frame. +@end defun + @c Emacs 19 feature @defun window-minibuffer-p window This function returns non-@code{nil} if @var{window} is a minibuffer window.
--- a/lispref/modes.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/modes.texi Tue Dec 30 17:05:05 2003 +0000 @@ -2024,9 +2024,10 @@ @var{matcher}, then you can use @code{regexp-opt-depth} (@pxref{Syntax of Regexps}) to calculate the value for @var{match}. -@item (@var{matcher} . @var{facename}) -In this kind of element, @var{facename} is an expression whose value -specifies the face name to use for highlighting. +@item (@var{matcher} . @var{facespec}) +In this kind of element, @var{facespec} is an object which specifies +the face variable to use for highlighting. In the simplest case, it +is a Lisp variable (a symbol), whose value should be a face name. @example ;; @r{Highlight occurrences of @samp{fubar},} @@ -2034,8 +2035,7 @@ ("fubar" . fubar-face) @end example -The value of @var{facename} is usually a face name (a symbol), but it -can also be a list of the form +However, @var{facespec} can also be a list of the form @example (face @var{face} @var{prop1} @var{val1} @var{prop2} @var{val2}@dots{}) @@ -2053,21 +2053,21 @@ It has the form @example -(@var{subexp} @var{facename} @var{override} @var{laxmatch}) +(@var{subexp} @var{facespec} @var{override} @var{laxmatch}) @end example The @sc{car}, @var{subexp}, is an integer specifying which subexpression of the match to fontify (0 means the entire matching text). The second -subelement, @var{facename}, specifies the face, as described above. +subelement, @var{facespec}, specifies the face, as described above. The last two values in @var{highlighter}, @var{override} and @var{laxmatch}, are flags. If @var{override} is @code{t}, this element can override existing fontification made by previous elements of @code{font-lock-keywords}. If it is @code{keep}, then each character is fontified if it has not been fontified already by some -other element. If it is @code{prepend}, the face @var{facename} is -added to the beginning of the @code{font-lock-face} property. If it -is @code{append}, the face @var{facename} is added to the end of the +other element. If it is @code{prepend}, the face specified by +@var{facespec} is added to the beginning of the @code{font-lock-face} +property. If it is @code{append}, the face is added to the end of the @code{font-lock-face} property. If @var{laxmatch} is non-@code{nil}, it means there should be no error @@ -2231,7 +2231,7 @@ Additional properties (other than @code{font-lock-face}) that are being managed by Font Lock mode. Font Lock mode normally manages only the @code{font-lock-face} property; if you want it to manage others as -well, you must specify them in a @var{facename} in +well, you must specify them in a @var{facespec} in @code{font-lock-keywords} as well as adding them to this list. @end defvar
--- a/lispref/nonascii.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/nonascii.texi Tue Dec 30 17:05:05 2003 +0000 @@ -210,6 +210,18 @@ returned unchanged. @end defun +@defun multibyte-char-to-unibyte char +This convert the multibyte character @var{char} to a unibyte +character, based on @code{nonascii-translation-table} and +@code{nonascii-insert-offset}. +@end defun + +@defun unibyte-char-to-multibyte char +This convert the unibyte character @var{char} to a multibyte +character, based on @code{nonascii-translation-table} and +@code{nonascii-insert-offset}. +@end defun + @node Selecting a Representation @section Selecting a Representation @@ -701,6 +713,26 @@ The variable @code{selection-coding-system} specifies how to encode selections for the window system. @xref{Window System Selections}. +@defvar file-name-coding-system +The variable @code{file-name-coding-system} specifies the coding +system to use for encoding file names. Emacs encodes file names using +that coding system for all file operations. If +@code{file-name-coding-system} is @code{nil}, Emacs uses a default +coding system determined by the selected language environment. In the +default language environment, any non-@acronym{ASCII} characters in +file names are not encoded specially; they appear in the file system +using the internal Emacs representation. +@end defvar + + @strong{Warning:} if you change @code{file-name-coding-system} (or +the language environment) in the middle of an Emacs session, problems +can result if you have already visited files whose names were encoded +using the earlier coding system and are handled differently under the +new coding system. If you try to save one of these buffers under the +visited file name, saving may use the wrong file name, or it may get +an error. If such a problem happens, use @kbd{C-x C-w} to specify a +new file name for that buffer. + @node Lisp and Coding Systems @subsection Coding Systems in Lisp
--- a/lispref/numbers.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/numbers.texi Tue Dec 30 17:05:05 2003 +0000 @@ -1047,8 +1047,8 @@ @tex @math{\pi/2} @end tex -(inclusive) whose sine is @var{arg}; if, however, @var{arg} -is out of range (outside [-1, 1]), then the result is a NaN. +(inclusive) whose sine is @var{arg}; if, however, @var{arg} is out of +range (outside [-1, 1]), it signals a @code{domain-error} error. @end defun @defun acos arg @@ -1059,8 +1059,8 @@ @tex @math{\pi} @end tex -(inclusive) whose cosine is @var{arg}; if, however, @var{arg} -is out of range (outside [-1, 1]), then the result is a NaN. +(inclusive) whose cosine is @var{arg}; if, however, @var{arg} is out +of range (outside [-1, 1]), it signals a @code{domain-error} error. @end defun @defun atan y &optional x @@ -1112,8 +1112,8 @@ @ifnottex @i{e} @end ifnottex -is used. If @var{arg} -is negative, the result is a NaN. +is used. If @var{arg} is negative, it signals a @code{domain-error} +error. @end defun @ignore @@ -1132,8 +1132,9 @@ @defun log10 arg This function returns the logarithm of @var{arg}, with base 10. If -@var{arg} is negative, the result is a NaN. @code{(log10 @var{x})} -@equiv{} @code{(log @var{x} 10)}, at least approximately. +@var{arg} is negative, it signals a @code{domain-error} error. +@code{(log10 @var{x})} @equiv{} @code{(log @var{x} 10)}, at least +approximately. @end defun @defun expt x y
--- a/lispref/os.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/os.texi Tue Dec 30 17:05:05 2003 +0000 @@ -1010,6 +1010,13 @@ (see above) and from @code{file-attributes} (@pxref{File Attributes}). @end defun +@defun set-time-zone-rule tz +This function specifies the local time zone according to @var{tz}. If +@var{tz} is @code{nil}, that means to use an implementation-defined +default time zone. If @var{tz} is @code{t}, that means to use +Universal Time. +@end defun + @defun float-time &optional time-value This function returns the current time as a floating-point number of seconds since the epoch. The argument @var{time-value}, if given,
--- a/lispref/strings.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/strings.texi Tue Dec 30 17:05:05 2003 +0000 @@ -379,6 +379,14 @@ character currently present at that point in @var{string}. @end defun + To clear out a string that contained a password, use +@code{clear-string}: + +@defun clear-string string +This clears the contents of @var{string} to zeros +and may change its length. +@end defun + @need 2000 @node Text Comparison @section Comparison of Characters and Strings @@ -518,13 +526,10 @@ portion) is less. @end defun -@defun assoc-ignore-case key alist -@defunx assoc-ignore-representation key alist -These functions work like @code{assoc}, except that @var{key} must be -a string, all elements of @var{alist} must be cons cells whose -@sc{car} is a string, and comparison is done using -@code{compare-strings}. @code{assoc-ignore-case} ignores case -differences, whereas @code{assoc-ignore-representation} does not. +@defun assoc-string key alist &optional case-fold +This function works like @code{assoc}, except that @var{key} must be a +string, and comparison is done using @code{compare-strings}. If +@var{case-fold} is non-@code{nil}, it ignores case differences. @xref{Association Lists}. @end defun
--- a/lispref/text.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/text.texi Tue Dec 30 17:05:05 2003 +0000 @@ -1890,7 +1890,8 @@ Column number computations ignore the width of the window and the amount of horizontal scrolling. Consequently, a column value can be -arbitrarily high. The first (or leftmost) column is numbered 0. +arbitrarily high. The first (or leftmost) column is numbered 0. They +also ignore overlays and text properties, aside from invisibility. @defun current-column This function returns the horizontal position of point, measured in @@ -2409,7 +2410,7 @@ the @var{prop} property of that symbol. @end defun -@defun get-char-property pos prop &optional object +@defun get-char-property position prop &optional object This function is like @code{get-text-property}, except that it checks overlays first and then text properties. @xref{Overlays}. @@ -2422,6 +2423,20 @@ overlays. @end defun +@defun get-char-property-and-overlay position prop &optional object +This is like @code{get-char-property}, but gives extra information +about the overlay that the property value comes from. + +Its value is a cons cell whose @sc{car} is the property value, the +same value @code{get-char-property} would return with the same +arguments. Its @sc{cdr} is the overlay in which the property was +found, or @code{nil}, if it was found as a text property or not found +at all. + +If @var{position} is at the end of @var{object}, both the @sc{car} and +the @sc{cdr} of the value are @code{nil}. +@end defun + @defvar char-property-alias-alist This variable holds an alist which maps property names to a list of alternative property names. If a character does not specify a direct @@ -2860,11 +2875,13 @@ commands. The property's value for the character before point applies if it is non-@code{nil} and rear-sticky, and the property's value for the character after point applies if it is non-@code{nil} and -front-sticky. When the value applies, it is used for key lookup -before the buffer's local map. (For mouse clicks, the position of the -click is used instead of the position of point.) If the property -value is a symbol, the symbol's function definition is used as the -keymap. @xref{Active Keymaps}. +front-sticky. (For mouse clicks, the position of the click is used +instead of the position of point.) If the property value is a symbol, +the symbol's function definition is used as the keymap. + +When this keymap applies, it is used for key lookup before the minor +mode keymaps and before the buffer's local map. @xref{Active +Keymaps}. @item local-map @kindex local-map @r{(text property)}
--- a/lispref/variables.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/variables.texi Tue Dec 30 17:05:05 2003 +0000 @@ -1335,6 +1335,12 @@ @code{nil}. @end defun +@defun local-variable-if-set-p variable &optional buffer +This returns @code{t} if @var{variable} will become buffer-local in +buffer @var{buffer} (which defaults to the current buffer) if it is +set there. +@end defun + @defun buffer-local-value variable buffer This function returns the buffer-local binding of @var{variable} (a symbol) in buffer @var{buffer}. If @var{variable} does not have a
--- a/lispref/windows.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/lispref/windows.texi Tue Dec 30 17:05:05 2003 +0000 @@ -1027,6 +1027,14 @@ create the frame. See above, under @code{special-display-buffer-names}. @end defopt +@defun special-display-p buffer-name +This function returns non-@code{nil} if displaying a buffer +named @var{buffer-name} with @code{display-buffer} would +create a special frame. The value is @code{t} if it would +use the default frame paramaters, or else the specified list +of frame parameters. +@end defun + @defvar special-display-function This variable holds the function to call to display a buffer specially. It receives the buffer as an argument, and should return the window in @@ -1075,6 +1083,12 @@ buffer by switching to it in the selected window. @end defopt +@defun same-window-p buffer-name +This function returns @code{t} if displaying a buffer +named @var{buffer-name} with @code{display-buffer} would +put it in the selected window. +@end defun + @c Emacs 19 feature @defvar display-buffer-function This variable is the most flexible way to customize the behavior of @@ -2163,10 +2177,15 @@ saved point or mark. @end defun - Primitives to look inside of window configurations would make sense, -but none are implemented. It is not clear they are useful enough to -be worth implementing. See the file @file{winner.el} for some more -operations on windows configurations. +@defun window-configuration-frame config +This function returns the frame for which the window configuration +@var{config} was made. +@end defun + + Other primitives to look inside of window configurations would make +sense, but are not implemented because we did not need them. See the +file @file{winner.el} for some more operations on windows +configurations. @node Window Hooks @section Hooks for Window Scrolling and Changes
--- a/man/ChangeLog Tue Dec 30 17:02:33 2003 +0000 +++ b/man/ChangeLog Tue Dec 30 17:05:05 2003 +0000 @@ -1,3 +1,9 @@ +2003-12-29 Kevin Ryde <user42@zip.com.au> + + * viper.texi (Vi Macros): Fix reference to the Emacs manual. + + * programs.texi (C Modes): Fix the xref. + 2003-12-23 Nick Roberts <nick@nick.uklinux.net> * building.texi (Watch Expressions): Update.
--- a/man/programs.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/man/programs.texi Tue Dec 30 17:05:05 2003 +0000 @@ -1398,8 +1398,8 @@ This section gives a brief description of the special features available in C, C++, Objective-C, Java, CORBA IDL, and Pike modes. -(These are called ``C mode and related modes.'') @xref{Top, CC Mode, -ccmode, , CC Mode}, for a more extensive description of these modes +(These are called ``C mode and related modes.'') @xref{Top, , CC Mode, +ccmode, CC Mode}, for a more extensive description of these modes and their special features. @menu
--- a/man/viper.texi Tue Dec 30 17:02:33 2003 +0000 +++ b/man/viper.texi Tue Dec 30 17:05:05 2003 +0000 @@ -2779,7 +2779,7 @@ macros) lets the user define keyboard macros that ask for confirmation or even prompt the user for input and then continue. To do this, one should type @kbd{C-x q} (for confirmation) or @kbd{C-u C-x q} (for prompt). -For details, @pxref{Kbd Macro Query,,Customization,emacs,The GNU Emacs +For details, @pxref{Keyboard Macro Query,,Customization,emacs,The GNU Emacs Manual} @refill When the user finishes defining a macro (which is done by typing @kbd{C-x)} ---
--- a/src/ChangeLog Tue Dec 30 17:02:33 2003 +0000 +++ b/src/ChangeLog Tue Dec 30 17:05:05 2003 +0000 @@ -1,3 +1,46 @@ +2003-12-29 James Clark <jjc@jclark.com> (tiny change) + + * fns.c (internal_equal): Return t for two NaN arguments. + +2003-12-29 Richard M. Stallman <rms@gnu.org> + + * data.c (store_symval_forwarding): Handle setting + default-fill-column, etc., by changing the value in + buffers that use the default. + + * minibuf.c (Fset_minibuffer_window): Doc fix. + + * fileio.c (choose_write_coding_system): Ignore auto_saving + if using the visited file for auto saves. + (Fwrite_region): Don't update SAVE_MODIFF + if auto-saving in visited file. + +2003-12-29 Kenichi Handa <handa@m17n.org> + + * dispextern.h (face_font_available_p): Extern it. + + * fontset.c (Voverriding_fontspec_alist): New variable. + (lookup_overriding_fontspec): New function. + (fontset_ref_via_base): Call lookup_overriding_fontspec if + necessary. + (fontset_font_pattern): Likewise. + (regulalize_fontname): New function. + (Fset_fontset_font): Call regulalize_fontname. + (Fset_overriding_fontspec_internal): New function. + (syms_of_fontset): Initialize and staticprop + Voverriding_fontspec_alist. Defsubr + Sset_overriding_fontspec_internal. + + * xfaces.c (face_font_available_p): New function. + +2003-12-28 Richard M. Stallman <rms@gnu.org> + + * buffer.c (Fother_buffer): Don't crash if BUF is nil + or if its name is nil. + + * buffer.c (Fkill_buffer): Don't delete auto-save file + if it's the same as the visited file. + 2003-12-28 Luc Teirlinck <teirllm@auburn.edu> * coding.c (Fcheck_coding_system): Doc fix.
--- a/src/buffer.h Tue Dec 30 17:02:33 2003 +0000 +++ b/src/buffer.h Tue Dec 30 17:05:05 2003 +0000 @@ -906,8 +906,26 @@ (B)->local_flags[IDX] = (VAL); \ } while (0) -/* Return the index of the per-buffer variable at offset OFFSET in the - buffer structure. */ +/* Return the index value of the per-buffer variable at offset OFFSET + in the buffer structure. + + If the slot OFFSET has a corresponding default value in + buffer_defaults, the index value is positive and has only one + nonzero bit. When a buffer has its own local value for a slot, the + bit for that slot (found in the same slot in this structure) is + turned on in the buffer's local_flags array. + + If the index value is -1, even though there may be a + DEFVAR_PER_BUFFER for the slot, there is no default value for it; + and the corresponding slot in buffer_defaults is not used. + + If the index value is -2, then there is no DEFVAR_PER_BUFFER for + the slot, but there is a default value which is copied into each + new buffer. + + If a slot in this structure corresponding to a DEFVAR_PER_BUFFER is + zero, that is a bug */ + #define PER_BUFFER_IDX(OFFSET) \ XINT (*(Lisp_Object *)((OFFSET) + (char *) &buffer_local_flags))
--- a/src/data.c Tue Dec 30 17:02:33 2003 +0000 +++ b/src/data.c Tue Dec 30 17:05:05 2003 +0000 @@ -873,6 +873,8 @@ register Lisp_Object valcontents, newval; struct buffer *buf; { + int offset; + switch (SWITCH_ENUM_CAST (XTYPE (valcontents))) { case Lisp_Misc: @@ -892,6 +894,36 @@ case Lisp_Misc_Objfwd: *XOBJFWD (valcontents)->objvar = newval; + + /* If this variable is a default for something stored + in the buffer itself, such as default-fill-column, + find the buffers that don't have local values for it + and update them. */ + if (XOBJFWD (valcontents)->objvar > (Lisp_Object *) &buffer_defaults + && XOBJFWD (valcontents)->objvar < (Lisp_Object *) (&buffer_defaults + 1)) + { + int offset = ((char *) XOBJFWD (valcontents)->objvar + - (char *) &buffer_defaults); + int idx = PER_BUFFER_IDX (offset); + + Lisp_Object tail, buf; + + if (idx <= 0) + break; + + for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail)) + { + Lisp_Object buf; + struct buffer *b; + + buf = Fcdr (XCAR (tail)); + if (!BUFFERP (buf)) continue; + b = XBUFFER (buf); + + if (! PER_BUFFER_VALUE_P (b, idx)) + PER_BUFFER_VALUE (b, offset) = newval; + } + } break; case Lisp_Misc_Buffer_Objfwd:
--- a/src/dispextern.h Tue Dec 30 17:02:33 2003 +0000 +++ b/src/dispextern.h Tue Dec 30 17:05:05 2003 +0000 @@ -2582,6 +2582,7 @@ unsigned long load_color P_ ((struct frame *, struct face *, Lisp_Object, enum lface_attribute_index)); void unload_color P_ ((struct frame *, unsigned long)); +int face_font_available_p P_ ((struct frame *, Lisp_Object)); int ascii_face_of_lisp_face P_ ((struct frame *, int)); void prepare_face_for_display P_ ((struct frame *, struct face *)); int xstricmp P_ ((const unsigned char *, const unsigned char *));
--- a/src/eval.c Tue Dec 30 17:02:33 2003 +0000 +++ b/src/eval.c Tue Dec 30 17:05:05 2003 +0000 @@ -2641,6 +2641,8 @@ #endif /* not NO_ARG_ARRAY */ } +/* The caller should GCPRO all the elements of ARGS. */ + DEFUN ("funcall", Ffuncall, Sfuncall, 1, MANY, 0, doc: /* Call first argument as a function, passing remaining arguments to it. Return the value that function returns.
--- a/src/fileio.c Tue Dec 30 17:02:33 2003 +0000 +++ b/src/fileio.c Tue Dec 30 17:05:05 2003 +0000 @@ -4685,7 +4685,9 @@ { Lisp_Object val; - if (auto_saving) + if (auto_saving + && NILP (Fstring_equal (current_buffer->filename, + current_buffer->auto_save_file_name))) { /* We use emacs-mule for auto saving... */ setup_coding_system (Qemacs_mule, coding); @@ -5221,7 +5223,14 @@ update_mode_lines++; } else if (quietly) - return Qnil; + { + if (auto_saving + && ! NILP (Fstring_equal (current_buffer->filename, + current_buffer->auto_save_file_name))) + SAVE_MODIFF = MODIFF; + + return Qnil; + } if (!auto_saving) message_with_string ((INTEGERP (append) @@ -5776,11 +5785,14 @@ minibuffer_auto_raise = 0; auto_saving = 1; - /* First, save all files which don't have handlers. If Emacs is - crashing, the handlers may tweak what is causing Emacs to crash - in the first place, and it would be a shame if Emacs failed to - autosave perfectly ordinary files because it couldn't handle some - ange-ftp'd file. */ + /* On first pass, save all files that don't have handlers. + On second pass, save all files that do have handlers. + + If Emacs is crashing, the handlers may tweak what is causing + Emacs to crash in the first place, and it would be a shame if + Emacs failed to autosave perfectly ordinary files because it + couldn't handle some ange-ftp'd file. */ + for (do_handled_files = 0; do_handled_files < 2; do_handled_files++) for (tail = Vbuffer_alist; GC_CONSP (tail); tail = XCDR (tail)) {
--- a/src/fns.c Tue Dec 30 17:02:33 2003 +0000 +++ b/src/fns.c Tue Dec 30 17:05:05 2003 +0000 @@ -2169,7 +2169,15 @@ switch (XTYPE (o1)) { case Lisp_Float: - return (extract_float (o1) == extract_float (o2)); + { + double d1, d2; + + d1 = extract_float (o1); + d2 = extract_float (o2); + /* If d is a NaN, then d != d. Two NaNs should be `equal' even + though they are not =. */ + return d1 == d2 || (d1 != d1 && d2 != d2); + } case Lisp_Cons: if (!internal_equal (XCAR (o1), XCAR (o2), depth + 1))
--- a/src/fontset.c Tue Dec 30 17:02:33 2003 +0000 +++ b/src/fontset.c Tue Dec 30 17:05:05 2003 +0000 @@ -140,6 +140,10 @@ font for each characters. */ static Lisp_Object Vdefault_fontset; +/* Alist of font specifications. It override the font specification + in the default fontset. */ +static Lisp_Object Voverriding_fontspec_alist; + Lisp_Object Vfont_encoding_alist; Lisp_Object Vuse_default_ascent; Lisp_Object Vignore_relative_composition; @@ -184,11 +188,13 @@ /* Prototype declarations for static functions. */ static Lisp_Object fontset_ref P_ ((Lisp_Object, int)); +static Lisp_Object lookup_overriding_fontspec P_ ((Lisp_Object, int)); static void fontset_set P_ ((Lisp_Object, int, Lisp_Object)); static Lisp_Object make_fontset P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); static int fontset_id_valid_p P_ ((int)); static Lisp_Object fontset_pattern_regexp P_ ((Lisp_Object)); static Lisp_Object font_family_registry P_ ((Lisp_Object, int)); +static Lisp_Object regulalize_fontname P_ ((Lisp_Object)); /********** MACROS AND FUNCTIONS TO HANDLE FONTSET **********/ @@ -241,6 +247,46 @@ } +static Lisp_Object +lookup_overriding_fontspec (frame, c) + Lisp_Object frame; + int c; +{ + Lisp_Object tail; + + for (tail = Voverriding_fontspec_alist; CONSP (tail); tail = XCDR (tail)) + { + Lisp_Object val, target, elt; + + val = XCAR (tail); + target = XCAR (val); + val = XCDR (val); + /* Now VAL is (NO-FRAME-LIST OK-FRAME-LIST CHAR FONTNAME). */ + if (NILP (Fmemq (frame, XCAR (val))) + && (CHAR_TABLE_P (target) + ? ! NILP (CHAR_TABLE_REF (target, c)) + : XINT (target) == CHAR_CHARSET (c))) + { + val = XCDR (val); + elt = XCDR (val); + if (NILP (Fmemq (frame, XCAR (val)))) + { + if (! face_font_available_p (XFRAME (frame), XCDR (elt))) + { + val = XCDR (XCAR (tail)); + XSETCAR (val, Fcons (frame, XCAR (val))); + continue; + } + XSETCAR (val, Fcons (frame, XCAR (val))); + } + if (NILP (XCAR (elt))) + XSETCAR (elt, make_number (c)); + return elt; + } + } + return Qnil; +} + #define FONTSET_REF_VIA_BASE(fontset, c) fontset_ref_via_base (fontset, &c) static Lisp_Object @@ -254,8 +300,12 @@ if (SINGLE_BYTE_CHAR_P (*c)) return FONTSET_ASCII (fontset); - elt = FONTSET_REF (FONTSET_BASE (fontset), *c); - if (NILP (elt) && ! EQ (fontset, Vdefault_fontset)) + elt = Qnil; + if (! EQ (FONTSET_BASE (fontset), Vdefault_fontset)) + elt = FONTSET_REF (FONTSET_BASE (fontset), *c); + if (NILP (elt)) + elt = lookup_overriding_fontspec (FONTSET_FRAME (fontset), *c); + if (NILP (elt) && ! EQ (FONTSET_BASE (fontset), Vdefault_fontset)) elt = FONTSET_REF (Vdefault_fontset, *c); if (NILP (elt)) return Qnil; @@ -551,6 +601,13 @@ elt = FONTSET_REF (fontset, c); } if (NILP (elt)) + { + Lisp_Object frame; + + XSETFRAME (frame, f); + elt = lookup_overriding_fontspec (frame, c); + } + if (NILP (elt)) elt = FONTSET_REF (Vdefault_fontset, c); if (!CONSP (elt)) @@ -980,6 +1037,33 @@ return FONTSET_FROM_ID (id); } +/* Downcase FONTNAME or car and cdr of FONTNAME. If FONTNAME is a + string, maybe change FONTNAME to (FAMILY . REGISTRY). */ + +static Lisp_Object +regulalize_fontname (Lisp_Object fontname) +{ + Lisp_Object family, registry; + + if (STRINGP (fontname)) + return font_family_registry (Fdowncase (fontname), 0); + + CHECK_CONS (fontname); + family = XCAR (fontname); + registry = XCDR (fontname); + if (!NILP (family)) + { + CHECK_STRING (family); + family = Fdowncase (family); + } + if (!NILP (registry)) + { + CHECK_STRING (registry); + registry = Fdowncase (registry); + } + return Fcons (family, registry); +} + DEFUN ("set-fontset-font", Fset_fontset_font, Sset_fontset_font, 3, 4, 0, doc: /* Modify fontset NAME to use FONTNAME for CHARACTER. @@ -1043,34 +1127,12 @@ error ("Can't change font for a single byte character"); } - if (STRINGP (fontname)) - { - fontname = Fdowncase (fontname); - elt = Fcons (make_number (from), font_family_registry (fontname, 0)); - } - else - { - CHECK_CONS (fontname); - family = XCAR (fontname); - registry = XCDR (fontname); - if (!NILP (family)) - { - CHECK_STRING (family); - family = Fdowncase (family); - } - if (!NILP (registry)) - { - CHECK_STRING (registry); - registry = Fdowncase (registry); - } - elt = Fcons (make_number (from), Fcons (family, registry)); - } - /* The arg FRAME is kept for backward compatibility. We only check the validity. */ if (!NILP (frame)) CHECK_LIVE_FRAME (frame); + elt = Fcons (make_number (from), regulalize_fontname (fontname)); for (; from <= to; from++) FONTSET_SET (fontset, from, elt); Foptimize_char_table (fontset); @@ -1445,6 +1507,60 @@ return list; } +DEFUN ("set-overriding-fontspec-internal", Fset_overriding_fontspec_internal, + Sset_overriding_fontspec_internal, 1, 1, 0, + doc: /* Internal use only. + +FONTLIST is an alist of TARGET vs FONTNAME, where TARGET is a charset +or a char-table, FONTNAME have the same meanings as in +`set-fontset-font'. + +It overrides the font specifications for each TARGET in the default +fontset by the corresponding FONTNAME. + +If TARGET is a charset, targets are all characters in the charset. If +TARGET is a char-table, targets are characters whose value is non-nil +in the table. + +It is intended that this function is called only from +`set-language-environment'. */) + (fontlist) + Lisp_Object fontlist; +{ + Lisp_Object tail; + + fontlist = Fcopy_sequence (fontlist); + /* Now FONTLIST is ((TARGET . FONTNAME) ...). Reform it to ((TARGET + nil nil nil FONTSPEC) ...), where TARGET is a charset-id or a + char-table. */ + for (tail = fontlist; CONSP (tail); tail = XCDR (tail)) + { + Lisp_Object elt, target; + + elt = XCAR (tail); + target = Fcar (elt); + elt = Fcons (Qnil, regulalize_fontname (Fcdr (elt))); + if (! CHAR_TABLE_P (target)) + { + int charset, c; + + CHECK_SYMBOL (target); + charset = get_charset_id (target); + if (charset < 0) + error ("Invalid charset %s", SDATA (SYMBOL_NAME (target))); + target = make_number (charset); + c = MAKE_CHAR (charset, 0, 0); + XSETCAR (elt, make_number (c)); + } + elt = Fcons (target, Fcons (Qnil, Fcons (Qnil, elt))); + XSETCAR (tail, elt); + } + Voverriding_fontspec_alist = fontlist; + clear_face_cache (0); + ++windows_or_buffers_changed; + return Qnil; +} + void syms_of_fontset () { @@ -1483,6 +1599,9 @@ AREF (Vfontset_table, 0) = Vdefault_fontset; next_fontset_id = 1; + Voverriding_fontspec_alist = Qnil; + staticpro (&Voverriding_fontspec_alist); + DEFVAR_LISP ("font-encoding-alist", &Vfont_encoding_alist, doc: /* Alist of fontname patterns vs corresponding encoding info. Each element looks like (REGEXP . ENCODING-INFO), @@ -1548,6 +1667,7 @@ defsubr (&Sfontset_info); defsubr (&Sfontset_font); defsubr (&Sfontset_list); + defsubr (&Sset_overriding_fontspec_internal); } /* arch-tag: ea861585-2f5f-4e5b-9849-d04a9c3a3537
--- a/src/minibuf.c Tue Dec 30 17:02:33 2003 +0000 +++ b/src/minibuf.c Tue Dec 30 17:05:05 2003 +0000 @@ -189,7 +189,7 @@ DEFUN ("set-minibuffer-window", Fset_minibuffer_window, Sset_minibuffer_window, 1, 1, 0, doc: /* Specify which minibuffer window to use for the minibuffer. -This effects where the minibuffer is displayed if you put text in it +This affects where the minibuffer is displayed if you put text in it without invoking the usual minibuffer commands. */) (window) Lisp_Object window;
--- a/src/xfaces.c Tue Dec 30 17:02:33 2003 +0000 +++ b/src/xfaces.c Tue Dec 30 17:05:05 2003 +0000 @@ -2564,6 +2564,69 @@ } +/* Check if a font matching pattern_offset_t on frame F is available + or not. PATTERN may be a cons (FAMILY . REGISTRY), in which case, + a font name pattern is generated from FAMILY and REGISTRY. */ + +int +face_font_available_p (f, pattern) + struct frame *f; + Lisp_Object pattern; +{ + Lisp_Object fonts; + + if (! STRINGP (pattern)) + { + Lisp_Object family, registry; + char *family_str, *registry_str, *pattern_str; + + CHECK_CONS (pattern); + family = XCAR (pattern); + if (NILP (family)) + family_str = "*"; + else + { + CHECK_STRING (family); + family_str = (char *) SDATA (family); + } + registry = XCDR (pattern); + if (NILP (registry)) + registry_str = "*"; + else + { + CHECK_STRING (registry); + registry_str = (char *) SDATA (registry); + } + + pattern_str = (char *) alloca (strlen (family_str) + + strlen (registry_str) + + 10); + strcpy (pattern_str, index (family_str, '-') ? "-" : "-*-"); + strcat (pattern_str, family_str); + strcat (pattern_str, "-*-"); + strcat (pattern_str, registry_str); + if (!index (registry_str, '-')) + { + if (registry_str[strlen (registry_str) - 1] == '*') + strcat (pattern_str, "-*"); + else + strcat (pattern_str, "*-*"); + } + pattern = build_string (pattern_str); + } + + /* Get the list of fonts matching PATTERN. */ +#ifdef WINDOWSNT + BLOCK_INPUT; + fonts = w32_list_fonts (f, pattern, 0, 1); + UNBLOCK_INPUT; +#else + fonts = x_list_fonts (f, pattern, -1, 1); +#endif + return XINT (Flength (fonts)); +} + + /* Determine fonts matching PATTERN on frame F. Sort resulting fonts using comparison function CMPFN. Value is the number of fonts found. If value is non-zero, *FONTS is set to a vector of