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:
 
Binary file lisp/toolbar/gud-n.pbm has changed
--- /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           ",
+"                        ",
+"                        ",
+"                        ",
+"                        "};
Binary file lisp/toolbar/gud-next.pbm has changed
--- 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           ",
-"                        ",
-"                        ",
-"                        ",
-"                        "};
Binary file lisp/toolbar/gud-nexti.pbm has changed
--- 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+           ",
-"        +  +            ",
-"                        ",
-"                        ",
-"                        ",
-"                        ",
-"                        "};
Binary file lisp/toolbar/gud-ni.pbm has changed
--- /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+           ",
+"        +  +            ",
+"                        ",
+"                        ",
+"                        ",
+"                        ",
+"                        "};
Binary file lisp/toolbar/gud-s.pbm has changed
--- /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      ",
+"                        ",
+"                        ",
+"                        ",
+"                        "};
Binary file lisp/toolbar/gud-si.pbm has changed
--- /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       ",
+"                        ",
+"                        ",
+"                        ",
+"                        ",
+"                        ",
+"                        "};
Binary file lisp/toolbar/gud-step.pbm has changed
--- 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      ",
-"                        ",
-"                        ",
-"                        ",
-"                        "};
Binary file lisp/toolbar/gud-stepi.pbm has changed
--- 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