Предисловие
Это руководство описывает использование и простую настройку редактора Emacs. От читателя не требуется быть программистом; для простой настройки не надо обладать навыками в программировании. Те пользователи, которые не интересуются настройкой, могут пропускать рассыпанные по тексту краткие советы по ней.
Это, главным образом, справочное руководство, но его также можно использовать в качестве учебника. Для тех, кто еще совсем не знаком с Emacs, неплохой идеей будет начать с обучающей диалоговой программы. Чтобы вызвать ее, запустите Emacs и наберите C-h t. Тогда вы сможете изучить Emacs, используя его в специально разработанном файле, который описывает команды, говорит, когда их использовать, а затем объясняет полученные с помощью этих команд результаты.
При первом чтении просто бегло просмотрите первую и вторую главы, в которых описана принятая в этом руководстве система обозначений и общий вид экрана в Emacs. Обратите внимание, на какие вопросы есть ответы в этих главах, чтобы вы могли вернуться к ним позже. После прочтения четвертой главы вы должны попрактиковаться с рассмотренными в ней командами. Следующие несколько глав описывают часто используемые фундаментальные методы и понятия. Вам нужно понять их до конца, экспериментируя с ними, если это необходимо.
Главы с четырнадцатой по девятнадцатую описывают средства среднего уровня, полезные в любых видах редактирования. Глава 20 и последующие описывают возможности, которые вы можете захотеть использовать, а можете и не захотеть; причитайте эти главы, когда эти возможности вам понадобятся.
Если вам кажется, что Emacs работает неправильно, прочтите главу о решении проблем. Она объясняет, как справиться с некоторыми часто возникающими трудностями (смотрите раздел Что делать с неполадками в Emacs), а также когда и как нужно сообщать об ошибках в Emacs (смотрите раздел Описание ошибок в Emacs).
Чтобы отыскать документацию на отдельную команду, загляните в именной указатель. Ключи (литеральные команды) и имена команд перечислены в отдельных именных указателях. Также имеется словарь с перекрестными ссылками на каждый термин.
Данное руководство доступно в печатной форме и в виде Info-файла. Info-файл служит для диалогового чтения с программой Info; это будет первичным способом просмотра интерактивной документации в системе GNU. И этот Info-файл, и сама программа Info распространяются вместе с GNU Emacs. Печатная книга и Info-файл содержат по сути один тот же текст и создаются из общего исходного файла, который также распространяется вместе с GNU Emacs.
GNU Emacs -- член семейства Emacs-редакторов, насчитывающего большое число редакторов, построенных на общих организационных принципах. Чтобы почитать о философии, лежащей в основе Emacs, и уроках, полученных из его развития, выпишите копию AI memo 519a "Emacs, the Extensible, customizable Self-Documenting Display Editor", в Publication Department, Artificial Intelligence Lab, 545 Tech Square, Cambridge, MA 02139, USA. По последним сообщениям они стоили $2.25 за копию. Другая полезная публикация -- это LCS TM-165, "A Cookbook for an Emacs", Craig Finseth, доступная из Publication Department, Laboratory for Computer Seince, 543 Tech Square, Cambridge, MA 02139, USA. Сегодняшняя цена $3.
Эта редакция руководства предназначена для использования с GNU Emacs, установленном в системах GNU и Unix. GNU Emacs также можно использовать в системах VMS, MS-DOS (иначе называемой MS-DOG), Windows NT и Windows 95. Эти системы придерживаются другого синтаксиса имен файлов; кроме того, VMS и MS-DOS не поддерживают всех возможностей GNU Emacs. В этом руководстве мы не пытаемся описать применение Emacs в системе VMS. Для получения информации об использовании Emacs в MS-DOS смотрите раздел Emacs и MS-DOS.
Распространение
GNU Emacs -- свободная программа; это значит, что всякий может свободно использовать и повторно распространять его при соблюдении определенных условий. GNU Emacs не является общественным достоянием; на него действуют авторские права, и на его распространение есть ограничения, но эти ограничения разработаны так, чтобы позволить все, что может захотеть хороший благонамеренный гражданин. Что не разрешается, так это пытаться мешать другим и далее совместно пользоваться любой версией GNU Emacs, которую они могли бы от вас получить. Точные условия находятся в Универсальной Общественной Лицензии GNU, которая поставляется с Emacs и также идет в следующем разделе.
Один из способов получить копию GNU Emacs -- взять ее кого-то, у кого Emacs уже есть. Вам не нужно просить нашего разрешения либо что-то еще, просто скопируйте ее. Если вы имеете доступ к Internet, вы можете получить последнюю версию дистрибутива GNU Emacs по анонимному FTP; подробности смотрите в файле `etc/FTP' в поставке Emacs.
Вы можете также получить GNU Emacs, когда покупаете компьютер. Производители компьютеров могут распространять копии на тех же самых условиях, что и все остальные. Эти условия требуют от них дать вам полные исходные тексты, включая любые изменения, сделанные ими, и разрешить вам распространять полученный от них GNU Emacs согласно обычным условиям Универсальной Общественной Лицензии. Другими словами, эта программа должна быть свободной для вас, когда вы ее получаете, а не только свободной для производителей.
Вы также можете заказать копии GNU Emacs у Фонда Свободного ПО на компакт-диске. Это удобный и надежный способ получить копию; это также хороший способ помочь средствами нашей работе. (Фонд всегда получал большую часть средств таким способом.) Форма заказа включена в файл `etc/ORDERS' в поставке Emacs, она есть и на нашем Web-сайте http://www.gnu.org/order/order.html. Для получения дополнительной информации пишите по адресу
Free Software Foundation 59 Temple Place, Suite 330 Boston, MA 02111-1307 USA USA
Доход от платы за распространение идет на поддержку целей фонда: разработки нового свободного программного обеспечения и развития наших существующих программ, включая GNU Emacs.
Если вы находите GNU Emacs полезным, пожалуйста пришлите взнос в Фонд Свободного программного обеспечения, чтобы поддержать нашу работу. Пожертвования в Фонд Свободного ПО в США обладают налоговой скидкой. Если вы используете GNU Emacs на работе, пожалуйста, предложите вашей компании сделать взнос. Если политика компании недружелюбно относится к идее пожертвования благотворительной организации, вы можете вместо этого предложить время от времени заказывать у Фонда Свободного ПО компакт-диски или подписаться на регулярные обновления.
В разработке GNU Emacs принимали участие Пер Абрахамсен, Джей К. Адамс, Джо Арсено, Боаз Бен-Цви, Джим Блэнди, Дэвид М. Браун, Теренс М. Бренон, Питер Бретон, Фрэнк Брец, Кевин Броди, Винсент Броман, Нейл В. Ван Дайк, Мортен Велиндер, Ульрик Виет, Майк Вильямс, Родни Витби, Феликс С. Т. Ву, Стивен А. Вуд, Барри Ворсо, Джоан Вроманс, Том Вурглер, Кейт Габриэльски, Кевин Галахер, Кевин Галло, Дуг Гвин, Говард Гейл, Анри Гийом, Дэвид Гиллеспи, Стивен Гильди, Боб Гликстайн, Борис Голдовски, Микеланджело Григни, Майкл Гшвинд, Матье Девин, Майкл ДеКорте, Гари Делп, Кайл Джонс, Майкл К. Джонсон, Эрик Динг, Карстен Доминик, Скотт Дрейвс, Виктор Духовни, Джеми Завински, Эли Зарецкий, Нил Зиринг, Вильям Зоммерфельд, Ларс Ингебригтсен, Эндрю Иннес, Джон Итон, Томодзи Кагатани, Говард Кайе, Майкл Кайфер, Брюстер Кале, Билл Карпентер, Дуг Катинг, Давид Кауфман, Генри Кауц, Джеф Кёнинг, Ричард Кинг, Джеймс Кларк, Майк Кларксон, Глин Клементс, Дэвид Когедал, Ларри К. Колодни, Роберт Кравиц, Себастиан Кремер, Эндрю Ксилаг, Даниель ЛаЛиберт, Аарон Ларсон, Джеймс Р. Ларус, Фредерик Лепье, Ларс Линдберг, Эрик Лудлам, Роланд МакГрат, Билл Манн, Кен Манхаймер, Брайан Марик, Бенгт Мартенсон, Чарли Мартин, Саймон Маршалл, Дэвид Меггинсон, Томас Мей, Нейл М. Мейгер, Вейн Месард, Ричард Млинарик, Кейт Мур, Эрик Наггум, Юрген Никельсен, Томас Нойман, Джефф Норден, Эндрю Норман, Майк Ньютон, Джефф Пек, Дамон Антон Пермезель, Том Перрин, Йенс Петерсен, Кристиан Плонт, Франческо Поторти, Майкл Д. Прандж, Дэниел Пфайфер, Фред Пьерестегай, Эшвин Рам, Пол Рейли, Эрик С. Реймонд, Эдвард М. Рейнгольд, Роб Рипел, Роланд Б. Робертс, Джон Робинсон, Гилермо Х. Розас, Вильям Розенблат, Денни Розендаль, Ивар Руммелхоф, Вольфганг Рупрехт, Масахико Сато, Мануэль Серрано, Эспен Скоглунд, Рик Сладки, Линн Слейтер, Дэвид Смит, Крис Смит, Пол Д. Смит, Майкл Статс, Аке Стенхофф, Питер Стефенсон, Джонатан Стигельман, Стив Страссман, Джеймс Б. Сэлем, Йенс Т. Бергер Тиэльман, Спенсер Томас, Джим Томпсон, Эд Уилкинсон, Масанобу Умеда, Дейл Р. Уорли, Джозеф Брайан Уэллс, Фредерик Фернбак, Фред Фиш, Карл Фогель, Джефри Фолькер, Гари Фостер, Ной Фридмен, Джон Хайдеман, Кеничи Ханда, К. Шейн Хартман, Маркус Херич, Манабу Хигасида, Карл Хойер, Андерс Холст, Курт Хорник, Том Хулдер, Крис Хэнсон, Рето Циммерман, Ян Т. Циммерман, Станислав Шалунов, Марк Шапиро, Рэндел Шварц, Вильям Шелтер, Ричард Шерман, Олин Шиверс, Ральф Шлайхер, Грегор Шмид, Майкл Шмидт, Рональд С. Шнель, Филипп Шнобелен, Стефан Шоэф, Сема Штейнгольд, Ганс Чалупски, Боб Чассел, Рольф Эберт, Стивен Эглен, Торбьорн Эйнарсон, Цугутомо Энами, Ганс Генрик Эриксен, Майкл Эрнст и Ата Этемади.
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and modification follow.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
- You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
- You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
- You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
- You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
- If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
- You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
- Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
- Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
- Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
- You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
- You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
- Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
- If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
- If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
- The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
- If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
- BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the program's name and an idea of what it does. Copyright (C) 19yy name of author This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice
This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU
Версия 2, июнь 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA (C) Перевод. О.В. Кузина, В.М. Юфа, 1993 (C) Перевод. О.С. Тихонов, 1998 Этот документ можно копировать, а также распространять его дословные копии, однако вносить в него изменения запрещено.
Преамбула
Лицензии на большую часть программного обеспечения (ПО) составлены так, чтобы лишить вас свободы совместно использовать и изменять его. В противоположность этому, предназначение Универсальной Общественной Лицензии GNU состоит в том, чтобы гарантировать вашу свободу совместно использовать и изменять свободное ПО, т.е. обеспечить свободу ПО для всех его пользователей. Данная Универсальная Общественная Лицензия применима к большей части ПО Фонда Свободного ПО и ко всем другим программам, чьи авторы принимают на себя обязательство ее использовать. (Для некоторых программ Фонда Свободного ПО вместо нее применяется Универсальная Общественная Лицензия GNU для библиотек.) Вы тоже можете применить ее к своим программам.
Когда мы говорим о свободном ПО, мы имеем в виду свободу, а не бесплатность. Наши Универсальные Общественные Лицензии разрабатывались для того, чтобы гарантировать, что вы пользуетесь свободой распространять копии свободного ПО (и при желании получать за это вознаграждение); что вы получаете исходный код или можете получить его, если захотите; что вы можете изменять ПО или использовать его части в новых свободных программах; и что вы знаете обо всех этих правах.
Чтобы защитить ваши права, нам нужно ввести некоторые ограничения, которые запретят кому бы то ни было отказывать вам в этих правах или потребовать от вас отказаться от этих прав. Эти ограничения накладывают на вас некоторые обязательства, если вы распространяете копии ПО или изменяете его.
Например, если вы распространяете копии такой программы бесплатно или за вознаграждение, вы должны предоставить получателям все права, которыми обладаете вы сами. Вы должны гарантировать, что они тоже получат или смогут получить исходный код. Наконец, вы должны показать им текст данных условий, чтобы они знали о своих правах.
Мы защищаем ваши права в два этапа: (1) сохраняем авторские права на ПО и (2) предлагаем вам эту лицензию, которая дает вам законное право копировать, распространять и/или модифицировать ПО.
Кроме того, в целях защиты как каждого автора, так и нас, мы хотим удостовериться, что каждый понимает, что гарантий на это свободное ПО нет. Если ПО модифицируется и передается кем-то еще, мы хотим, чтобы получатели ПО знали, что то, что у них есть, -- это не оригинал, чтобы любые проблемы, созданные другими, не отразились на репутации первоначальных авторов.
И наконец, каждой свободной программе постоянно угрожают патенты на ПО. Мы хотим избежать той опасности, что повторные распространители свободной программы самостоятельно получат патенты, делая программу таким образом частной собственностью. Чтобы предотвратить это, мы со всей определенностью заявляем, что любой патент должен быть либо предоставлен всем для свободного использования, либо не предоставлен никому.
Ниже следуют точные определения и условия для копирования, распространения и модификации.
ОПРЕДЕЛЕНИЯ И УСЛОВИЯ ДЛЯ КОПИРОВАНИЯ, РАСПРОСТРАНЕНИЯ И МОДИФИКАЦИИ
- Эта Лицензия применима к любой программе или другому произведению, содержащему уведомление, помещенное держателем авторских прав и сообщающее о том, что оно может распространяться при условиях, оговоренных в данной Универсальной Общественной Лицензии. В дальнейшем термин "Программа" относится к любой такой программе или произведению, а термин "произведение, основанное на Программе" означает Программу или любое произведение, содержащее Программу или ее часть, дословную, или модифицированную, и/или переведенную на другой язык. (Здесь и далее перевод включается без ограничений в понятие "модификация".) Каждый обладатель лицензии адресуется как "вы". Виды деятельности, не являющиеся копированием, распространением или модификацией, не охватываются данной Лицензией; они лежат за пределами ее влияния. Использование Программы по ее функциональному назначению не ограничено, а выходные данные Программы охватываются этой Лицензией, только если их содержание является произведением, основанным на Программе (вне зависимости от того, были ли они получены в процессе использования Программы). Являются ли они таковыми, зависит от того, что именно делает Программа.
- Вы можете копировать и распространять дословные копии исходного кода Программы по его получении на любом носителе, при условии что вы соответствующим образом помещаете на видном месте в каждой копии соответствующее уведомление об авторских правах и отказ от предоставления гарантий; оставляете нетронутыми все уведомления, относящиеся к данной Лицензии и к отсутствию каких-либо гарантий; и передаете всем другим получателям Программы копию данной Лицензии вместе с Программой. Вы можете назначить плату за физический акт передачи копии и можете по своему усмотрению предоставлять гарантии за вознаграждение.
- Вы можете изменять свою копию или копии Программы или любой ее части, создавая таким образом произведение, основанное на Программе, и копировать и распространять эти модификации или произведение в соответствии с Разделом 1, приведенным выше, при условии, что вы выполните все нижеследующие условия:
- Вы обязаны снабдить модифицированные файлы заметными уведомлениями, содержащими указания на то, что вы изменили файлы, и дату каждого изменения.
- Вы обязаны предоставить всем третьим лицам лицензию на бесплатное использование каждого произведения, которое вы распространяете или публикуете, целиком, и которое полностью или частично содержит Программу или какую-либо ее часть, на условиях, оговоренных в данной Лицензии.
- Если модифицированная программа обычно читает команды в интерактивном режиме работы, вы должны сделать так, чтобы при запуске для работы в таком интерактивном режиме обычным для нее способом она печатала или выводила на экран объявление, содержащее соответствующее уведомление об авторских правах и уведомление о том, что гарантий нет (или, наоборот, сообщающее о том, что вы обеспечиваете гарантии), и что пользователи могут повторно распространять программу при этих условиях, и указывающее пользователю, как просмотреть копию данной Лицензии. (Исключение: если сама Программа работает в интерактивном режиме, но обычно не выводит подобных сообщений, то ваше произведение, основанное на Программе, не обязано выводить объявление.)
- Вы можете копировать и распространять Программу (или произведение, основанное на ней) согласно Разделу 2) в объектном коде или в выполнимом виде в соответствии с Разделами 1 и 2, приведенными выше, при условии, что вы также выполните одно из следующих требований:
- Сопроводите ее полным соответствующим машиночитаемым исходным кодом, который должен распространяться в соответствии с Разделами 1 и 2, приведенными выше, на носителе, который обычно используется для обмена ПО; или,
- Сопроводите ее письменным предложением, действительным по крайней мере в течение трех лет, предоставить любому третьему лицу за вознаграждение, не превышающее стоимость физического акта изготовления копии, полную машиночитаемую копию соответствующего исходного кода, подлежащую распространению в соответствии с Разделами 1 и 2, приведенными выше; или
- Сопроводите ее информацией, полученной вами в качестве предложения распространить соответствующий исходный код. (Эта возможность допустима только для некоммерческого распространения, и только если вы получили программу в объектном коде или в исполняемом виде с предложением в соответствии с Пунктом b) выше.)
- Вы не можете копировать, изменять, повторно лицензировать, или распространять Программу никаким иным способом, кроме явно предусмотренных данной Лицензией. Любая попытка копировать, изменять или распространять Программу каким-либо другим способом или с измененной лицензией неправомерна и автоматически прекращает ваши права, данные вам этой Лицензией. Однако лицензии лиц, получивших от вас копии или права согласно данной Универсальной Общественной Лицензии, не прекращают своего действия, если эти лица полностью соблюдают условия.
- Вы не обязаны соглашаться с этой Лицензией, так как вы не подписывали ее. Однако, ничто, кроме этой Лицензии, не дает вам право изменять или распространять эту Программу или основанные на ней произведения. Эти действия запрещены законом, если вы не принимаете к соблюдению эту Лицензию. А значит, изменяя или распространяя Программу (или произведение, основанное на Программе), вы изъявляете свое согласие с этой Лицензией и всеми ее условиями о копировании, распространении или модификации Программы или основанных на ней произведений.
- Каждый раз, когда вы повторно распространяете Программу (или любое произведение, основанное на Программе), получатель этого произведения автоматически получает от первоначального выдавшего лицензию лица свою лицензию на копирование, распространение или модификацию Программы, обсуждаемую в этих определениях и условиях. Вы не можете налагать каких-либо дополнительных ограничений на осуществление получателем прав, предоставленных данным документом. Вы не несете ответственности за соблюдение третьими лицами условий этой Лицензии.
- Если в результате судебного разбирательства, или обвинения в нарушении патента или по любой другой причине (не обязательно связанной с патентами), вам навязаны условия, противоречащие данной Лицензии (по постановлению суда, по соглашению или иным способом), это не освобождает вас от соблюдения Лицензии. Если вы не можете заниматься распространением так, чтобы одновременно удовлетворить требованиям и этой Лицензии, и всем другим требованиям, то вы не должны заниматься распространением Программы. Например, если патент не позволяет безвозмездное повторное распространение Программы всем, кто получил копии от вас непосредственно или через посредников, то единственным способом удовлетворить и патенту, и этой Лицензии будет ваш полный отказ от распространения Программы. Если какая-либо часть этого раздела не имеет силы или не может быть исполнена при некоторых конкретных обстоятельствах, то подразумевается, что имеет силу остальная часть раздела, а при других обстоятельствах имеет силу весь Раздел. Цель этого раздела -- не побудить вас делать заявления о нарушениях прав на патент, или заявлять о других претензиях на право собственности или оспаривать правильность подобных претензий; единственная цель этого раздела -- защита целостности системы распространения свободного ПО, которая реализуется использованием общественных лицензий. Многие люди внесли щедрый вклад в широкий спектр ПО, распространяемого по этой системе, полагаясь на ее согласованное применение; только автору принадлежит право решать, хочет ли он или она распространять ПО в этой системе или в какой-то другой, и получатель лицензии не может влиять на принятие этого решения. Этот раздел предназначен для того, чтобы тщательно прояснить, что полагается следствием из остальной части данной Лицензии.
- Если распространение и/или применение Программы ограничено в ряде стран либо патентами, либо авторскими правами на интерфейсы, первоначальный обладатель авторских прав, выпускающий Программу с этой Лицензией, может добавить явное ограничение на географическое распространение, исключив такие страны, так что распространение разрешается только в тех странах, которые не были исключены. В этом случае данная Лицензия включает в себя это ограничение, как если бы оно было написано в тексте данной Лицензии.
- Фонд Свободного ПО может время от времени публиковать пересмотренные и/или новые версии Универсальной Общественной Лицензии. Такие новые версии будут сходны по духу с настоящей версией, но могут отличаться в деталях, направленных на новые проблемы или обстоятельства. Каждой версии придается отличительный номер. Если в Программе указывается, что к ней относится некоторый номер версии данной Лицензии и "любая последующая версия", вы можете по выбору следовать определениям и условиям либо данной версии, либо любой последующей версии, опубликованной Фондом Свободного ПО. Если в Программе не указан номер версии данной Лицензии, вы можете выбрать любую версию, когда-либо опубликованную Фондом Свободного ПО.
- Если вы хотите встроить части Программы в другие свободные программы с иными условиями распространения, напишите автору с просьбой о разрешении. Для ПО, которое охраняется авторскими правами Фонда Свободного ПО, напишите в Фонд Свободного ПО; мы иногда делаем такие исключения. Наше решение будет руководствоваться двумя целями: сохранения свободного статуса всех производных нашего свободного ПО и содействия совместному и повторному использованию ПО вообще.
НИКАКИХ ГАРАНТИЙ
- ПОСКОЛЬКУ ПРОГРАММА ПРЕДОСТАВЛЯЕТСЯ БЕСПЛАТНО, НА ПРОГРАММУ НЕТ ГАРАНТИЙ В ТОЙ МЕРЕ, КАКАЯ ДОПУСТИМА ПРИМЕНИМЫМ ЗАКОНОМ. ЗА ИСКЛЮЧЕНИЕМ ТЕХ СЛУЧАЕВ, КОГДА ОБРАТНОЕ ЗАЯВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ, ДЕРЖАТЕЛИ АВТОРСКИХ ПРАВ И/ИЛИ ДРУГИЕ СТОРОНЫ ПОСТАВЛЯЮТ ПРОГРАММУ "КАК ОНА ЕСТЬ" БЕЗ КАКОГО-ЛИБО ВИДА ГАРАНТИЙ, ВЫРАЖЕННЫХ ЯВНО ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ, ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. ВЕСЬ РИСК В ОТНОШЕНИИ КАЧЕСТВА И ПРОИЗВОДИТЕЛЬНОСТИ ПРОГРАММЫ ОСТАЕТСЯ ПРИ ВАС. ЕСЛИ ПРОГРАММА ОКАЖЕТСЯ ДЕФЕКТНОЙ, ВЫ ПРИНИМАЕТЕ НА СЕБЯ СТОИМОСТЬ ВСЕГО НЕОБХОДИМОГО ОБСЛУЖИВАНИЯ, ВОССТАНОВЛЕНИЯ ИЛИ ИСПРАВЛЕНИЯ.
- НИ В КОЕМ СЛУЧАЕ, ЕСЛИ НЕ ТРЕБУЕТСЯ СООТВЕТСТВУЮЩИМ ЗАКОНОМ, ИЛИ НЕ УСЛОВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ, НИ ОДИН ДЕРЖАТЕЛЬ АВТОРСКИХ ПРАВ И НИ ОДНО ДРУГОЕ ЛИЦО, КОТОРОЕ МОЖЕТ ИЗМЕНЯТЬ И/ИЛИ ПОВТОРНО РАСПРОСТРАНЯТЬ ПРОГРАММУ, КАК БЫЛО РАЗРЕШЕНО ВЫШЕ, НЕ ОТВЕТСТВЕННЫ ПЕРЕД ВАМИ ЗА УБЫТКИ, ВКЛЮЧАЯ ЛЮБЫЕ ОБЩИЕ, СПЕЦИАЛЬНЫЕ, СЛУЧАЙНЫЕ ИЛИ ПОСЛЕДОВАВШИЕ УБЫТКИ, ПРОИСТЕКАЮЩИЕ ИЗ ИСПОЛЬЗОВАНИЯ ИЛИ НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОТЕРЕЙ ДАННЫХ, ИЛИ ДАННЫМИ, СТАВШИМИ НЕПРАВИЛЬНЫМИ, ИЛИ ПОТЕРЯМИ, ПОНЕСЕННЫМИ ИЗ-ЗА ВАС ИЛИ ТРЕТЬИХ ЛИЦ, ИЛИ ОТКАЗОМ ПРОГРАММЫ РАБОТАТЬ СОВМЕСТНО С ЛЮБЫМИ ДРУГИМИ ПРОГРАММАМИ), ДАЖЕ ЕСЛИ ТАКОЙ ДЕРЖАТЕЛЬ ИЛИ ДРУГОЕ ЛИЦО БЫЛИ ИЗВЕЩЕНЫ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ.
КОНЕЦ ОПРЕДЕЛЕНИЙ И УСЛОВИЙ
Как применять эти условия к вашим новым программам
Если вы разрабатываете новую программу и хотите, чтобы она принесла максимально возможную пользу обществу, лучший способ достичь этого --- включить ее в свободное ПО, которое каждый может повторно распространять и изменять согласно данным условиям.
Чтобы сделать это, добавьте в программу следующие уведомления. Надежнее всего будет добавить их в начало каждого исходного файла, чтобы наиболее эффективно передать сообщение об отсутствии гарантий; каждый файл должен содержать по меньшей мере строку, содержащую знак охраны авторского права и указание на то, где находится полное уведомление.
одна строка, содержащая название программы и краткое описание того, что она делает. (C) наименование (имя) автора 19гг Это свободная программа; вы можете повторно распространять ее и/или модифицировать ее в соответствии с Универсальной Общественной Лицензией GNU, опубликованной Фондом Свободного ПО; либо версии 2, либо (по вашему выбору) любой более поздней версии. Эта программа распространяется в надежде, что она будет полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. Для получения подробных сведений смотрите Универсальную Общественную Лицензию GNU. Вы должны были получить копию Универсальной Общественной Лицензии GNU вместе с этой программой; если нет, напишите по адресу: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Добавьте также сведения о том, как связаться с вами по электронной и обычной почте.
Если программа интерактивная, сделайте так, чтобы при запуске в интерактивном режиме она выдавала краткое уведомление вроде следующего:
Гномовизор, версия 69, (C) имя автора 19гг Гномовизор поставляется АБСОЛЮТНО БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; для получения подробностей напечатайте 'show w'. Это свободная программа, и вы приглашаетесь повторно распространять ее при определенных условиях; для получения подробностей введите 'show c'.
Гипотетические команды `show w' и `show c' должны показывать соответствующие части Универсальной Общественной Лицензии. Конечно, используемые вами команды могут называться как-нибудь иначе, нежели `show w' и `show c'; они даже могут выбираться с помощью мыши или быть пунктами меню -- как больше подходит для вашей программы.
Вы также должны добиться того, чтобы ваш работодатель (если вы работаете программистом) или ваше учебное заведение, если таковое имеется, подписали в случае необходимости "отказ от имущественных прав" на эту программу. Вот образец; замените фамилии:
Компания ``Братья Ёёдины'' настоящим отказывается от всех имущественных прав на программу 'Гномовизор' (которая делает пассы в сторону компиляторов), написанную Абстрактным К.И. подпись Мага Ната, 1 апреля 1989 г Маг Нат, Президент фирмы Вице.
Данная Универсальная Общественная Лицензия не позволяет вам включать вашу программу в программы, являющиеся частной собственностью. Если ваша программа -- это библиотека процедур, вам стоит подумать, не будет ли лучше разрешить программам, являющимся частной собственностью, связываться с вашей библиотекой. Если это то, чего вы хотите, используйте вместо этой Лицензии Универсальную Общественную Лицензию GNU для библиотек.
Введение
Вы читаете о GNU Emacs, GNU-инкарнации развитого, самодокументированного, настраиваемого, расширяемого экранного редактора реального времени Emacs. (`G' в `GNU' читается.)
Мы говорим, что Emacs -- это экранный редактор, так как редактируемый текст обычно виден на экране и автоматически обновляется, когда вы вводите команды. Смотрите раздел Организация экрана.
Мы называем его редактором реального времени, так как экран обновляется очень часто, обычно после каждого набранного вами знака или пары знаков. Это уменьшает количество информации, которую вы должны удерживать в памяти, когда редактируете. Смотрите раздел Основные команды редактирования.
Мы называем Emacs развитым, так как он предоставляет средства, которые дают нечто большее, чем простая вставка или удаление: управление подпроцессами, автоматическое создание отступов в программах, просмотр двух или более файлов сразу, редактирование форматированного текста и действия в терминах символов, слов, строк, предложений, абзацев и страниц, а также выражений и комментариев в нескольких разных языках программирования.
Самодокументированность означает, что в любое время вы можете набрать специальный символ, Control-h, чтобы узнать, что вы можете сделать. Вы также можете использовать его, чтобы выяснить, что делает произвольная команда, или найти все команды, имеющие отношение к какой-либо теме. Смотрите раздел Справка.
Настраиваемость означает, что вы можете легко изменить определения команд Emacs. Например, если вы используете язык программирования, в котором комментарии начинаются с `<**' и кончаются на `**>', вы можете велеть командам Emacs для работы с комментариями использовать именно такие строки (смотрите раздел Управление комментариями). Другой вид настройки -- это перерасположение установленных команд. Например, если вы предпочитаете, чтобы четыре основные команды движения курсора (вверх, вниз, вправо, влево) находились на клавишах, расположенных крестообразно на клавиатуре, вы можете перепривязать эти клавиши. Смотрите раздел Настройка.
Расширяемость означает, что вы можете пойти дальше простой настройки и написать совершенно новые команды, программы на языке Лисп, предназначенные для запуска в собственном Лисп-интерпретаторе Emacs. Emacs является "интерактивно расширяемой" системой, что значит, что он делится на много функций, которые вызывают друг друга; каждая из них может быть переопределена во время сеанса редактирования. Почти любая часть Emacs может быть заменена без копирования всего Emacs. Большинство команд редактирования Emacs уже написаны на Лиспе; несколько исключений могли бы быть написаны на Лиспе, но написаны на Си для эффективности. Хотя только программист может написать расширение, любой может использовать его после. Если вы хотите научиться программированию на Emacs Lisp, мы рекомендуем вам книгу Introduction to Emacs Lisp, написанную Робертом Дж. Часселом, также опубликованную Фондом Свободного Программного Обеспечения.
Когда Emacs запущен под системой X Windows, он предоставляет собственные меню и удобные привязки для кнопок мыши. Но Emacs может дать многие преимущества оконной системы и на текстовом терминале. Например, вы можете видеть одновременно несколько файлов, перемещать текст между файлами и редактировать во время работы команд оболочки.
Организация экрана
На текстовом терминале Emacs занимает весь экран. В системе X Windows Emacs создает для себя свои X-окна. Мы используем термин фрейм для обозначения всего текстового экрана или всего X-окна, используемого Emacs. Оба вида фреймов используются в Emacs одинаково для отображения вашего текста. Обычно Emacs запускается только с одним фреймом, но при желании вы можете создать дополнительные. Смотрите раздел Фреймы и X Windows.
Когда вы запускаете Emacs, весь фрейм, за исключением первой и последней строки, отводится для редактируемого текста. Эта область называется окном. Первая строка называется полоской меню, а последняя -- это особая эхо-область или окно минибуфера, где появляются запросы, и куда вы можете ввести ответы. Дальнейшие сведения об этих специальных строках смотрите ниже.
Текстовое окно может быть поделено по горизонтали или вертикали на несколько других окон, каждое из которых может быть использовано для отдельного файла (смотрите раздел Множество окон). В данном руководстве слово "окно" всегда обозначает часть фрейма внутри Emacs.
То окно, в котором находится курсор, называется выбранным окном; в нем идет редактирование. Большинство команд Emacs неявно относятся в тексту в выбранном окне (хотя команды мыши как правило действуют в том окне, в котором вы щелкнули, вне зависимости от того, выбрано оно или нет). Остальные окна существуют просто для справки, пока вы не выберете одно из них. Если вы используете несколько фреймов в системе X Windows, то передача фокуса ввода некоторому фрейму выбирает окно в этом фрейме.
Последняя строка каждого текстового окна называется строкой режима, которая описывает происходящее в этом окне. Она выводится в инверсном виде, если терминал поддерживает это, и содержит текст, который начинается при старте Emacs со строки `--:-- *scratch*'. Строка режима показывает сведения о текущем состоянии, например, какой буфер показан в окне над ней, какие основные и второстепенные режимы в нем используются, и содержит ли этот буфер несохраненные изменения.
Точка
Курсор терминала внутри Emacs показывает позицию, в которой будет выполняться команда редактирования. Это позиция именуется точкой. Многие команды Emacs перемещают точку по тексту, так что вы имеете возможность редактировать в любом месте. Вы также можете установить точку, щелкнув первой кнопкой мыши.
Когда курсор указывает на знак, то следует думать, что точка находится между двумя знаками; она расположена перед знаком, над которым появляется курсор. Например, если ваш текст выглядит как `frob', а курсор находится над `b', то точка расположена между `o' и `b'. Если вы вставите в этой позиции знак `!', то получите `fro!b', с точкой между `!' и `b'. Таким образом, курсор останется над `b', как и раньше.
Иногда говорят "курсор", имея в виду точку, или говорят о командах движения точки как о командах "движения курсора".
Терминалы имеют только один курсор, и когда происходит процесс вывода, курсор должен находиться там, где идет набор. Это не означает, что точка перемещается. Это значит лишь то, что Emacs может показать вам позицию точки, только когда терминал не работает.
Если вы редактируете в Emacs несколько файлов, каждый в своем буфере, то всякий буфер имеет свою собственную позицию точки. Буфер, который не показывается в данное время, запоминает, где находится точка, на случай, если вы снова выведете его на экран.
Когда фрейм разбит на несколько окон, каждое из них имеет свою собственную позицию точки. Курсор же показывает позицию точки в выбранном окне. Этим способом вы также можете узнать, которое из окон выбрано. Если один и тот же буфер появляется более чем в одном окне, то каждое из них имеет свою позицию точки.
Если есть несколько фреймов, каждый из них может отобразить один курсор. Курсор в выбранном фрейме заполнен цветом; курсор в других фреймах -- это пустая клетка, которая появляется в том окне, которое было бы выбранным, если бы вы передали фокус ввода этому фрейму.
Термин `точка' происходит от названия знака `.', который был командой TECO (язык, на котором был написан первоначальный Emacs) для получения значения величины, называемой теперь `точкой'.
Эхо-область
Строка внизу фрейма (под строкой режима) называется эхо-областью. Она используется для показа небольших фрагментов текста в нескольких целях.
Эхо обозначает отображение набираемых вами знаков. Вне Emacs, операционная система обычно отображает весь ваш ввод. Emacs управляет эхо иначе.
Emacs никогда не повторяет команды, состоящие из одиночного знака, а команды, состоящие из нескольких, повторяются, только если вы останавливаетесь в процессе их набора. Как только вы останавливаетесь более чем на секунду в середине команды, все знаки этой команды сразу же отображаются. Это служит подсказкой для окончания команды. Как только включается эхо, окончание команды отображается немедленно в процессе набора. Такое поведение предназначено для того, чтобы уверенный пользователь получал быстрый результат, в то же время это позволяет неуверенным пользователям получить максимум обратной связи. Вы можете изменить это поведение, установив особую переменную (смотрите раздел Переменные управления изображением).
Если команда не может быть выполнена, она в печатает эхо-области сообщение об ошибке. Сообщение об ошибке сопровождается звуковым сигналом или миганием экрана. Кроме того, когда произошла ошибка, любой набранный перед этим ввод сбрасывается.
Некоторые команды печатают в эхо-области информационные сообщения. Они похожи на сообщения об ошибках, но без звукового сигнала, и набранная ранее информация не сбрасывается. Иногда эти сообщения говорят вам, что команда выполнена, в случае, если это явно не наблюдается при просмотре редактируемого текста. Иногда единственной целью команды является печать сообщения, дающего вам специфическую информацию. Например, команда С-х = используется, чтобы напечатать сообщение, описывающее позицию точки в тексте и ее текущий столбец в окне. Команды, требующие для своего выполнения длительное время, часто выводят во время работы сообщения, заканчивающиеся на `...', а в конце, когда они закончились, слово `done'.
Информативные сообщения из эхо-области сохраняются в буфере, называемом `*Messages*'. (Мы еще не объяснили, что такое буфер; для получения большей информации о них смотрите раздел Использование множества буферов.) Если вы пропустили сообщение, которое недолго отображалось на экране, вы можете переключиться в буфер `*Messages*' и снова посмотреть его. (Последовательные сообщения о промежуточных результатах часто сворачиваются в этом буфере в одно.)
Размер буфера `*Messages*' ограничен определенным числом строк, это число задает переменная message-log-max
. Как только буфер дорастает до этого размера, каждая новая строка удаляет одну строку из начала. Смотрите раздел Переменные, чтобы узнать, как установить переменные, такие как message-log-max
.
Эхо-область используется также для отображения минибуфера: окна, которое используется для считывания аргументов для команд, например, имени файла для редактирования. Когда используется минибуфер, эхо-область начинается со строки подсказки, которая обычно кончается двоеточием; кроме того, в этой строке появляется курсор, так как она становится выбранным окном. Вы всегда можете выйти из минибуфера, набрав C-g. Смотрите раздел Минибуфер.
Строка режима
Последняя строка в каждом окне называется строкой режима, она описывает происходящее в этом окне. Когда имеется только одно текстовое окно, строка режима находится непосредственно над эхо-областью; это предпоследняя строка фрейма. Строка режима показывается в инверсном изображении, если терминал поддерживает это, и начинается и кончается дефисами.
Обычно строка режима выглядит так:
-ск:из буф (основной второстепенные)--стр--поз------
Это дает информацию о буфере, отображенном в окне: его имя, используемые основной и второстепенный режимы, изменялся ли текст буфера, и как далеко вниз по буферу вы сейчас находитесь.
из содержит две звездочки `**', если текст в буфере редактировался (буфер "изменен"), или `--', если буфер не редактировался. Для буферов, доступных только для чтения, это `%*', если буфер изменен, и `%%' в противном случае.
буф -- это имя буфера данного окна. Чаще всего оно совпадает с именем файла, который вы редактируете. Смотрите раздел Использование множества буферов.
Буфер, находящийся в выбранном окне (в том окне, в котором находится курсор), является также выбранным буфером Emacs -- тем буфером, где происходит редактирование. Когда мы говорим, что некоторые команды выполняются "для буфера", мы говорим о текущем выбранном буфере.
стр -- это `L', за которой следует текущей номер строки, где находится точка. Этот номер выводится, когда включен режим Line Number (обычно это так). Вы можете по желанию показать также и номер текущего столбца, включив режим Column Number (он не включается по умолчанию, потому что работает несколько медленнее). Смотрите раздел Дополнительные возможности строки режима.
поз говорит вам, есть ли еще текст сверху от начала либо ниже конца окна. Если буфер небольшой и умещается в окне целиком, то поз имеет значение `All'. Иначе он имеет значение `Top', если вы смотрите начало файла, `Bot', если конец, либо `nn%', где nn означает количество процентов файла, находящееся над верхом окна.
основной -- имя основного режима, действующего в этом буфере. В любой момент каждый буфер находится в одном и только одном из возможных основных режимов. Существующие основные режимы включают режим Fundamental (наименее специализированный), режим Text, режим Lisp, режим С, режим Texinfo и многие другие. Смотрите раздел Основные режимы, чтобы подробнее узнать о том, чем режимы отличаются, и как выбрать один из них.
Некоторые основные режимы показывают после имени дополнительные сведения. Например, буферы Rmail показывают номер текущего сообщения и общее число сообщений. Буферы Compilation и Shell отображают состояние подпроцесса.
второстепенные -- это список некоторых второстепенных режимов, которые включены в данный момент в буфере выбранного окна. Например, `Fill' значит, что включен режим Auto fill. `Abbrev' означает, что включен режим Word Abbrev. `Ovwrt' означает, что включен режим Overwrite. Смотрите раздел Второстепенные режимы, для более подробной информации. `Narrow' означает, что область редактирования отображаемого буфера ограничена только частью его текста. На самом деле это не второстепенный режим, но действует похоже. Смотрите раздел Сужение. `Def' означает, что сейчас определяется макрос клавиатуры. Смотрите раздел Клавиатурные макросы.
Кроме того, если в данный момент Emacs находится внутри уровня рекурсивного редактирования, то внутри круглых скобок, которые окружают имена режимов, появляются квадратные скобки (`[...]'). Если Emacs находится на некотором уровне рекурсивного редактирования внутри другого, то появляются двойные квадратные скобки, и так далее. Так как уровень рекурсивного редактирования относится ко всему Emacs, а не к каждому буферу в отдельности, то квадратные скобки появляются или в строках режима всех окон или ни в одной из них. Смотрите раздел Уровни рекурсивного редактирования.
Неоконные терминалы могут показать только один фрейм Emacs в одно время (смотрите раздел Фреймы и X Windows). На таких терминалах строка режима отображает имя выбранного фрейма, после из. Начальный фрейм называется `F1'.
ск обозначает систему кодирования, которая используется в редактируемом файле. Дефис указывает на состояние, устанавливаемое по умолчанию: отсутствие преобразования, за исключением преобразования конца строки, если содержимое файла требует этого. `=' обозначает полное отсутствие преобразований. Не столь простые преобразования представляются различными буквами -- например, `1' относится к ISO Latin-1. Смотрите раздел Системы кодирования, для подробной информации. Если вы используете метод ввода, к началу ск добавляется строка в форме `в>'; в идентифицирует метод ввода. (Некоторые методы ввода показывают вместо `>' знак `+' или `@'.) Смотрите раздел Методы ввода.
Когда вы пользуетесь текстовым терминалом (не оконной системой), ск использует три знака для описания, соответственно, системы кодирования для ввода с клавиатуры, системы кодирования для терминального вывода и системы кодирования, применяемой в редактируемом файле.
Когда выключена поддержка многобайтных знаков, ск не появляется совсем. Смотрите раздел Включение поддержки многобайтных знаков.
Двоеточие после ск может меняться в некоторых обстоятельствах на другой знак. Emacs использует для разделения строк в буфере перевод строки. Некоторые файлы используют другое соглашение о разделении строк: возврат каретки и перевод строки (соглашение MS-DOS) или просто возврат каретки (соглашение Macintosh). Если файл в буфере использует возврат каретки и перевод строки, двоеточие заменяется на обратную косую черту (`\') или `(DOS)', в зависимости от вашей операционной системы. Если в этом файле применяется просто возврат каретки, то двоеточие заменяется на косую черту (`/') или `(Mac)'. На некоторых системах Emacs позывает вместо двоеточия строку `(Unix)', даже для файлов, использующих для разделения строк перевод строки.
Вы можете настроить способ отображения в строке режима каждого из форматов разделения строк, устанавливая переменные eol-mnemonic-unix
, eol-mnemonic-dos
, eol-mnemonic-mac
и eol-mnemonic-undecided
равными строкам, которые вы находите подходящими. Смотрите раздел Переменные, где объясняется, как устанавливать переменные.
Смотрите раздел Дополнительные возможности строки режима, подробности о возможностях добавления в строку режима другой полезной информации, например номера текущего столбца в точке, текущего времени и сообщения о приходе почты.
Полоска меню
Каждый фрейм Emacs обычно имеет сверху полоску меню, которую вы можете использовать для произведения определенных действий. Нет необходимости перечислять их здесь, потому что вам проще посмотреть самим.
Когда вы используете оконную систему, вы можете выбирать команды из полоски меню при помощи мыши. Направленная вправо стрелка после пункта меню указывает, что этот пункт ведет ко вторичному меню; `...' в конце означает, что до начала работы эта команда считает аргументы с клавиатуры.
Чтобы просмотреть полное имя команды и документацию к пункту меню, напечатайте C-h k и затем выберите нужный пункт с помощью мыши обычным способом. (смотрите раздел Описания для ключей).
На текстовых терминалах, где нет мыши, вы можете использовать меню, напечатав M-` или F10 (они запускают команду tmm-menubar
). Эта команда входит в режим, где вы можете выбрать пункт меню с помощью клавиатуры. Предварительный выбор показывается в эхо-области. Вы можете использовать правую и левую курсорные стрелки для движения по меню к разным пунктам. Когда вы нашли нужный вам пункт, напечатайте RET, чтобы выбрать его.
К каждому пункту меню также приписывается буква или цифра; обычно это первая первая буква какого-то слова из имени пункта. Эта буква или цифра отделяется от имени значком `=>'. Для выбора пункта вы можете напечатать его букву или цифру.
Некоторые команды в меню имеют также обычные привязки к ключу; в таком случае после самого пункта перечисляется один эквивалентный ключ в круглых скобках.
Знаки, ключи и команды
Эта глава рассказывает о наборах знаков, используемых в Emacs для ввода команд и внутри файлов, а также объясняет концепции ключей и команд, которые необходимы для понимания того, как Emacs воспринимает ввод с клавиатуры и мыши.
Виды пользовательского ввода
GNU Emacs использует для ввода с клавиатуры расширение набора знаков ASCII; он также воспринимает незнаковые события, включая функциональные клавиши и действия с клавишами мыши.
ASCII состоит из 128 знаковых кодов. Некоторым из этих кодов приписаны графические обозначения, такие как `а' и `='; остальные являются управляющими знаками, например Cоntrol-a (также именуется С-а для краткости). C-a получил свое имя из-за того, что вы набираете его, зажав клавишу CTRL и затем нажав а.
У некоторых управляющих знаков ASCII есть специальные названия, и большинство терминалов имеют специальные клавиши, с помощью которых их можно набрать, например: RET, TAB, DEL и ESC. Знак пробела обычно обозначается ниже как SPC, хотя строго говоря, он является графическим знаком, чье изображение должно быть пустым. На некоторых клавиатурах есть клавиша "linefeed"; это другое название для C-j.
Emacs расширяет множество знаков ASCII тысячами других печатных знаков (смотрите раздел Поддержка разных языков), дополнительными управляющими знаками и несколькими модификаторами, которые можно комбинировать с любым другим знаком.
На ASCII-терминалах существует только 32 управляющих знака. Это варианты с модификатором control для букв и знаков `@[]\^_'. Кроме того, клавиша shift не имеет смысла с управляющими знаками: C-a и C-A -- это одно и то же, и Emacs не может их различить.
Но во множестве знаков Emacs есть место для вариантов с control для всех печатных знаков и для различения между C-a и C-A. X Windows позволяет ввести все эти знаки. Например, C-- (то есть Control-минус) и C-5 -- допустимые команды Emacs в системе X.
Еще одно расширение множества знаков Emacs -- это дополнительные биты модификаторов. Чаще всего используется только один бит-модификатор, он называется Meta. Для любого знака есть его Meta-вариант; примеры включают Meta-а (для краткости М-а), М-А (это не то же самое, что М-а, но эти два знака имеют обычно одно и то же значение в Emacs), M-RET и M-C-a. По традиции мы обычно пишем С-М-а, а не М-С-а; но логично говоря, порядок набора клавиш CTRL и META не имеет значения.
Некоторые терминалы имеют клавишу META и позволяют набирать Meta-знаки, нажав эту клавишу. Таким образом, Meta-а набирается путем одновременного нажатия клавиш META и а. Клавиша META работает очень похоже на SHIFT. Подобные клавиши не всегда метятся META, так как эти функции часто присваиваются специальными клавишам с каким-то другим первоначальным значением.
Если у вас нет клавиши META, вы все же можете набрать Meta-знаки, используя последовательность двух знаков, начинающуюся с ESC. Таким образом, чтобы ввести M-а, вы можете набрать ESC a. Чтобы ввести С-М-а, вы должны набрать ESC C-a. ESC разрешена также и на терминалах с клавишами META, на случай, если вы привыкли использовать ее.
X Windows предоставляет несколько других клавиш-модификаторов, которые могут быть применены к любому вводимому знаку. Эти клавиши называются SUPER, HYPER и ALT. Мы пишем `s-', `H-' и `A-', чтобы сказать, что знак использует эти модификаторы. Таким образом, s-H-C-x -- это сокращение для Super-Hyper-Control-x. Не все X-терминалы в действительности предоставляют клавиши для этих модификаторов -- фактически многие терминалы имеют клавишу, помеченную ALT, которая на самом деле является клавишей META. Стандартные привязки ключей Emacs не содержат каких-либо знаков с этими модификаторами. Но вы можете придать им свои значения, настраивая Emacs.
Ввод с клавиатуры включает клавиши, не являющие знаками: например функциональные клавиши и курсорные стрелки. Кнопки мыши также выпадают из гаммы знаков. Вы можете модифицировать эти события с помощью клавиш-модификаторов CTRL, META, SUPER, HYPER и ALT точно так же, как и знаки клавиатуры.
Вводимые знаки и незнаковый ввод вместе называются событиями. Смотрите раздел `Input Events' в The Emacs Lisp Reference Manual, для дальнейшей информации. Если вы не программируете на Лиспе, а просто хотите переопределить значения некоторых знаков и незнаковых событий, смотрите раздел Настройка.
ASCII-терминалы в действительности не могут посылать ничего, кроме знаков ASCII. Такие терминалы используют для представления каждой функциональной клавиши последовательность знаков. Но это невидимо для пользователя Emacs, потому что процедуры обработки ввода с клавиатуры распознают эти особые последовательности и преобразуют их в события функциональных клавиш до того, как любые другие части Emacs могут их увидеть.
Ключи
Последовательность ключей, (или коротко, ключ) есть последовательность вводимых событий, которая воспринимается как целое, как "единая команда". Некоторые командные последовательности Emacs --- это просто одиночный знак или одно событие; например, просто C-f достаточно для перемещения вперед на один знак. Но в Emacs также есть команды, которые вызываются двумя или более событиями.
Если последовательность событий достаточна для вызова команды, она является законченным ключом. Примером законченных ключей могут быть C-a, X, RET, NEXT (функциональная клавиша), DOWN (стрелка), C-x C-f и C-x 4 C-f. Если последовательность недостаточна, чтобы составить законченный ключ, она называется префиксным ключом. В примерах выше C-x и C-x 4 являются префиксными ключами. Любая последовательность ключей -- это либо законченный, либо префиксный ключ.
Большинство одиночных знаков являются законченными ключами в стандартных привязках команд Emacs. Немногие из них являются префиксными ключами. Префиксный ключ объединяется со следующим событием в более длинную последовательность ключей, которая сама может быть законченной или префиксной. Например, C-x -- это префиксный ключ, поэтому C-x и следующее событие объединяются в двухзнаковую последовательность ключей. Большинство этих последовательностей являются законченными ключами, в том числе C-x C-f и C-x b. Некоторые, например C-x 4 и C-x r, сами являются префиксными ключами, приводящими к трехзнаковым последовательностям ключей. Нет ограничения на длину последовательности ключей, но на практике люди редко используют последовательности длиннее четырех событий.
Напротив, добавить события к законченному ключу вы не можете. Например, двухзнаковая последовательность C-f C-k не является ключом, так как C-f является законченным ключом сама по себе. Невозможно дать C-f C-k независимое значение как команде. C-f C-k -- это две команды, а не одна.
Из всего сказанного следует, что префиксными ключами в Emacs являются C-c, C-h, C-x, C-x RET, C-x @, C-x a, C-x n, C-x r, C-x v, C-x 4, C-x 5, C-x 6, ESC, M-g и M-j. Но этот список не встроен; это просто стандартная привязка ключей в Emacs. В процессе настройки Emacs вы можете сделать новые префиксные ключи или уничтожить эти. Смотрите раздел Настройка привязок ключей.
Если вы в самом деле создаете или удаляете префиксные ключи, это изменяет набор возможных последовательностей ключей. Например, если вы переопределяете C-f как префикс, C-f C-k автоматически становятся ключом (законченным, если вы не определите его тоже как префикс). Наоборот, если вы уничтожите определение префикса C-x 4, то С-х 4 f (или С-х 4 что-нибудь) не будет в дальнейшем ключом.
Напечатав знак вызова справки (C-h или F1) после префиксного знака, вы получите список команд, начинающихся с этого префикса. Есть несколько префиксных знаков, для которых C-h не работает -- по историческим причинам у них есть другое значение для C-h, которое непросто изменить. Но F1 должна работать для всех префиксных знаков.
Ключи и команды
В этом руководстве много отрывков, которые говорят вам, что делают отдельные ключи. Но Emacs не определяет значение ключей непосредственно. Вместо этого Emacs присваивает значение именованным командам и затем придает ключам значения путем привязки их к командам.
Каждая команда имеет имя, выбранное для нее программистом. Обычно это имя составляется из нескольких английских слов, разделенных дефисами; например, next-line
или forward-word
. У команды также есть определение, являющееся программой на Лиспе; она заставляет функцию делать то, что она делает. На самом деле, команда в языке Emacs Lisp -- это особая разновидность лисповской функции; это такая функция, которая указывает, как читать аргументы при интерактивном вызове. Для получения большей информации о командах и функциях смотрите раздел `What Is a Function' в The Emacs Lisp Reference Manual. (Определение, которое мы использовали в данном руководстве, слегка упрощено.)
Связь между ключами и функциями записывается в различных таблицах, называемых таблицами ключей. Смотрите раздел Таблицы ключей.
Когда мы говорим, что "C-n сдвигает вертикально вниз на одну строку", мы замалчиваем отличие, которое не относится к делу при обычном использовании, но существенно для понимания того, как настраивается Emacs. Это команда next-line
, которая запрограммирована на сдвиг вниз. Ключ C-n имеет такое действие, так как он привязан к этой команде. Если вы перепривяжете С-n к команде forward-word
, то он будет перемещать на одно слово вперед. Перепривязка клавиш -- обычный метод настройки.
В остальной части этого руководства мы обычно будем игнорировать эту тонкость, чтобы сохранить простоту. Чтобы дать необходимую для настройки информацию, мы ставим имя команды, которая в действительности выполняет работу, в круглых скобках после ссылки на ключ, который ее запускает. Например, мы будем говорить: "Команда С-n (next-line
) передвигает точку вниз", имея в виду, что next-line
-- это команда, которая двигает вниз, а С-n --- это ключ, который стандартно привязан к ней.
Раз уж мы говорим сейчас только об информации для настройки, то это подходящий момент, чтобы рассказать вам о переменных. Часто описание команд будет говорить: "Чтобы изменить это, установите переменную mumble-foo
". Переменная -- это имя, используемое для запоминания значения. Многие описанные в этом руководстве переменные существуют просто для облегчения настройки: некоторая команда или другая часть Emacs проверяет переменную и ведет себя по-разному в зависимости от ее значения. Пока вы не интересуетесь настройкой, вы можете пропустить информацию о переменных. Когда вы будете готовы, чтобы заинтересоваться, прочитайте базовые сведения о переменных, и тогда информация об отдельных переменных будет иметь смысл. Смотрите раздел Переменные.
Наборы знаков для текста
Текст в буферах Emacs -- это последовательность восьмибитных байт. Каждый байт может содержать один знак ASCII. Допустимы как управляющие знаки ASCII (с восьмеричными кодами от 000 до 037, и 0177), так и печатные ASCII-знаки (с кодами от 040 до 0176); однако, управляющие знаки не из ASCII не могут появиться в буфере. Другие флаги-модификаторы, используемые при вводе с клавиатуры, такие как Meta, также недопустимы в буферах.
Некоторые управляющие знаки ASCII служат в тексте для особых целей и имеют особые названия. Например, знак новой строки (восьмеричный код 012) используется в буфере для завершения строки, а символ табуляции (восьмеричный код 011) используется для создания отступа до следующей позиции табуляции (обычно через каждые 8 столбцов). Смотрите раздел Как отображается текст.
Печатные знаки, не входящие в ASCII, также могут появляться в буферах. Когда включены многобайтные знаки, вы можете использовать любые печатные не-ASCII-знаки, которые Emacs поддерживает. Они имеют коды, начинающиеся от 256, или восьмеричного 0400, и каждый из них представляется как последовательность двух или более байт. Смотрите раздел Поддержка разных языков.
Если вы выключите поддержку многобайтных знаков, то сможете использовать только один алфавит не-ASCII-знаков, каждый из которых вмещается в один байт. Для них используются коды от 0200 до 0377. Смотрите раздел Поддержка однобайтных европейских знаков.
Вход и выход из Emacs
Обычно для вызова Emacs достаточно просто набрать `emacs' в оболочке. Emacs очищает экран и отображает начальные справочные сведения и уведомление об авторских правах. Некоторые операционные системы сбрасывают все набранное перед тем, как Emacs стартует; они не дают Emacs возможности предотвратить это. Поэтому рекомендуется подождать, пока Emacs очистит экран, и только потом набрать вашу первую команду редактирования.
Если вы запускаете Emacs из окна с оболочкой в системе X Windows, запускайте его в фоновом режиме с помощью `emacs&'. Тогда Emacs не свяжет окно оболочки, и вы сможете выполнять другие команды, пока Emacs работает в своих X-окнах. Вы можете начинать печатать команды, как только направите ввод с клавиатуры во фрейм Emacs.
Когда Emacs начинает работу, он создает буфер, называемый `*scratch*'. Это буфер, который предоставляется вам первоначально. Буфер `*scratch*' использует режим Lisp Interaction; вы можете набирать в нем Лисп-выражения и вычислять их, либо вы можете проигнорировать такую возможность и просто писать в нем заметки. (Вы можете задать для этого буфера другой основной режим, установив в вашем файле инициализации переменную initial-major-mode
. Смотрите раздел Файл инициализации, `~/.emacs'.)
Из аргументов в командной строке оболочки можно указать файлы, к которым вы хотите обратиться, Лисп-файлы для загрузки и функции, которые будут вызваны. Смотрите раздел Аргументы командной строки. Но мы не рекомендуем так делать. Эта возможность существует преимущественно для совместимости с другими редакторами.
Многие редакторы спроектированы так, что запускаются снова каждый раз, когда вы хотите редактировать. Вы редактируете один файл и затем выходите из редактора. В следующий раз, когда вы хотите редактировать другой файл или тот же самый, вы должны запустить редактор снова. С такими редакторами имеет смысл использовать аргумент командной строки, чтобы сообщить, какой файл будет редактироваться.
Но не имеет смысла запускать новый Emacs каждый раз, когда вы хотите редактировать другой файл. С одной стороны, это было бы раздражающе медленно. С другой стороны, при этом не использовалась бы способность Emacs обращаться к нескольким файлам за один сеанс редактирования. И при этом терялись бы накопленные сведения о контексте: регистры, история отмены изменений, список пометок и другие.
Рекомендуемый способ использования GNU Emacs -- запускать его только один раз сразу после входа в систему и делать все ваши редакции в одном и том же процессе Emacs. Каждый раз, когда вы хотите редактировать другой файл, вы вызываете его в уже существующий Emacs, который в конце концов предназначен, чтобы хранить много файлов, готовых для редактирования. Обычно вы не уничтожаете Emacs до тех пор, пока не решите выйти из системы. Смотрите раздел Работа с файлами, для получения информации о редактировании нескольких файлов одновременно.
Выход из Emacs
Существует две команды выхода из Emacs, так как существует два вида выхода: приостановка Emacs и уничтожение Emacs.
Приостановка означает временную остановку Emacs и возврат управления его родительскому процессу (обычно это оболочка), она позволяет вам позднее возобновить редактирование в том же задании Emacs, с теми же буферами, с тем же списком уничтожений, с той же историей отмены и так далее. Это обычный способ выхода.
Уничтожение Emacs подразумевает уничтожение задания Emacs. Вы снова можете запустить Emacs позднее, но вы получите новый Emacs. Нет способа возобновить тот же сеанс редактирования после его уничтожения.
- C-z
- Приостановить Emacs (
suspend-emacs
) или минимизировать текущий фрейм (iconify-or-deiconify-frame
). - C-x C-c
- Уничтожить Emacs (
save-buffers-kill-emacs
).
Чтобы приостановить Emacs, наберите C-z (suspend-emacs
). Это вернет вас обратно в оболочку, из которой вы вызывали Emacs. Вы можете возобновить Emacs с помощью команды `%еmacs' в большинстве обычных оболочек.
В системах, которые не позволяют программам приостанавливаться, C-z запускает подчиненную оболочку, которая связана прямо с терминалом, и Emacs ждет, пока вы не покинете подоболочку. (Скорее всего, вы можете сделать это с помощью C-d или `exit', но это зависит от используемой оболочки.) В этих системах единственный способ вернуться в оболочку, из которой Emacs был запущен (чтобы выйти из системы, например), -- это уничтожить Emacs.
Приостановка также невозможна, если вы запустили Emacs из оболочки, не поддерживающей приостановку программ, даже если система ее поддеривает. В таком случае вы можете установить переменную cannot-suspend
в отличное от nil
значение, чтобы принудить C-z запускать подчиненную оболочку. (Можно было бы назвать родительскую оболочку Emacs тоже "подчиненной" за неумение правильно управлять заданиями, но это вопрос вкуса.)
Когда Emacs напрямую общается с X-сервером и создает собственные выделенные X-окна, C-z имеет другой смысл. Приостановка приложения, используещего собственные X-окна, бессмысленна и бесполезна. Вместо этого, C-z запускает команду iconify-or-deiconify-frame
, которая временно закрывает выбранный фрейм Emacs (смотрите раздел Фреймы и X Windows). Снова получить доступ к этому фрейму можно с помощью программы управления окнами.
Чтобы уничтожить Emacs, наберите C-x C-c (save-buffer-kill-emacs
). Двухзнаковый ключ используется для того, чтобы его было труднее набрать. Эта команда сначала предлагает сохранить все модифицированные обращающиеся к файлам буферы. Если вы не сохраняете их все, она запрашивает новое подтверждение с помощью yes перед уничтожением Emacs, так как любые незаписанные изменения будут потеряны навсегда. Также, если остаются запущенными какие-либо подпроцессы, то С-х С-с запрашивает подтверждение и для них, так как уничтожение Emacs немедленно уничтожит подпроцессы.
Невозможно перезапустить сеанс Emacs, когда вы его уже уничтожили. Однако, вы можете указать Emacs записывать определенные сведения о сеансе, например, к каким файлам обращались, когда Emacs был уничтожен; тогда в следующий раз, когда вы перезапустите Emacs, он попытается обратиться к тем же файлам. Смотрите раздел Сохранение сеансов Emacs.
Операционная система обычно улавливает определенные специальные символы, которые могут мгновенно приостанавливать или уничтожать программу. Это свойство операционной системы отключается в то время, когда вы находитесь в Emacs. Значения C-z и С-с как ключей в Emacs были вдохновлены стандартными значениями C-z и С-с в некоторых операционных системах как символов останова и уничтожения программы, но это единственная их связь с этими операционными системами. Вы можете настроить эти ключи для запуска любых команд по вашему выбору (смотрите раздел Таблицы ключей).
Основные команды редактирования
Здесь мы рассказываем основы о том, как ввести текст, сделать изменения и записать текст в файл. Если эти сведения новы для вас, вы можете изучить это более легким способом, запустив самоучитель по Emacs. Чтобы сделать так, запустите Emacs и наберите Control-h t (help-with-tutorial
).
Чтобы очистить экран и перерисовать изображение, напечатайте C-l (recenter
).
Вставка текста
Чтобы вставить печатные знаки в редактируемый вами текст, достаточно просто набрать их. Таким образом, вводимые вами знаки вставляются в буфер в позиции курсора (то есть в точке; смотрите раздел Точка). Курсор двигается вперед, и весь текст после курсора тоже сдвигается вперед. Если в буфере был текст `FOOBAR', и курсор стоял перед `B', то если вы наберете XX, вы получите `FOOXXBAR' c курсором, оставшимся перед `B'.
Чтобы удалить текст, который вы только что вставили, используйте DEL. DEL удаляет знак перед курсором (а не знак под курсором; этот знак стоит после курсора). Курсор и все знаки, стоящие после него, сдвигаются назад. Поэтому, если вы набрали печатные знаки и затем набираете DEL, набранное отменяется.
Чтобы закончить строку и начать набирать новую, нажмите RET. Это вставит в буфер знак перехода на новую строку. Если точка находится в середине строки, RET разбивает эту строку. Набор DEL, когда курсор находится в начале строки, удаляет предшествующий символ новой строки, соединяя таким образом эту и предшествующую строки.
Emacs может разбивать строки автоматически, когда они становятся слишком длинными, если вы включите специальный второстепенный режим, называемый режимом Auto Fill. Смотрите раздел Заполнение текста, для информации об использовании режима Auto Fill.
Если вы предпочитаете, чтобы знаки текста замещали (перезаписывали) существующий текст, а не сдвигали его вправо, вы можете включить второстепенный режим Overwrite. Смотрите раздел Второстепенные режимы.
Непосредственная вставка работает для печатных знаков и SPC, но другие знаки действуют как команды редактирования и не вставляют сами себя. Если вам требуется вставить управляющий знак или знак, код которого превышает восьмиричное 200, вы должны отменить их особый смысл, набрав перед ними Control-q (quoted-insert
). (Название этого знака обычно записывается как C-q для краткости.) Существует два способа использования C-q:
- C-q, за которым следует любой неграфический знак (даже C-g), вставляет этот знак.
- C-q, за которым идет последовательность восьмиричных цифр, вставляет знак с заданным знаковым кодом. Вы можете использовать любое число восьмиричных цифр; любой знак, не являющийся цифрой, обрывает последовательность. Если завершающий знак -- это RET, он служит только для завершения последовательности; любой другой нецифровой знак сам используется в качестве ввода после завершения последовательности. (Использование восьмиричных последовательностей запрещено в обычном недвоичном режиме Overwrite, чтобы дать вам удобный способ вставить цифру вместо замещения ей.)
Когда включена поддержка многобайтных знаков, восьмиричные коды от 0200 до 0377 не являются верными знаками; если вы задаете код из этого промежутка, C-q считает, что вы собираетесь использовать какой-то из наборов знаков ISO Latin-n, и преобразует заданный код к соответствующему коду знаков Emacs. Смотрите раздел Включение поддержки многобайтных знаков. Какой именно набор знаков ISO Latin следует использовать, определяется выбранной вами языковой средой (смотрите раздел Языковые среды).
Чтобы использовать вместо восьмиричных цифр десятичные или шестнадцатиричные, установите переменную read-quoted-char-radix
равной 10 или 16. Если основание больше десяти, некоторые буквы, начиная с a, служат частью знакового кода, так же, как и цифры.
Числовой аргумент для C-q указывает, сколько копий знаков с отмененным особым смыслом необходимо вставить (смотрите раздел Числовые аргументы).
Информация для настройки: DEL в большинстве режимов запускает команду delete-backward-char
; RET запускает команду newline
, а самовставляющиеся печатные знаки запускают команду self-insert
, которая вставляет тот знак, который был набран при ее вызове. Некоторые основные режимы перепривязывают DEL к другим командам.
Изменение положения точки
Чтобы сделать что-то большее, чем просто вставка знаков, вы должны знать, как двигается точка (смотрите раздел Точка). Простейший способ переместить точку -- воспользоваться курсорными стрелками или щелкнуть левой кнопкой мыши в том месте, куда вы хотите передвинуть точку.
Есть также Control- и Meta-знаки для перемещения курсора. Некоторые из них эквивалентны курсорным стрелкам (они были придуманы в те дни, когда у терминалов еще не было курсорных стрелок, их можно использовать на таких терминалах). Другие делают более сложные вещи.
- C-a
- Передвинуться в начало строки (
beginning-of-line
). - C-e
- Передвинуться в конец строки (
end-of-line
). - C-f
- Сдвинуться на один знак вперед (
forward-char
). - C-b
- Сдвинуться на один знак назад (
backward-char
). - M-f
- Сдвинуться на одно слово вперед (
forward-word
). - M-b
- Сдвинуться на одно слово назад (
backward-word
). - C-n
- Сдвинуться вертикально вниз на одну строку (
next-line
). Эта команда старается оставить горизонтальную позицию неизменной, чтобы если вначале вы находились в середине одной строки, то в конце оказались бы в середине следующей. В случае, если вы находитесь на последней строке текста, C-n создает новую строку и передвигается на нее. - C-p
- Сдвинуться вертикально вверх на одну строку (
previous-line
). - M-r
- Сдвинуть точку к левому краю на строку в середине окна (
move-to-window-line
). Текст при этом не перемещается по экрану. Числовой аргумент говорит, на какой строке экрана поместить точку. Он отсчитывает экранные строки от верха окна (нуль для самой верхней). Отрицательный аргумент отсчитывает строки снизу (-1 для нижней строки). - M-<
- Перейти на начало буфера (
beginning-of-buffer
). При аргументе, равном n, двигает на n/10 от начала. Смотрите раздел Числовые аргументы, для более подробной информации о числовых аргументах. - M->
- Перейти в конец буфера (
end-of-buffer
). - M-x goto-char
- Считывает число n и сдвигает точку к позиции n в буфере. Позиция 1 -- это начало буфера.
- M-x goto-line
- Считывает число n и сдвигает точку к строке с номером n. Строка 1 -- это начало буфера.
- C-x C-n
-
Велит использовать текущий столбец, в котором находится точка, в качестве полупостоянного целевого столбца для C-n и C-p (
set-goal-column
). В дальнейшем эти команды всегда переходят на этот столбец в каждой строке, к которой вы передвигаетесь, или как можно ближе к нему при данном содержимом строки. Этот целевой столбец остается в силе, пока его не отменят. - C-u C-x C-n
- Отменить целевой столбец. В дальнейшем C-n и C-p снова, как обычно, пытаются избежать изменения горизонтальной позиции.
Если вы установите переменную track-eol
не равной nil
, то если точка находится к конце строки, C-n и C-p передвигают в конец другой строки. Обычно track-eol
равна nil
. Смотрите раздел Переменные, чтобы узнать, как установить переменные вроде track-eol
.
Обычно C-n, вызванная на последней строке буфера, добавляет к буферу новую строку. Если переменная next-line-add-newlines
равна nil
, то C-n вместо этого выдает ошибку (как C-p на первой строке).
Стирание текста
- DEL
- Удалить знак перед точкой (
delete-backward-char
). - C-d
- Удалить знак после точки (
delete-char
). - C-k
- Уничтожить все до конца строки (
kill-line
). - M-d
- Уничтожить все знаки вперед до конца следующего слова (
kill-word
). - M-DEL
- Уничтожить все знаки в обратном направлении вплоть до начала предыдущего слова (
backward-kill-word
).
Вы уже знаете о клавише DEL, которая удаляет знак перед точкой (то есть перед курсором). Другой ключ, Control-d (C-d для краткости), удаляет знак после точки (тот знак, на котором курсор). Это сдвигает остальной текст на строке влево. Если вы нажмете C-d в конце строки, то эта строка и следующая за ней соединяются.
Чтобы стереть больший кусок текста, используйте ключ C-k, который удаляет целую строку. Если вы нажмете C-k в начале или в середине строки, то он уничтожает весь текст вплоть до конца этой строки. Если вы наберете C-k в конце строки, то он объединяет эту строку со следующей.
Смотрите раздел Удаление и уничтожение, для получения информации о более гибких способах уничтожения текста.
Отмена сделанных изменений
Вы можете удалить все недавние изменения в тексте буфера вплоть до определенного предела. Каждый буфер записывает изменения отдельно, и команда отмены всегда относится к текущему буферу. Обычно каждая команда редактирования создает отдельное вхождение в записи отмены, но некоторые команды, как например query-replace
, создают несколько вхождений, а очень простые команды, например самовставляющиеся знаки, часто объединяются, чтобы сделать процесс отмены менее утомительным.
- C-x u
- Отменить одну группу изменений -- обычно одну стоящую команду (
undo
). - C-_
- То же самое.
- C-u C-x u
- Отменить одну группу изменений в области.
Вы делаете отмену с помощью команды C-x u или C-_. Когда вы впервые даете эту команду, она отменяет последнее сделанное изменение. Точка возвращается к тому месту, где она была до команды, сделавшей изменение.
Последовательное повторение C-_ или C-x u отменяет все более ранние изменения, вплоть до предела доступной информации отмены. Если все записанные изменения уже были отменены, команда отмены печатает сообщение об ошибке и ничего не делает.
Любая команда, отличная от команды отмены, прерывает последовательность команд отмены. Начиная с этого момента предыдущие команды отмены рассматриваются как простые изменения, которые могут быть отменены. Таким образом, чтобы вернуть отмененные вами изменения, наберите C-f или любую другую команду, которая не причиняя вреда прервет последовательность отмен, а затем снова набирайте команды отмены.
Обычная отмена относится ко всем изменениям, сделанным в текущем буфере. Вы также можете произвести выборочную отмену, ограниченную текущей областью. Чтобы сделать это, задайте желаемую область, а затем запустите команду undo
с префиксным аргументом (значение не играет роли): C-u C-x u или C-u C-_. Это отменяет самое последнее изменение в области. Чтобы отменить более ранние изменения, повторите команду undo
(префиксный аргумент не требуется). В режиме Transient Mark, любое использование undo
, когда есть активная область, производит выборочную отмену; вам не нужно задавать префиксный аргумент.
Если вы заметили, что буфер был изменен случайно, простейший путь вернуться в первоначальное состояние -- это набирать C-_ несколько раз, пока не исчезнут звездочки, стоящие в начале строки режима. В этот момент все сделанные вами изменения отменены. Всякий раз, когда команды отмены убирают звездочки из строки режима, это означает, что содержимое буфера стало точно таким же, каким оно было, когда файл был последний раз считан или сохранен.
Если вы не помните, намеренно ли вы изменили буфер, наберите C-_ один раз. Когда вы увидите последнее изменение, которое вы сделали отмененным, вы поймете, было ли это изменение умышленным. Если это была случайность, оставьте его отмененным. Если оно было умышленным, восстановите изменение, как описано выше.
Не все буферы записывают информацию для отмены. Буферы, чьи имена начинаются с пробела, этого не делают. Они используются для внутренних нужд Emacs и его расширений для хранения текста, который обычно не редактируется и не просматривается пользователями.
Вы не можете отменить простое перемещение курсора; только изменения содержимого буфера сохраняют информацию для отмены. Однако, некоторые команды движения курсора устанавливают метку, так что если вы время от времени используете эти команды, вы можете вернуться в окрестности, по которым вы передвигались, с помощью списка пометок (смотрите раздел Список пометок).
Когда информация отмены для какого-то буфера становится слишком большой, Emacs время от времени (во время сборки мусора) сбрасывает самые старые сведения. Вы можете указать, сколько информации для отмены необходимо хранить, с помощью двух переменных: undo-limit
и undo-strong-limit
. Их значения выражаются в байтах.
Переменная undo-limit
устанавливает гибкий предел: Emacs хранит данные для отмены достаточного числа команд, чтобы оставаться в этих границах и, возможно, выйти за них, но не хранит данные для более ранних команд сверх этого предела. Ее значение по умолчанию равно 20000. Переменная undo-strong-limit
устанавливает более жесткий предел: команда, которая увеличивает размер за эту границу, забывается сама. Значение этой переменной равно по умолчанию 30000.
Вне зависимости от значений этих переменных, самое последнее изменение никогда не сбрасывается, поэтому нет опасности, что сборка мусора, случившаяся сразу после неумышленного большого изменения, помешает вам отменить его.
Причина того, что для команды undo
определены два запускающих ключа, C-x u и C-_, состоит в том, что эта команда стоит того, чтобы иметь однознаковый ключ, но на некоторых клавиатурах нет очевидного способа ввести C-_. C-x u предоставляет альтернативу, вы можете прямо набрать его на любом терминале.
Файлы
Описанных выше команд достаточно для создания и изменения текста в буфере Emacs; более продвинутые команды Emacs лишь позволяют делать это проще. Но для того чтобы сохранить любой текст, вы должны поместить его в файл. Файлы -- это именованные единицы текста, которые хранятся операционной системой, чтобы вы могли получить их позже по имени. Чтобы просмотреть или использовать содержимое файла с любой целью, включая редактирование с помощью Emacs, вы должны задать его имя.
Рассмотрим файл с именем `/usr/rms/foo.c'. Для того чтобы начать редактирование этого файла в Emacs, наберите
C-x C-f /usr/rms/foo.c RET
Здесь имя файла дается как аргумент для команды C-x C-f (find-file
). Эта команда использует для считывания аргумента минибуфер, а чтобы завершить аргумент, вы набираете RET (смотрите раздел Минибуфер).
Emacs подчиняется этой команде, обращаясь к указанному файлу: создавая буфер, копируя в него содержимое этого файла и затем показывая вам буфер для редактирования. Если вы изменили этот буфер, вы можете сохранить новый текст в файле, напечатав C-x C-s (save-buffer
). Это делает изменения постоянными путем копирования измененного содержимого буфера снова в файл `/usr/rms/foo.c'. До этого ваши изменения существуют только внутри Emacs, а файл `foo.c' не изменяется.
Чтобы создать файл, надо просто обратиться к нему с помощью C-x C-f, как если бы он уже существовал. Emacs создаст пустой буфер, куда вы можете вставить текст, который хотите занести в файл. Реальный файл создается, когда вы сохраняете этот буфер с помощью C-x C-s.
Конечно, об использовании файлов можно узнать гораздо больше. Смотрите раздел Работа с файлами.
Справка
Если вы забыли, что делает какая-то клавиша, вы можете выяснить это с помощью знака справки C-h (или F1, аналога C-h). Наберите C-h k, а затем имя ключа, о котором вы хотите узнать; например, C-h k C-n рассказывает все о том, что делает C-n. C-h -- это префиксная клавиша; C-h k -- просто одна из ее подкоманд (а именно, команда describe-key
). Другие подкоманды C-h предоставляют другие виды справки. Наберите C-h дважды, чтобы получить описание всех возможностей справки. Смотрите раздел Справка.
Пустые строки
Здесь рассматриваются специальные команды и приемы создания и удаления пустых строк.
- C-o
- Вставить после курсора одну или несколько пустых строк (
open-line
). - C-x C-o
- Уничтожить все последовательные пустые строки, кроме одной (
delete-blank-lines
).
Когда вы хотите вставить новую строку текста перед уже существующей, вы можете сделать это, набрав новую строку текста и за ней RET. Однако, может оказаться удобнее видеть то, что вы набираете, если перед этим сперва создать пустую строку, а затем вставить в нее нужный текст. Это легко сделать, используя клавишу C-o (open-line
), которая вставляет новую строку после точки, но оставляет точку перед этой новой строкой. После С-о набирайте текст в новую строку. С-о F O O дает тот же результат, что и F O O RET, за исключением конечной позиции точки.
Вы можете создать несколько пустых строк, набрав С-о несколько раз, или задав ей числовой аргумент, чтобы сказать ей, какое количество строк необходимо создать. Смотрите раздел Числовые аргументы, чтобы узать, как это сделать. Если определен префикс заполнения, то команда C-o, когда вы используете ее в начале строки, вставляет на новой строке этот префикс заполнения. Смотрите раздел Префикс заполнения.
Простой способ избавиться от лишних пустых строк -- воспользоваться командой C-x C-o (delete-blank-lines
). Использование C-x C-o среди нескольких пустых строк удаляет их все, кроме одной. C-x C-o на одиночной пустой строке удаляет эту строку. Когда точка находится на непустой строке, C-x C-o удаляет все пустые строки после этой непустой строки.
Строки продолжения
Если вы добавляете слишком много знаков в одну строку, не прерывая ее нажатием RET, то эта строка будет расти и займет две (или более) строки на экране; в крайней правой позиции каждой из занятых строк, кроме последней, будет расположен знак `\'. Знак `\' говорит, что следующая строка экрана не является отдельной строкой в тексте, что это только продолжение строки, слишком длинной для данного экрана. Продолжение также называется переносом строк.
Иногда удобно, чтобы Emacs автоматически вставлял знаки перевода строки, когда строка становится слишком длинной; используйте для этого режим Auto Fill (смотрите раздел Заполнение текста).
Вместо продолжения Emacs может отображать длинные строки усеченными. Это значит, что все знаки, которые не вошли в ширину экрана или окна, не отображаются совсем. Они остаются в буфере, но временно невидимы. В последнем столбце ставится знак `$', а не `\', чтобы информировать о действии усечения.
Усечение вместо продолжения происходит, когда используется горизонтальная прокрутка, и, возможно, во всех окнах, не занимающих полную ширину фрейма (смотрите раздел Множество окон). Вы можете включить усечение для конкретного буфера, установив в нем переменную truncate-lines
не равной nil
. (Смотрите раздел Переменные.) Изменение значения truncate-lines
делает его локальным для текущего буфера; до этого момента действует значение по умолчанию. Начальное значение по умолчанию -- nil
. Смотрите раздел Локальные переменные.
Смотрите раздел Переменные управления изображением, о других переменных, влияющих на способ отображения текста.
Информация о позиции курсора
Это команды для получения информации о размере и позиции частей буфера и для подсчета числа строк.
- M-x what-page
- Напечатать номер страницы, на которой находится точка, и номер строки в пределах этой страницы.
- M-x what-line
- Напечатать номер строки, в которой находится точка в буфере.
- M-x line-number-mode
- Переключить режим автоматического отображения номера текущей строки.
- M-=
- Напечатать количество строк в текущей области (
count-lines-region
). Смотрите раздел Пометка и область, чтобы узнать, что такое область. - C-x =
- Напечатать код знака после точки, знаковое положение точки и столбец точки (
what-cursor-position
).
Есть две команды для работы с номерами строк. M-x what-line подсчитывает номер текущей строки и показывает его в эхо-области. Чтобы перейти к строке с заданным номером, используйте M-x goto-line; она спросит у вас номер. Номера строк отсчитываются от единицы с начала буфера.
Вы также можете видеть номер текущей строки в строке режима; Смотрите раздел Строка режима. Если вы сузили буфер, то номер строки в строке режима отсчитывается относительно доступной части (смотрите раздел Сужение).
В противоположность этому, what-page
подсчитывает номер строки и относительно суженной области, и относительно всего буфера и показывает оба числа. Смотрите раздел Страницы.
По этому поводу мы могли бы упомянуть М-= (count-lines-region
), которая печатает число строк в области (смотрите раздел Пометка и область). Смотрите раздел Страницы, для информации о команде C-x l, которая считает строки на текущей странице.
Команда С-х = (what-cursor-position
) может быть использована для узнавания столбца, в котором находится курсор, а также другой разнообразной информации о точке. Она печатает в эхо-области строку, которая выглядит следующим образом:
Char: c (0143, 99, 0x63) point=24781 of 31832(78%) column 52
(На самом деле, это результат, полученный, когда точка была перед словом `column' в самом примере.)
Четыре величины после `Char:' описывают знак, следующий за точкой; первое показывает его, а остальные дают его восьмиричный, десятичный и шестнадцатиричный код. Для многобайтного не-ASCII-знака после этих чисел следует `ext' и шестнадцатиричное представление в системе кодирования данного буфера, если эта система кодирования безопасно может представить этот знак в одном байте (смотрите раздел Системы кодирования). Если код знака больше одного байта, Emacs показывает `ext ...'.
После `point=' следует позиция точки, выраженная через количество знаков. Началу буфера присваивается позиция 1, следующему знаку 2 и так далее. Следующее, большее число означает общее число знаков в буфере. Потом в круглых скобках находится позиция, выраженная как процент от общего размера.
После `column' пишется горизонтальная позиция точки, в столбцах от левого края окна.
Если буфер был сужен, и некоторое количество текста в начале и в конце временно недоступно, то С-х = печатает дополнительный текст, описывающий текущие границы доступа. Например, команда может показать такое:
Char: C (0103, 67, 0x43) point=252 of 889(28%) <231 - 599> column 0
где два добавленных числа дают наименьшую и наибольшую допустимые для точки позиции знаков. Доступными являются знаки между двумя этими позициями. Смотрите раздел Сужение.
Если точка находится в конце буфера (или в конце видимой части), в выводе С-х = не описывается знак, стоящий после точки. Вывод может выглядеть так:
point=26957 of 26956(100%) column 0
C-u C-x = показывает вместо координат и столбца дополнительную информацию о знаке: имя набора знаков и коды данного знака в этом наборе; ASCII-знаки идентифицируются как принадлежащие набору знаков ASCII
. Кроме того, после `ext' показывается полный код знака, даже если он занимает больше одного байта. Вот пример для знака A с акцентом грав из Latin-1, в буфере с системой кодирования iso-2022-7bit(1):
Char: `A (04300, 2240, 0x8c0, ext ESC, A @) (latin-iso8859-1 64)
Числовые аргументы
В математике и компьютерной практике слово аргумент означает "данные, предоставляемые функции или операции." Вы можете передать любой команде Emacs числовой аргумент (также называемый префиксным аргументом). Некоторые команды интерпретируют аргумент как счетчик повторений. Например, команда C-f с аргументом, равным десяти, передвигает вперед на десять знаков, а не на один. В этих командах отсутствие аргумента эквивалентно аргументу, равному единице. Отрицательные аргументы говорят большинству таких команд, что надо двигаться или действовать в противоположном направлении.
Если на вашей клавиатуре есть клавиша META, простейший способ установить числовой аргумент -- набрать цифры и/или знак минуса, прижав клавишу META. Например,
M-5 C-n
передвинула бы на пять строк вниз. Знаки Meta-1, Meta-2, и так далее, а также Meta-- делают это, так как это ключи, привязанные к командам (digit-argument
и negative-argument
), которые определены как передающие аргумент в следующую команду. Цифры и - с модификатором Control или Control и Meta также задают числовой аргумент.
Другой способ задать аргумент -- это использовать команду C-u (universal-argument
), за которой следуют цифры аргумента. С помощью C-u вы можете набрать цифры аргумента, не удерживая клавиши-модификаторы; C-u работает на всех терминалах. Чтобы набрать отрицательный аргумент, введите после C-u знак минус. Просто знак минуса без цифр обычно обозначает -1.
C-u, за которой следует знак, не являющийся ни цифрой, ни знаком минус, имеет специальный смысл, "умножение на четыре". Она умножает аргумент последующей команды на четыре. Две последовательные C-u умножают его на шестнадцать. Таким образом, C-u C-u C-f передвигает вперед на шестнадцать знаков. Это удобный способ передвигаться вперед "быстро", так как он передвигает вперед примерно на 1/5 всех строк, умещающихся на экране обычного размера. Другие полезные сочетания -- это C-u C-n, C-u C-u C-n (двигает вниз на большой кусок экрана), C-u C-u C-o (создает "много" пустых строк) и C-u C-k (уничтожает четыре строки).
Некоторым командам важно только присутствие или отсутствие аргумента, но не его значение. Например, команда M-q (fill-paragraph
) без аргумента заполняет текст, а с аргументом вдобавок выравнивает текст по правой границе. (Смотрите раздел Заполнение текста, для более подробной информации о M-q). Просто C-u дает удобный способ предоставления аргументов для таких команд.
Некоторые команды используют аргумент в качестве счетчика повторений, но их действия с аргументом и без него имеют некоторые специфические черты. Например, команда C-k (kill-line
) с аргументом n уничтожает n строк, включая ограничивающие их знаки новой строки. Но C-k без аргумента действует по-другому: она уничтожает текст вплоть до перевода строки, или, если точка стоит как раз в конце строки, уничтожает перевод строки. Таким образом, две команды C-k без аргумента могут уничтожить непустую строку, аналогичные результаты можно получить, набрав команду C-k с аргументом, равным единице. (Смотрите раздел Удаление и уничтожение, для более подробной информации о C-k.)
Несколько команд трактуют простую C-u не так, как обыкновенный аргумент. Некоторые другие команды могут различать аргумент в виде просто знака минус и аргумент -1. Эти необычные случаи будут описаны, когда придет черед этих команд; они возникают всегда по причинам удобства использования отдельных команд.
Вы можете использовать числовой аргумент для вставки нескольких копий одного знака. Это работает прямо, если только знак -- не цифра; например, C-u 6 4 a вставляет 64 копии знака `a'. Но это не работает для вставки цифр; C-u 6 4 1 задает аргумент 641, а не вставляет что-либо. Чтобы отделить цифру от аргумента, наберите еще один C-u; например, C-u 6 4 C-u 1 на самом деле вставляет 64 копии знака `1'.
Мы используем термин "префиксный аргумент", как и "числовой аргумент", чтобы подчеркнуть, что вы набираете эти аргументы перед командой, и чтобы отличить эти аргументы от аргументов минибуфера, которые пишутся после команды.
Повторение команды
Команда C-x z (repeat
) предоставляет еще один способ повторить команду Emacs несколько раз. Эта команда повторяет предыдущую команду Emacs, какая бы она ни была. При повторении команда использует те же аргументы, какие у нее были раньше; она не считывает новые аргументы каждый раз.
Чтобы повторить команду несколько раз, напечатайте еще знаки z: каждый знак z повторит эту команду еще один раз. Повторение заканчивается, когда вы вводите знак, отличный от z, или нажимаете кнопку мыши.
Предположим например, что вы напечатали C-u 2 0 C-d, чтобы удалить 20 знаков. Вы можете повторить эту команду (вместе с ее аргументом) еще три раза, чтобы удалить в общей сложности 80 знаков, напечатав C-x z z z. Первый C-x z повторяет эту команду один раз, а каждый последующий z повторяет еще раз.
Минибуфер
Минибуфер используется командами Emacs для чтения более сложных, чем простое число, аргументов. Аргументами минибуфера могут быть имена файлов, имена буферов, имена функций Лиспа, имена команд Emacs и много других вещей в зависимости от считывающих аргумент команд. Для редактирования аргументов в минибуфере могут быть использованы обычные команды редактирования Emacs.
Когда вы используете минибуфер, он появляется в эхо-области, и туда передвигается курсор терминала. Начало строки минибуфера показывает подсказку, которая говорит, какой ввод вы должны давать, и как он будет применен. Часто подсказка происходит от имени команды, для которой нужен этот аргумент. Подсказка обычно кончается двоеточием.
Иногда в круглых скобках после двоеточия появляется аргумент по умолчанию; он тоже является частью подсказки. Значение по умолчанию будет использовано как значение аргумента, если вы вводите пустой аргумент (например, просто наберете RET). К примеру, команды, считывающие имена буферов, всегда показывают значение, принимаемое по умолчанию; оно является именем буфера, который будет использован в дальнейшем, если вы просто наберете RET.
Простейший способ дать аргумент минибуферу -- набрать желаемый текст и завершить его RET, клавишей для выхода из минибуфера. Вы можете отменить команду, которая запрашивает аргумент, и выйти из минибуфера, набрав C-g.
Минибуфер использует пространство экрана, отведенное под эхо-область, но это может противоречить другим способам использования эхо-области в Emacs. Emacs обрабатывает такие конфликты следующим образом:
- Если какая-то команда получает ошибку, пока вы находитесь в минибуфере, то это не отменяет минибуфер. Однако, эхо-область нужна для сообщения об ошибке, и поэтому сам минибуфер прячется на время. Он возвращается через несколько секунд или сразу же, как только вы наберете что-нибудь.
- Если в минибуфере вы используете команду, чьей целью является печать сообщения в эхо-области, такую как C-x =, то сообщение отображается как обычно, а минибуфер прячется на время. Он возвращается через несколько секунд, или как только вы наберете что-то еще.
- Когда используется минибуфер, эхо набираемых знаков не производится.
Минибуфер для имен файлов
Иногда минибуфер появляется уже с текстом. Например, когда вам предлагается задать имя файла, минибуфер появляется с содержащимся в нем каталогом, заданным по умолчанию, который оканчивается косой чертой. Это делается, чтобы проинформировать вас о том, в каком каталоге будет находиться файл, если вы не зададите каталог. Например, минибуфер может начинаться так:
Find File: /u2/emacs/src/
где `Find File: ' служит подсказкой. Напечатав buffer.c, вы задаете файл с именем `/u2/emacs/buffer.c'. Чтобы найти файлы в соседних каталогах, используется ..; таким образом, если вы наберете ../lisp/simple.el, то получите файл `/u2/emacs/lisp/simple.el'. Или вы можете уничтожить ненужное вам имя каталога с помощью M-DEL (смотрите раздел Слова).
Если вам не нужно ничего из каталога по умолчанию, вы можете уничтожить его с помощью C-a C-k. Но в этом нет необходимости; вы можете просто проигнорировать его. Вставьте после каталога по умолчанию абсолютное имя файла, начинающееся с косой черты или тильды. Например, чтобы задать файл `/etc/termcap', просто вставьте это имя, при этом вы получите в минибуфере такую строку:
Find File: /u2/emacs/src//etc/termcap
GNU Emacs придает двойной косой черте особое назначение (обычно нет смысла писать две косые черты подряд): они означают "пропустить все перед второй косой чертой в паре". Таким образом, `/u2/emacs/src/' в предыдущем примере будет проигнорировано, и вы получите файл `/etc/termcap'.
Если вы установите insert-default-directory
равной nil
, каталог по умолчанию не появляется в минибуфере. Таким образом, минибуфер появляется пустым. Но набираемое вами имя, если оно относительно, по-прежнему интерпретируется с учетом того же каталога по умолчанию.
Редактирование в минибуфере
Минибуфер -- это буфер Emacs (хотя и своеобразный), и обычные команды Emacs годятся для редактирования текста вводимых вами аргументов.
Так как RET в минибуфере определен для выхода, вы не можете использовать его для вставки ограничителя новой строки в минибуфер. Чтобы вставить перевод строки, введите C-o или C-q C-j. (Напомним, что ограничитель новой строки -- это на самом деле знак control-J.)
Минибуфер имеет свое собственное окно, которое всегда присутствует на экране, но действует так, как если бы его не было, когда минибуфер не используется. Когда же минибуфер используется, его ничем не отличается от всех остальных окон; вы можете перейти в другое окно с помощью C-x o, отредактировать текст в других окнах и может быть даже обратиться к нескольким файлам перед возвращением в минибуфер для представления аргумента. Вы можете уничтожить текст в другом окне, вернуться в окно минибуфера и затем восстановить этот текст, чтобы использовать его в аргументе. Смотрите раздел Множество окон.
Однако существуют некоторые ограничения на использование окна минибуфера. Вы не можете переключить в нем буферы -- минибуфер и его окно связаны вместе. Точно также, вы не можете поделить или уничтожить окно минибуфера. Но вы можете сделать его выше обычным способом с помощью C-x ^. Если вы включите режим Resize-Minibuffer, то окно минибуфера по необходимости увеличивается вертикально, чтобы вместить текст, который вы поместили в минибуфер. Используйте M-x resize-minibuffer-mode, чтобы включить или выключить этот второстепенный режим (смотрите раздел Второстепенные режимы).
Прокрутка работает в окне минибуфера особым образом. Когда высота минибуфера равна только одной строке, и он содержит длинную строку текста, которая не уместилась бы не экране, с помощью прокрутки автоматически поддерживается перекрытие одной строки продолжения другой на определенное число знаков. Переменная minibuffer-scroll-overlap
указывает число знаков, на которое нужно делать перекрытие; по умолчанию это 20.
Если во время нахождения в минибуфере вы запускаете команду, которая показывает в другом окне справочный текст любого вида, вы можете использовать в минибуфере команду C-M-v для прокрутки этого окна. Это свойство вступает в действие, если попытка получить завершение в минибуфере дает вам список возможных вариантов. Смотрите раздел Использование других окон.
Emacs обычно запрещает большинство команд, использующих минибуфер, когда минибуфер активен. Это правило было введено, чтобы рекурсивные минибуферы не запутывали начинающих пользователей. Если вы хотите получить возможность использования таких команд в минибуфере, установите переменную enable-recursive-minibuffers
не равной nil
.
Завершение
Для ввода значений некоторых видов аргументов вы можете использовать завершение. Завершение означает, что вы набираете часть аргумента, а Emacs явно дополняет остаток полностью или настолько, насколько можно определить по набранной вами части.
Когда завершение доступно, определенные клавиши -- TAB, RET и SPC -- перепривязываются для дополнения представленного в минибуфере текста до более длинной строки, которую этот текст представляет, путем сопоставления его с вариантами завершения, которые предоставляются командой, считывающей этот аргумент. Знак ? определен как показывающий список возможных завершений того, что вы уже ввели.
Например, когда M-x использует минибуфер для чтения имени команды, она предоставляет для завершения список всех имеющихся имен команд Emacs. Клавиши завершения сопоставляют текст в минибуфере со всеми именами команд, находят какие-то дополнительные знаки имени, которые подразумеваются уже представленными в минибуфере, и добавляют эти знаки к тем, которые вы дали. Поэтому можно напечатать M-x ins SPC b RET вместо M-x insert-buffer RET (например).
Регистр обычно имеет значение при завершении, так как он имеет значение в большинстве имен, которые вы можете завершить (имена буферов, файлов, команд). Таким образом, `fo' не завершится до `Foo'. Когда вы завершаете имя, в котором регистр не имеет значения, то при завершении регистр может быть проигнорирован.
Пример завершения
Здесь может помочь конкретный пример. Если вы наберете M-x au TAB, TAB ищет варианты (в данном случае имена команд), которые начинаются с `au'. Их несколько, включая auto-fill-mode
и auto-save-mode
, но все они одинаково начинаются на auto-
, поэтому `au' в минибуфере изменяется на `auto-'.
Если вы немедленно снова наберете TAB, то появятся несколько возможностей для следующих знаков -- это может быть любой из `cfilrs', -- поэтому больше ничего не добавляется, но в другом окне показывается список всех возможных завершений.
Если вы продолжаете набирать f TAB, то этот TAB увидит `auto-f'. Единственное имя команды, которое так начинается, --- это auto-fill-mode
, таким образом завершение вставляет ее остаток. Теперь вы имеете в минибуфере `auto-fill-mode' просто после набора au TAB f TAB. Заметьте, что TAB обладает в минибуфере таким действием, потому что когда возможно завершение, он привязан к команде minibuffer-complete
.
Команды завершения
Здесь представлен список всех команд завершения, определенных в минибуфере, когда завершение доступно.
- TAB
- Завершить представленный в минибуфере текст насколько это возможно (
minibuffer-complete
). - SPC
- Завершить текст в минибуфере, но не прибавлять более одного слова (
minibuffer-complete-word
). - RET
- Представить текст в минибуфере как аргумент, возможно сначала дополняя его, как описано ниже (
minibuffer-complete-and-exit
). - ?
- Напечатать список всех возможных завершений текста в минибуфере (
minibuffer-list-completions
).
SPC завершает очень похоже на TAB, но никогда не идет дальше следующего дефиса или пробела. Если в минибуфере есть `auto-f', и вы наберете SPC, он обнаружит, что завершение --- это `auto-fill-mode', но остановит завершение после `fill-'. Это даст `auto-fill-'. Еще один SPC в этом месте завершает полностью до `auto-fill-mode'. SPC в минибуфере, когда возможно завершение, запускает функцию minibuffer-complete-word
.
Вот несколько команд, которые вы можете использовать для выбора завершения в окне, показывающем перечень вариантов:
- Mouse-2
-
Щелчок второй кнопкой мыши выбирает одно из завершений из перечня возможных вариантов (
mouse-choose-completion
). Обычно вы используете эту команду, когда точка находится в минибуфере; но вы должны щелкнуть в перечне завершений, а не самом минибуфере. - PRIOR
- M-v
-
Нажатие PRIOR (или PAGE-UP) или M-v, когда вы находитесь в минибуфере, выбирает окно, показывающее буфер с перечнем завершений (
switch-to-completions
). Это прокладывает путь к использованию команд, перечисленных ниже. (Выбор это окна обычным способом имеет тот же эффект, но этот способ удобнее.) - RET
-
Нажатие RET в буфере с перечнем завершений выбирает завершение, на котором или после которого находится точка (
choose-completion
). Чтобы использовать эту команду, вы должны сначала переключиться в окно, показывающее перечень завершений. - RIGHT
-
Нажатие правой курсорной стрелки RIGHT в буфере с перечнем завершений передвигает точку к следующему завершению (
next-completion
). - LEFT
- Нажатие левой курсорной стрелки LEFT в буфере с перечнем завершений передвигает точку ближе к началу буфера, к предыдущему завершению (
previous-completion
).
Строгое завершение
Существует три различных варианта работы RET при завершении в минибуфере, зависящие от того, как будет использован аргумент.
- Строгое завершение используется, когда бессмысленно давать какой-либо другой аргумент, кроме одной из известных альтернатив. Например, когда C-x k считывает имя буфера для уничтожения, то бессмысленно давать что либо, кроме имени существующего буфера. При строгом завершении RET отказывается выходить, если текст в минибуфере не завершается с точным соответствием шаблону.
- Осторожное завершение подобно строгому завершению за исключением того, что RET выходит, только если текст уже совпадал в точности с шаблоном, не нуждающемся в завершении. Если текст -- не точное совпадение, RET не выходит, но делает завершение текста. Если это завершает текст до точного совпадения, то второй RET выйдет. Осторожное завершение используется для чтения имен файлов, которые должны уже существовать.
- Свободное завершение используется, когда любая строка является подходящей, и список альтернатив завершения дается просто для справки. Например, когда C-x C-f считывает имя файла для обращения, допустимо любое имя файла, на случай, если вы захотите создать новый файл. При свободном завершении RET берет текст в минибуфере точно как он дан, не завершая его.
Команды завершения показывают в окне список всех возможных вариантов всякий раз, когда возможно более чем одно завершение для следующего знака. Кроме того, набор ? явно запрашивает такой список. Если перечень завершений длинный, вы можете прокрутить его с помощью C-M-v (смотрите раздел Использование других окон).
Параметры завершения
При завершении имен файлов определенные имена обычно игнорируются. Переменная completion-ignored-extension
содержит список строк; файл, чье имя кончается на любую из этих строк, игнорируется как возможное завершение. Стандартное значение этой переменной имеет несколько элементов, включая ".о"
, ".elc"
, ".dvi"
и "~"
. Действие таково: например, `foo' может завершиться до `foo.c', даже если `foo.o' также существует. Однако, если все возможные завершения кончаются на "игнорируемые" строки, тогда они не игнорируются. Игнорируемые расширения не относятся к спискам завершений -- эти списки всегда упоминают все возможные завершения.
Обычно команда завершения, которая обнаруживает, что следующий знак нельзя определить, автоматически показывает список всех возможных завершений. Если переменная completion-auto-help
установлена в значение nil
, этого не происходит, и чтобы просмотреть возможные варианты, вы должны набрать ?.
Библиотека complete
реализовывает более мощный вид завершения, который может дополнять несколько слов одновременно. Например, она может завершить сокращение имени команды p-b
до print-buffer
, потому что ни одна другая команда не начинается с двух слов, чьи первые буквы -- это `p' и `b'. Чтобы использовать эту библиотеку, напишите (load "complete")
в вашем файле `~/.emacs' (смотрите раздел Файл инициализации, `~/.emacs').
Режим Icomplete предоставляет постоянно обновляющуюся информацию, говорящую вам, какие завершения доступны для уже введенного текста. Этот второстепенный режим включается и выключается с помощью команды M-x icomplete-mode.
История минибуфера
Все введенные вами в минибуфер аргументы сохраняются в списке истории минибуфера, чтобы вы могли снова использовать их позже в новом аргументе. Текст старых аргументов вставляется в минибуфер особыми командами. Они сбрасывают старое содержимое минибуфера, так что вы можете думать о них как о командах движения по списку предыдущих аргументов.
- UP
- M-p
- Перемещается к предыдущей строке аргумента, сохраненной в истории минибуфера (
previous-history-element
). - DOWN
- M-n
- Перемещается к следующей строке аргумента, сохраненной в истории минибуфера (
next-history-element
). - M-r regexp RET
- Перемещается к более раннему аргументу в истории минибуфера, в котором есть совпадение с regexp (
previous-matching-history-element
). - M-s regexp RET
- Перемещается к более позднему аргументу в истории минибуфера, в котором есть совпадение с regexp (
next-matching-history-element
).
Простейший способ повторно использовать сохраненные аргументы из списка истории -- передвигаться по списку истории по одному аргументу. Находясь в минибуфере, используйте M-p или стрелку вверх (previous-history-element
) чтобы "перейти" к предыдущему вводу минибуфера, и M-n или стрелку вниз (next-history-element
) для "перехода" к следующему.
Предыдущий ввод, который вы извлекаете из истории, полностью замещает содержимое минибуфера. Чтобы использовать его в качестве аргумента, выйдите из минибуфера как обычно, с помощью RET. Вы также можете отредактировать текст перед использованием; это не изменяет элемент истории, к которому вы "перешли", но ваш новый аргумент вставляется в конец списка истории как отдельный элемент.
Для многих аргументов минибуфера есть значение "по умолчанию". В некоторых случаях команды истории знают значение по умолчанию. Тогда вы можете вставить это значение в минибуфер в виде текста, используя M-n для перехода "в будущее" по истории. Мы надеемся в конце концов сделать это свойство доступным всегда, когда у минибуфера есть значение по умолчанию.
Также есть команды для поиска вперед или назад по истории; они производят поиск элементов истории, которые соответствуют задаваемому вами в минибуфере регулярному выражению. M-r (previous-matching-history-element
) производит поиск более старых элементов истории, тогда как M-s (next-matching-history-element
) производит поиск более новых элементов. По особому разрешению эти команды могут использовать минибуфер для считывания аргументов, хотя вы уже находитесь в минибуфере, когда запускаете их. Как и при наращиваемом поиске, заглавная буква в регулярном выражении делает поиск регистрозависимым (смотрите раздел Поиск и регистр букв).
Каждое использование минибуфера записывает ваш ввод в список истории, но есть отдельные списки для различных видов аргументов. Например, есть список для имен файлов, используемый всеми командами, считывающими имена файлов. (У него есть особенность: этот список истории записывает абсолютное имя файла, не больше и не меньше, даже если вы ввели его иначе.)
Существуют несколько других особенных списков истории, включая список для имен команд, считываемых командой M-x, список для имен буферов, список для аргументов команд вроде query-replace
и список команд компиляции, считываемых командой compile
. И наконец, есть список истории для "разного", который используют большинство аргументов минибуфера.
Переменная history-length
задает максимальную длину списка истории минибуфера; как только список дорастает до этой длины, самый старый элемент удаляется при добавлении нового. Если значение history-length
равно t
, то ограничения на длину нет, и элементы не удаляются никогда.
Повтор команд минибуфера
Каждая команда, которая использует минибуфер по крайней мере один раз, записывается в специальный список истории вместе со значением аргументов минибуфера, так что вы можете легко ее повторить. В частности, записывается каждое использование M-x, так как M-x использует минибуфер для чтения имени команды.
- C-x ESC ESC
- Повторное выполнение последней команды минибуфера (
repeat-complex-command
). - M-x list-command-history
- Вывести полную историю всех команд, которые может повторить C-x ESC ESC, начиная с более новых.
C-x ESC ESC используется для повторного выполнения недавней команды, использовавшей минибуфер. Запущенная без аргумента, она повторяет последнюю такую команду. Числовой аргумент определяет, какую команду повторить; единица означает первую от конца, а большие числа определяют более ранние команды.
C-x ESC ESC действует при помощи превращения предыдущей команды в выражение Лиспа и последующего входа в минибуфер, инициализированый текстом этого выражения. Если вы набираете просто RET, то команда повторяется как прежде. Вы можете также изменить команду путем редактирования лисповского выражения. То выражение, что вы в конце концов представите, и будет выполнено. Повторенная команда добавляется в начало истории команд, если она не идентична самой последней выполненной команде, которая уже была там.
Даже если вы не понимаете синтаксиса Лиспа, вероятнее всего будет очевидно, какая команда отражается для повторения. Если вы не меняли текст, вы можете быть уверены, что он повторится точно так, как прежде.
Находясь в минибуфере по команде C-x ESC ESC, вы можете использовать команды истории минибуфера (M-p, M-n, M-r, M-s; смотрите раздел История минибуфера) для продвижения по списку сохраненных полностью команд. После того, как вы найдете желаемую предыдущую команду, вы можете как обычно отредактировать ее выражение и затем предоставить его снова, набрав RET.
Перечень предыдущих команд, использовавших минибуфер, хранится как лисповский список в переменной command-history
. Каждый элемент --- это лисповское выражение, которое описывает одну команду и ее аргументы. Программы на Лиспе могут повторно выполнять команды путем передачи в eval
соответствующего элемента command-history
.