Заголовок этого раздела сформулирован таким провокационным образом не случайно: любому пользователю похожей на UNIX операционной системы (к таким системам относится и Linux), в любом случае необходим текстовый редактор. Выбор очень многих пользователей падает на один из двух наиболее популярных и, как следствие, наиболее универсальных (реализованных и работающих везде) текстовых редактора: Vim (или одну из его улучшенных версий, чаще всего Vi) и Emacs. Оба эти редактора появились около тридцати лет назад, но их почтенный возраст только пошёл им на пользу: огромное количество пользователей по всему миру все эти годы занималось их отладкой, локализацией и расширением.
Vim и Emacs образуют альтернативную пару не только по исторической случайности: оба редактора претендуют на роль универсального средства для работы с текстом на любых естественных и искусственных языках. И действительно, трудно назвать сравнимый с ними по возможностям текстовый редактор, да ещё и настолько нетребовательный к интерфейсу: и Vi, и Emacs будут работать на любом терминале. Однако ограниченные возможности интерфейса терминала требуют от программ надёжного способа отделения команд редактору от вводимого текста. В Vi и Emacs эта задача решена по-разному — отсюда большая часть различий в стиле работы с этими редакторами, отсюда и традиционный спор приверженцев этих редакторов о том, который из них лучше.
Тексты на разных языках
Главное свойство, которое сделало Emacs таким популярным и многофункциональным редактором — это заложенная в нём с самого начала принципиальная расширяемость. Emacs почти полностью написан на специально созданном для него языке программирования: Emacs Lisp, и у любого пользователя есть возможность запрограммировать любые необходимые именно ему функции и подключить их в качестве модуля к Emacs. При этом сам Emacs никак изменять не требуется. Сообщество программистов не замедлило воспользоваться расширяемостью Emacs, и к настоящему времени важнейшее достоинство этого редактора состоит именно в свободно распространяемых пакетах расширений, содержащих инструменты для решения самых разнообразных задач, связанных с редактированием текста.
Современный Emacs — это не просто текстовый редактор, а интегрированная среда для работы в системе. Основная идея сообщества разработчиков и пользователей Emacs состоит в том, что Emacs позволяет работать с любыми данными, которые могут быть представлены как текст (в лекции Работа с текстовыми данными обсуждалось, что таким образом можно представить очень многое в системе). Естественно, список содержащихся в каталоге файлов, программа на каком-либо языке программирования или электронное письмо — это тексты, которые сильно различаются по структуре и по тому, что от них нужно пользователю.
В Emacs для работы с текстами разного типа используются режимы.
- режим emacs
- Комплекс команд и настроек Emacs, предназначенных для работы с текстом определённой структуры, например, содержимым каталога, программой на Си и. т. п.
Каждый буфер в Emacs находится в одном из основных режимов. Основной режим — это набор функций и настроек Emacs приспособленных для редактирования текста определённого вида. Каждый основной режим по-своему переопределяет некоторые управляющие символы, так что наиболее доступными становятся команды, чаще всего нужные именно для работы с текстом данного типа. Команды, специфичные для текущего основного режима, обычно начинаются с управляющего символа C-c.
Некоторое представление о возможностях Emacs может дать весьма неполный список тех текстов, для которых существуют основные режимы:
- список файлов в каталоге;
- программы на самых разных языках программирования, от Си до самых экзотических;
- тексты в различных форматах разметки: XML, HTML, TeX;
- словари;
- электронная почта (режим позволяет не только читать и писать письма, но и отправлять и получать их);
- календарь;
- дневник и личное расписание;
- многое другое.
Когда требуется много и быстро работать с текстом на каком-либо искусственном языке (языке программирования, разметки и пр.), возможно, Emacs — это лучший выбор.
Обратите внимание, что в Emacs понятие «режим» имеет совершенно иной смысл, чем в Vim!
Не менее хорошо в Emacs развиты средства работы с текстами на самых разных естественных языках с самыми экзотическими письменностями. Просто для оценки возможностей Emacs в этой области можно выполнить команду «C-h h
», по которой будет выведен файл, изображающий приветствие на разных языках.
Команды Emacs
Если в вашей системе установлен Emacs, то вы можете запустить, набрав emacs
в командной строке любого терминала. Как и Vim, Emacs использует весь экран терминала, хотя интерфейс у него более богатый: вверху экрана находится строка с пунктами меню, под ней окно для отображения и редактирования текста, которое заканчивается строкой режима, в которой отображаются сведения о происходящем в окне. В самом низу экрана — строка минибуфера, используемая для диалога с пользователем, в частности для отображения и редактирования вводимых команд.
Vi и вслед за ним Vi — это многорежимные редакторы, когда команды вводятся в одном режиме, а текст — в другом, что позволяет использовать в качестве командных любые клавиши. В Emacs нет специального командного режима, но использован тот факт, что с клавиатуры можно вводить не только печатные, но и некоторые управляющие символы. Для этого используются несколько управляющих клавиш терминала (прежде всего Ctrl
и Alt
), нажатые в сочетании с различными текстовыми символами. Чтобы ввести такой символ, нужно нажать управляющую клавишу (например, Ctrl
) и, удерживая её, нажать клавишу с одним из печатных символов (например, «x
»). Кроме того, в Emacs используется управляющая клавиша Meta
, на тех терминалах, где она отсутствует, её функции обычно передаются клавише Alt
. На «настоящих» терминалах обычно не бывает ни Meta
, ни Alt
; из клавиатурных модификаторов присутствуют только Ctrl
и Shift
. Тогда на помощь приходит старая добрая ESC
: нажатие ESC
, а после неё — печатного символа (того же «x
») эквивалентно «Meta x
».
Команд в редакторе Emacs чрезвычайно много, доступных управляющих символов на всех не хватает, поэтому чтобы вызвать команду Emacs, обычно требуется ввести ключ, начинающийся с управляющего символа, за которым следует комбинация из управляющих или обычных символов, или просто полное имя команды. Последовательность символов, достаточная для вызова команды, называется законченным ключом, а если введённых символов недостаточно для однозначного определения команды, это — префиксный ключ.
Общее правило здесь таково: чем чаще нужна команда, тем короче вызывающий её ключ, и наоборот. Для лаконичной записи длинных клавиатурных комбинаций в сообществе пользователей Emacs сложилась особая традиция сокращённых обозначений. Клавишу Ctrl
обозначают заглавной буквой «C
», Meta
— «M
».
За свои длинные команды из разных комбинаций управляющих клавиш название Emacs получило шуточную расшифровку: Escape-Meta-Alt-Control-Shift.
Сочетания с командной клавишей обозначаются дефисом, например, запись С-h
обозначает, что нужно, удерживая Ctrl
, нажать «h
». C-h
— это префиксный ключ для команд справочной системы Emacs. Начинающему пользователю стоит выполнить команды «C-h ?
» (набрать C-h
и затем нажать «?
») — справка по командам помощи, «C-h t
» — интерактивный учебник для начинающих пользователей Emacs, и «C-h i
» — полное руководство по Emacs (в формате info
). С ключа C-x
начинаются основные команды Emacs, в частности, для работы с файламии буферами. Чтобы завершить работу Emacs, нужно ввести «C-x C-c
».
У любой команды Emacs есть собственное имя, по этому имени можно вызвать команду даже если она не привязана ни к какому клавиатурному ключу. Для вызвова команд по имени используется префиксный ключ M-x
. Например, посмотреть справку о помощи в Emacs можно командой «M-x help-for-help
».
Работа с файлами
В Emacs, как и в Vim, пользователь редактирует текст не в самом файл, а в буфере. Отличие Emacs в том, что нельзя написать «безымянный» текст и затем сохранить его в файле. При запуске Emacs без параметров открывается специальный буфер — «*scratch*
», он предназначен для временных заметок — его содержимое будет выброшено при закрытии Emacs. Если нужно создать новый файл — его следует открыть командой «C-x C-f
», точно так же открывается для редактирования уже существующий файл.
После того, как Мефодий нажал «C-x C-f
», в минибуфере возникло приглашение: «Find file: ~/
». Теперь нужно ввести путь к файлу, начиная с текущего каталога (Emacs любезно подсказал его Мефодию). С текстом в минибуфере можно обращаться почти так же, как с командной строкой shell или Vi: редактировать, использовать автодополнение (клавишей Tab
), перемещаться по истории стрелочками вверх/вниз. Мефодий не замедлил воспользоваться этой возможностью и, набрав «te
», нажав Tab
и Enter
, приступил к редактированию того же «textfile
». Сохранить сделанные изменения можно командой «C-x C-s
».
Когда Мефодий захотел открыть ещё один буфер, чтобы отредактировать один из своих сценариев, он запамятовал точное название нужного файла и, набрав «C-x C-f bin/
», нажал Enter
. В окне возник список файлов в подкаталоге «~/bin
», похожий на вывод ls -l
:
File Edit Options Buffers Tools Operate Mark Regexp Immediate Subdir Help
/home/methody/bin:
итого 24
drwxr-xr-x 2 methody methody 4096 Дек 2 15:21 .
drwx------ 10 methody methody 4096 Дек 2 15:21 ..
-rwxr-xr-x 1 methody methody 26 Ноя 9 21:34 loop
-rwxr-xr-x 1 methody methody 23 Ноя 9 21:34 script
-rwxr-xr-x 1 methody methody 32 Ноя 9 21:34 to.sort
-rwxr-xr-x 1 methody methody 44 Ноя 9 21:34 two
-RRR:%%-F1 bin (Dired by name)--L5--C51--All--Reading directory /home/methody/bin/...done
Пример 9. Emacs. Режим dired
Как указано в строке режима, это Dired, редактор каталогов, режим emacs, предназначенный для просмотра и изменения каталогов прямо из редактора. В Dired можно выбирать отдельные файлы, или группы файлов и производить над ними различные действия: открыть для редактирования, удалить, скопировать, переместить, переименовать по определённой схеме — словом, Dired, довольно мощное средство для наглядной работы с файловой системой, особенно он удобен для работы с группой файлов. Подробности о командах, доступных в этом режиме, можно найти в руководстве по Emacs.
Перемещение по тексту
В Emacs, как и в Vim есть понятие точка, это то место в буфере, где будет происходить вставка или удаление данных. Перемещение по тексту — это перемещение точки. Команды перемещения по структурным элементам текста развиты не менее, чем в Vim, помимо обычных стрелок, действуют команды перемещения в начало и конец строки (C-a
и C-e
), буфера (M-<
и M->
), предложения (M-a
и M-e
); к предыдущему и следующему слову (M-f
и M-b
), абзацу (M-{
и M-}
). Различные основные режимы предоставляют специализированные команды для перемещения по структурным элементам текстов на разных языках программирования, разметки и пр.
В Emacs несколько видов поиска: существуют отдельные команды для поиска строки и поиска по регулярному выражению. Если требуется найти ближайшее употребление конкретного слова, удобнее всего воспользоваться наращиваемым поиском по команде C-s
. Наращиваемый поиск уже встречался Мефодию: так был устроен поиск по истории команд в bash
. По мере набора первых символов искомой строки Emacs переносит точку к ближайшему такому сочетанию симвлов после курсора. Поиск в обратном направлении (к началу буфера) осуществляется командой C-r
. Наращиваемый поиск можно выполнять по регулярному выражению (C-M-s
). Все виды наращиваемого поиска в Emacs не различают прописные и строчные буквы.
Изменение текста
В Emacs доступно множество команд, экономящих усилия при редактировании текста. Если пользователь осознаёт, что набрал что-то неправильно, то можно удалить разом последнее слово (M-Del
), предложение (C-x Del
). Можно уничтожать и вперёд: до конца слова (M-d
) и предложения (M-k
). Emacs хранит не только последний удалённый фрагмент, но и все предыдущие, формируя список удалений. Только что уничтоженный текст можно вставить командой C-y
. После этого его можно заменить предыдущим уничтоженным фрагментом — M-y
. Можно двигаться и далее назад по списку удалений, повторяя M-y
.
Хорошо продуманы команды для перестановки частей текста вокруг точки: двух знаков (C-t
), слов (M-t
), строк (C-x C-t
). Команда M-t
не перемещает знаки препинания между словами, поэтому «потеха, дело» превратится в «дело, потеха».
Прямо из Emacs можно вызвать программу проверки орфографии («M-x ispell-buffer
») или даже включить проверку «на лету», когда неправильно написанные слова выделяются другим цветом («M-x flyspell-mode
»). Можно проверить написание отдельного слова, в котором находится точка («M-x $
») или завершить недописанное слово, основываясь на орфографическом словаре («M-x Tab
»).
В Emacs так много специальных команд для изменения текста, что команды поиска и замены бывают нужны не так часто. Произвести замену строки всюду в буфере можно по команде «M-x replace-string что заменить Enter на_что_заменить Enter
», для замены регулярного выражения — аналогичная команда «M-x replace-regexp
».
Если нужно заменить строку только в некоторых случаях, пригодится команда M-%
, запрашивающая подтверждение о замене при каждой найденной строке. Аналогичная команда для регулярных выражений — C-M-%
.
Любые изменения в тексте можно отменить командой C-_
(нужно нажать Ctrl
, Shift
и «-
»).
Работа с фрагментами текста
Многие команды Emacs работают с произвольным фрагментом текущего буфера. Такие команды всегда применяются к текущей области. Область — это отрезок текста между точкой (где находится курсор) и меткой. Метка в любой момент присутствует в любом буфере, пользователь может установить её в любом месте текста явно — командой M-Пробел
. Метка может перемещаться и без вмешательства пользователя: команды перемещения и редактирования могут изменять положение метки.
Таким образом, чтобы выделить в буфере фрагмент текста, можно произвести следующие операции:
- переместить точку (курсор) на один конец нужного фрагмента;
- нажать
M-Пробел
(установить метку); - переместить точку к другому концу нужного фрагмента.
Теперь можно выполнять команду редактирования — она будет применена именно к выделенной области. Например, C-w
удалит текст области, а
скопирует его. Вставить удалённый или скопированный фрагмент можно командой M-w
.C-y
Есть группа команд, позволяющих работать с меткой более эффективно: установить метку после конца следующего слова (M-@
), пометить текущий абзац (M-h
), весь буфер («C-x h
»). Различные основные режимы предоставляют команды для пометки структурных элементов текста, например, разделов документа, определения функции (в тексте программы) и т. п. Все положения метки хранятся в списке пометок, перенести точку в любое из предшествующих положений метки можно, нужное количество раз повторив команду «C-u C-@
».
- область
- Непрерывный отрезок текста, ограниченный точкой с одной стороны и меткой с другой.
Как и в Vim, в Emacs можно использовать для хранения информации регистры. В регистре Emacs можно сохранить позицию в буфере и затем перейти к этой позиции («C-x r Пробел x
» записывает позицию точки в регистр «x
», а «C-x r j x
» переходит в эту позицию). В регистре можно сохранить текст из области («C-x r s x
» сохраняет область в регистре «x
», «C-x r i x
» — вставляет текст из этого регистра). В регистрах также можно хранить числа, имена файлов, конфигурацию окон. Подробности как всегда доступны в руководстве.
Настройка Emacs
Коротко говоря, в Emacs можно настроить всё: связи между ключами и командами редактора, определить макрокоманды, написать собственные расширения. Есть возможность изменять настройки Emacs как в процессе работы, так и при помощи конфигурационного файла .emacsrc
.