Вы находитесь на странице: 1из 10

Глава 7.

Редактор emacs

В 1956 году сотрудник Массачусетского технологического института (MIT) Джон


Маккарти ( John McCarthy) разработал язык Лисп (List processing — обработка
списков). В исходной концепции язык Лисп имел небольшое количество скалярных
(атомарных) типов данных и только одну структуру данных — список. Списки могли
содержать атомарные данные или другие списки.
Лисп поддерживал рекурсию и нечисловые данные (которыми увлекались во вре-
мена Фортрана и Кобола) и стал (по крайней мере, в Кембридже) одним из наиболее
почитаемых языков реализации программного обеспечения. Среди тех, кто занимался
развитием языка Лисп в MIT, были Ричард Столлмен (Richard Stallman) и Гай Стил
(Guy Steele). В 1975 году они объединили свои усилия в работе над emacs, разработ-
ку которого Столлмен долгое время вел в одиночку. В данной главе рассматривается
редактор emacs версии 22, реализованной Фондом свободного программного обе-
спечения — Free Software Foundation (GNU). Адрес главной страницы редактора
emacs — www.gnu.org/software/emacs.

История
Прототипом редактора emacs послужил ряд расширенных команд или макросов, со-
зданных для текстового редактора конца 60-х годов TECO (Text Editor and Corrector —
текстовый редактор и корректор). Его происхождение отражено в имени, являющимся
сокращением от Editor MACroS (макрос редактора), хотя эта аббревиатура породила
и множество юмористических толкований, в числе которых ESCAPE META ALT
CONTROL SHIFT (названия клавиш), Emacs Makes All Computing Simple (Emacs
превращает все компьютеры в простые устройства) и недоброжелательный перевод его
названия — Eight Megabytes And Constantly Swapping (постоянная подкачка страниц
при восьми мегабайтах памяти).

Развитие
Со временем emacs совершенствовался, выдержав более чем 20 основных версий
и дойдя до широко распространенной GNU-версии. Редактор emacs, разработанный
на C, содержит полноценный интерпретатор языка Лисп и полностью поддерживает
X Window System, а также работу с мышью. В своем развитии он уже ушел далеко
вперед от исходных макросов TECO, но все еще является инструментом, находящимся
в активной разработке. Версия 22 существенно обновлена в связи с интернационали-
зацией: она обладает расширенным внутренним набором символов UTF-8, в четыре
раза превышающим по объему Unicode, а также шрифтами и методами ввода символов
с клавиатуры, позволяющими работать на более чем 30 языках. К тому же пользова-
тельский интерфейс развивается в направлении поддержки концепции текстового
процессора WYSIWYG (what you see is what you get — что видишь, то и имеешь), что
облегчает новичкам освоение работы с этим редактором.
История 221

Редактор emacs всегда был существенно более развитым средством, чем простой
текстовый редактор. Будучи изначально разработанным вне UNIX-среды, он не при-
держивается UNIX/Linux-философии. В отличие от UNIX/Linux-утилиты, которая
обычно разрабатывается для выполнения какой-нибудь одной конкретной задачи
и предназначена для совместного использования с другими утилитами, редактор emacs
разработан в качестве средства «все в одном». Пользуясь преимуществами положенно-
го в его основу языка программирования (Лисп), пользователи emacs предпочитают
вместо применения уже существующих утилит и создания новых универсальных
инструментов настраивать под свои нужды и расширять функции самого редактора.
То есть они делятся друг с другом своими настроечными файлами ~/.emacs.
Задолго до появления X Window System Ричард Столлмен вложил немало сил
и фантазии в создание оконной рабочей среды, используя emacs в качестве иссле-
довательского полигона. Со временем он создал внутри emacs средства для чтения
и составления сообщений электронной почты, чтения и публикации сетевых новостей,
запуска команд оболочки, компилирования программ и анализирования сообщений
об ошибках, запуска и отладки этих программ, а также для запуска игр. В конечном
итоге появилась возможность войти в среду emacs и не выходить из нее весь день,
лишь переключаясь между окнами и файлами. Если в распоряжении пользователя
имеется только символьный терминал, то emacs существенно увеличивает его воз-
можности.
При работе в среде X Window System emacs не нуждается в передаче ему управ-
ления всем дисплеем, ему обычно достаточно одного-двух окон. Но при работе с ним
по-прежнему доступна и исходная символьная среда, и поэтому именно этот режим
работы будет рассмотрен в данной главе.
В качестве редактора, восприимчивого к языкам программирования, emacs об-
ладает специальными свойствами, которые включаются с целью оказания помощи
в редактировании текста, в его форматировании с помощью утилиты nroff, в верстке
с помощью системы TeX, в написании программ на Лиспе, C, Фортране и т. д. Эти
наборы свойств называются режимами, но они не имеют ни малейшего сходства с ко-
мандным режимом и режимом редактирования, использующимися в vi, vim и в других
редакторах. Поскольку при работе с emacs его не нужно переключать между режимом
редактирования и командным режимом, он называется редактором, не имеющим ре-
жимов работы.

Сравнение emacs с vim


Интересная дискуссия насчет непрекращающихся войн между редакторами изложена
по адресу en.wikipedia.org/wiki/Editor_war, а сравнительные оценки emacs и vim можно
найти на просторах интернета.
Как и vim, emacs является экранным редактором: он отображает экран редактиру-
емого текста и изменяет отображаемую информацию при вводе команды или вставке
нового текста. В отличие от vim emacs не требует постоянного контроля над тем,
в каком режиме вы находитесь, в командном режиме или в режиме ввода: при вводе
команд всегда используется клавиша CONTROL или другие специальные клавиши.
В редактируемый текст emacs вставляет обычные символы (и не использует их в ка-
честве команд), что также является характерной особенностью редактирования без
222 Глава 7. Редактор emacs

использования режимов работы. Многим людям такой подход представляется вполне


удобным и естественным.
Как и vim, emacs используется для редактирования текста в рабочей области или
буфере и имеет возможность записи этого буфера обратно в файл на диске по оконча-
нии работы. Но, работая с emacs, вы можете иметь множество рабочих буферов, и пере-
ключаться между ними без обязательной записи буфера на диск с последующим его
считыванием с диска. Более того, можно одновременно выводить на экран несколько
буферов, открывая для каждого из них отдельное окно редактора. Этот способ ото-
бражения файлов полезен при вырезании и вставке текста или когда нужно держать
на видном месте все объявления в программе на C в процессе редактирования кода,
который находится в другой части файла.
Как и vim, редактор emacs обладает богатым, исчерпывающим набором команд для
перемещения по буферу и внесения изменений в текст. Этот набор не является застыв-
шей твердыней, в любой момент команды можно изменить или перенастроить под свои
предпочтения. Любая клавиша может быть привязана к любой команде, чтобы лучше
подходить к конкретной клавиатуре или отвечать персональным запросам. Обычно
все привязки клавиш к командам хранятся в пусковом файле ~/.emacs, но они могут
меняться в интерактивном режиме во время сеанса редактирования. Все привязки
клавиш к командам, рассматриваемые в данной главе, являются стандартными для
текущих GNU-версий редактора emacs.

 ИЗБЕГАЙТЕ СЛИШКОМ МАСШТАБНЫХ ИЗМЕНЕНИЙ


ПРИВЯЗОК КЛАВИШ К КОМАНДАМ
Если вы измените слишком много клавишных привязок, то может получиться набор команд,
который вы не сумеете запомнить. Или набор, который может не позволить вам вернуться
в данном сеансе к стандартным привязкам.

И наконец, явное отличие от vim заключается в том, что emacs позволяет исполь-
зовать Лисп для создания новых команд или перезаписи старых. Столлмен назвал эту
особенность постоянной возможностью к расширению, но для того чтобы написать
и отладить новую команду в процессе редактирования текста, нужно быть довольно
смелым Лисп-программистом. Чаще всего в файл .emacs добавляются уже отлаженные
команды, откуда они будут загружены в процессе запуска редактора. Опытные пользо-
ватели emacs зачастую создают режимы или рабочие окружения, которые загружаются
редактором emacs при определенных условиях для решения специфических задач.
Дополнительные сведения о файле .emacs даны в разделе «Файл запуска .emacs».

 ЭКРАН И ОКНА EMACS


В данной главе понятие «экран» относится к экрану символьного терминала или к окну эму-
лятора терминала, работающему в графическом режиме. А понятие «окно» относится к окну
emacs, находящемуся на этом экране.

 EMACS И X WINDOW SYSTEM


Начиная с версии 19, GNU emacs располагает полноценной средой X Window System. Если
emacs запускается из окна эмулятора терминала, запущенного в графической среде, то для
emacs будет возвращен X-интерфейс (GUI). В данной книге графический интерфейс не рассма-
тривается, поэтому при запуске emacs следует воспользоваться ключом –nw, чтобы попасть
в текстовый интерфейс при любой среде окружения. См. далее раздел «Запуск emacs» на с. 223.
Руководство по началу работы с emacs 223

Сравнение работы редактора emacs в режиме


командной строки и в графическом режиме
Данная книга посвящена работе в Linux с помощью интерфейса командной строки.
А эта глава посвящена главным образом работе с emacs из интерфейса командной
строки. Ряд графических функций, предлагаемых редактором emacs, рассмотрен
в разделе «Графический интерфейс пользователя emacs» на с. 230.

Руководство по началу работы с emacs


Редактор emacs обладает огромным количеством свойств и множеством способов их
реализации. Полное руководство насчитывает более 35 глав. Тем не менее, довольно
существенный объем полезной работы можно выполнить с помощью относительно
небольшого набора команд. В этом разделе рассматривается простой сеанс редакти-
рования, объясняющий, как запустить редактор emacs и выйти из него, а также как
перемещать курсор и удалять текст. Для более доходчивого изложения рассмотрение
некоторых вопросов отложено или дано в сокращенном виде.

 ИНТЕРАКТИВНОЕ УЧЕБНОЕ ПОСОБИЕ ПО EMACS


Редактор emacs предоставляет своим пользователям интерактивное учебное пособие. Чтобы
им воспользоваться, нужно после запуска emacs нажать комбинацию CONTROL+H t. Чтобы
выйти из emacs, следует нажать комбинацию CONTROL+X CONTROL+C. Если открыто более
одного окна emacs, обратитесь к совету «Закрытие окна справки» на с. 239.

Запуск emacs
Для редактирования файла по имени sample с помощью emacs, используемого в каче-
стве простого текстового редактора, введите следующую команду:
$ emacs -nw -q sample
Ключ –nw, который должен быть первым ключом в командной строке emacs, застав-
ляет этот редактор отказаться от своего X-интерфейса (GUI). Ключ –q предписывает
emacs не читать пусковой файл ~/.emacs. Отказ от чтения этого файла гарантирует,
что emacs будет обладать стандартным стилем поведения и может использоваться
новичками или другими пользователями, желающими обойти загрузку информации
из файла .emacs.
Предыдущая команда запускает emacs, считывает файл по имени sample в буфер и
отображает его содержимое на экране или в окне. Если на данный момент файла с та-
ким именем не существует, emacs отображает пустой экран с пометкой (New File) в его
нижней части (рис. 7.1). Если файл с таким именем существует, emacs отображает его
содержимое и выдает другое сообщение (рис. 7.3). Если emacs запущен без указания
имени файла в командной строке, он отображает экран приветствия, который вклю-
чает информацию по использованию и список основных команд (рис. 7.2).
Изначально emacs отображает одно окно. В верхней части окна в негативном
оформлении отображается строка меню, доступ к которой можно получить, исполь-
зуя мышь или клавиатуру. При использовании клавиатуры окно списка расширений
224 Глава 7. Редактор emacs

пунктов меню отображается с помощью клавиш F10, META+‘ (обратный апостроф)


или с помощью команды META-x tmm-menubar ВВОД. Дополнительные сведения даны
в разделе «Использование меню с помощью клавиатуры».

Строка меню Позиция окна


в буфере Строка режима

Область вывода /
мини-буфер
Буфер
Основной режим

Рис. 7.1. Экран нового файла emacs

В нижней части окна emacs в негативном оформлении выводится информационная


строка, называемая строкой режима (Mode Line). В минимальном формате строка
режима показывает, какой именно буфер просматривается в окне, был ли этот буфер
изменен, какие основные и второстепенные режимы задействованы и насколько глу-
боко позиционируется окно в буфере. Когда на экране появляется несколько окон,
то в каждом из них отображается своя строка режима. В самой нижней части экрана
emacs оставляет открытой одну строку. Это область вывода и строка мини-буфера
(они сосуществуют на одной строке), которые используются для вывода сообщений
и ввода специальных однострочных команд.

Рис. 7.2. Экран приветствия emacs


Руководство по началу работы с emacs 225

 СПРАВОЧНОЕ РУКОВОДСТВО ПО EMACS


Справочное руководство по emacs доступно из самого редактора. Введите во время работы
с emacs команду CONTROL+H r. После этого для прокрутки на нужный раздел используйте
клавиши стрелок, а затем нажмите клавишу ВВОД. Вместо этого можно набрать m (вызвав
перемещение курсора в мини-буфер), а затем набрать название раздела (пункта меню), ко-
торый нужно просмотреть. Чтобы заставить emacs завершить название пункта меню, следует
нажать клавишу табуляции. Автозавершение меню работает так же, как и автозавершение
имени (см. раздел «Автозавершение имени»). Способы закрытия окна справки даны в совете
«Закрытие окна справки» на с. 239, а дополнительные сведения об интерактивной справке
даны в разделе «Интерактивная справка» на с. 239.
Например, чтобы просмотреть в интерактивном справочном руководстве раздел Minibuffer,
нужно ввести команду CONTROL+H r m minibuffer ВВОД. Можно также дать команду CONTROL-
H r m min TAB ВВОД.

Если при наборе команды в мини-буфер будет допущена ошибка, emacs выводит
сообщение об ошибке в область вывода. Сообщение об ошибке будет выведено по-
верх набранной команды, но emacs через несколько секунд вернет команду на место.
Краткого отображения сообщений об ошибках вполне достаточно, чтобы их прочи-
тать перед продолжением набора команды с того места, где он был прекращен. Более
подробные сведения даны на странице интерактивного справочного руководства,
вызываемой через пункт меню Minibuffer (см. предыдущий совет).
Курсор находится либо в окне, либо в мини-буфере. Весь ввод и почти все редак-
тирование происходят под курсором. При наборе обычных символов emacs вставляет
их в позицию курсора. Если под курсором или справа от него находятся символы, они
сдвигаются вправо по мере ввода, поэтому никакие символы не теряются.

Выход
Команда выхода из emacs вводится с помощью комбинации CONTROL+X CONTROL+C.
Эту команду можно ввести практически в любой момент (в некоторых режимах сна-
чала может потребоваться нажать комбинацию CONTROL+G). Эта команда завершит
работу emacs предельно корректно, переспросив, желаете ли вы сохранить изменения,
внесенные во время сеанса редактирования.
Если нужно отменить наполовину введенную команду или остановить запущенную
команду до того, как она будет выполнена, следует нажать комбинацию CONTROL+G.
Редактор emacs отобразит в области вывода сообщение Quit (Завершена) и будет
ждать следующей команды.

Вставка текста
При наборе обычных (выводимых на печать) символов курсор и любые символы
справа от него сдвигаются на одну позицию вправо, и новый символ вставляется
в пространство, освобождаемое сдвигаемыми символами.

Удаление символов
В зависимости от используемой клавиатуры и настроек файла запуска emacs, сим-
волы могут удаляться разными клавишами и разными способами. Обычно комби-
нация CONTROL+D удаляет символ под курсором, то же самое делается с помощью
226 Глава 7. Редактор emacs

клавиш DELETE и DEL. Клавиша BACKSPACE обычно удаляет символ слева от курсора.
Попробуйте воспользоваться каждой из этих клавиш и посмотрите, что они делают.

 И ЕЩЕ ОБ УДАЛЕНИИ СИМВОЛОВ


Если инструкции, рассматриваемые в данном разделе, не работают, прочитайте дополни-
тельную информацию по emacs, посвященный удалению символов. Для этого введите из
приглашения оболочки следующую команду:
$ info emacs
Находясь в программе info, введите команду m deletion, чтобы отобразился документ,
подробно описывающий порядок удаления небольших фрагментов текста. Для прокрутки
документа используйте ПРОБЕЛ. Для выхода из программы info нажмите клавишу q. Ту же
информацию можно получить в интерактивном справочном руководстве по emacs (по команде
CONTROL-H r; см. раздел «Интерактивная справка» на с. 239).

Запустите emacs и наберите несколько строк текста. При ошибках внесите необхо-
димые исправления, пользуясь ранее рассмотренными клавишами удаления. Клавиша
ВВОД вставляет в буфер невидимый символ конца строки и возвращает курсор к левой
границе на одну строку ниже. Можно вернуться за начало строки и попасть в конец
предыдущей строки. На рис. 7.3 показан типовой буфер.

 ПОЛЬЗУЙТЕСЬ КЛАВИШАМИ СТРЕЛОК


Иногда самым простым способом перемещения курсора является использование клавиш
стрелок влево, вправо, вверх и вниз.

Перемещение курсора
Курсор можно поставить на любом символе в окне emacs и переместить окно таким
образом, чтобы в нем отображалась любая часть буфера. Курсор можно перемещать
вперед или назад по тексту (см. рис. 6.8 в главе 6), по различным текстовым элемен-
там — например, по символам, по словам, по предложениям, по строкам и по абзацам.
Перед любыми командами перемещения курсора можно указывать количество по-
вторений (команда CONTROL+U, за которой следует числовой аргумент), заставляю-
щее курсор перемещаться по тексту на указанное количество текстовых элементов.
Числовые аргументы рассмотрены далее в соответствующем разделе.

Рис. 7.3. Типовой буфер


Руководство по началу работы с emacs 227

Перемещение курсора по символам


Команда Чтобы переместить курсор вперед (вправо) на один символ, следует на-
CONTROL+F жать клавишу СТРЕЛКА ВПРАВО или комбинацию клавиш CONTROL+F.
Если курсор находится в конце строки, эта команда переместит его в начало следую-
щей строки. Например, команда CONTROL+U 7 CONTROL+F переместит курсор на семь сим-
волов вперед.
Команда Чтобы переместить курсор назад (влево) на один символ, следует на-
CONTROL+B жать клавишу СТРЕЛКА ВЛЕВО или комбинацию клавиш CONTROL+B.
Например, команда CONTROL+U 7 CONTROL+B переместит курсор на семь символов назад.
Работа команды CONTROL+B похожа на работу команды CONTROL+F (рис. 7.4).

CONTROL-B CONTROL-F

Рис. 7.4. Перемещение курсора по символам

Перемещение курсора по словам


Команда Чтобы переместить курсор на одно слово вперед, следует нажать ком-
META+f бинацию клавиш META+f. Для вызова этой команды нужно при нажа-
тии клавиши f удерживать в нажатом состоянии клавишу META или ALT. Если исполь-
зуемая вами клавиатура не имеет ни одной из этих клавиш, нажмите клавишу ESCAPE,
отпустите ее, а затем нажмите клавишу f. Эта команда оставляет курсор на первом
символе, не являющемся частью того слова, с которого он начал перемещение. Команда
CONTROL-U 4 META-f переместит курсор вперед на один пробел, следующий за концом
четвертого слова. Дополнительные сведения даны в разделе «Клавиши: система за-
писи обозначений и использование» на с. 231.
Команда Чтобы переместить курсор на одно слово назад, следует нажать ком-
META+b бинацию клавиш META+b, при этом курсор останется на первой букве
того слова, с которого он начал перемещение. Если курсор был на первой букве слова,
нажатие комбинации META+b приведет к перемещению курсора на первую букву
предыдущего слова. Работа команды META +b похожа на работу команды META+f
(рис. 7.5).

Перемещение курсора по строкам


Команды При нажатии комбинации CONTROL+A курсор перемещается в начало
CONTROL+A, той строки, на которой находился, а при нажатии комбинации
CONTROL+E,
CONTROL+E — в конец этой строки. При нажатии клавиши СТРЕЛКА
CONTROL+P
и CONTROL+N ВВЕРХ или комбинации клавиш CONTROL+P курсор перемещается на
одну строку вверх, на позицию, находящуюся непосредственно над той,
с которой он начал перемещение, а при нажатии клавиши СТРЕЛКА ВНИЗ или комби-
нации клавиш CONTROL+N курсор перемещается вниз. Как и при работе с другими
клавишами перемещения курсора, вы можете для перемещения курсора сразу на не-
сколько строк предварять нажатие комбинаций CONTROL+P и CONTROL+N нажатием
комбинации CONTROL+U и вводом числового аргумента. Можно также использовать
228 Глава 7. Редактор emacs

пары этих команд для перемещения курсора вверх в начало предыдущей строки, вниз
в конец следующей строки и т. д. (рис. 7.6).

META-b META-f

belief,.really...It
Рис. 7.5. Перемещение курсора по словам

CONTROL-P
CONTROL-P CONTROL-P
CONTROL-A needed.as CONTROL-E

CONTROL-A with.their CONTROL-E

CONTROL-N
CONTROL-A working.to CONTROL-N
CONTROL-E
CONTROL-N

Рис. 7.6. Перемещение курсора по строкам

Перемещение курсора по предложениям,


абзацам и позициям окна
Команды При нажатии комбинации META+a курсор перемещается к началу пред-
META+a, ложения, на котором он находится, а при нажатии комбинации META+e
META+e,
META+{
курсор перемещается к концу этого предложения. При нажатии
и META+} комбинации META+{ курсор перемещается к началу абзаца, на котором
он находится, а при нажатии комбинации META+} курсор перемещается
к концу этого абзаца. (Определения предложениям и абзацам даются в соответст-
вующих, посвященных им разделах.) Перед любой из этих команд можно ставить
Число повторений (команда CONTROL+U, за которой следует числовой аргумент),
заставляющее курсор перемещаться на указанное количество предложений или аб-
зацев.
Команда При нажатии комбинации META+r курсор перемещается в начало сред-
META+r ней строки окна. Можно перед этой командой нажать комбинацию
CONTROL+U и указать номер строки (здесь CONTROL+U является не признаком коли-
чества повторений, а признаком номера строки на экране). Команда CONTROL+U 0 META+r
вызовет перемещение курсора в начало самой верхней (нулевой) строки окна. Команда
CONTROL+U — (знак минуса) вызовет перемещение курсора в начало последней строки
окна (рис. 7.7).
Руководство по началу работы с emacs 229

CONTROL-U ME TA- {
0 META-r

META-r ME TA- a

Курсор ME TA- e

CONTROL-U ME TA-}
– META-r

Рис. 7.7. Перемещение курсора по предложениям, абзацам и позициям окна

Редактирование в позиции курсора


Если курсор в окне выставлен на позицию, в которую нужно вводить текст, то для
ввода текста не требуется никаких команд. При наборе текста emacs отображает этот
текст в позиции курсора. Любой текст, находящийся ниже или правее курсора, сдви-
гается вправо. При вводе такого количества символов, при котором текст перейдет
правую границу окна, emacs отображает символ обратного слэша (\) у правой границы
окна и переносит текст на следующую строку. Символ обратного слэша появляется на
экране, но не сохраняется в файле и никогда не выводится на печать. Хотя вы можете
создать строки произвольной длины, некоторые инструментальные средства Linux
испытывают проблемы при работе с текстовыми файлами, содержащими подобные
строки. Чтобы разбить строку на две строки, нужно выставить курсор на то место, где
нужно разбить строку, и нажать клавишу ВВОД.
Удаление При нажатии клавиши BACKSPACE происходит удаление символа сле-
текста ва от курсора. При каждом нажатии клавиши BACKSPACE курсор и вся
остальная часть этой строки перемещаются влево. Для объединения строки со стоящей
над ней строкой нужно выставить курсор на первом символе второй строки и нажать
клавишу BACKSPACE.
Для удаления символа под курсором нужно воспользоваться комбинацией
CONTROL+D. При этом курсор остается на месте, но весь текст, оставшийся в строке,
перемещается влево, заполняя позицию удаленного символа. Если обе эти клавишные
команды не работают так, как описано здесь, обратитесь к совету «И еще об удалении
символов» на с. 226.

Сохранение буфера и извлечение его содержимого


Независимо от тех изменений, которые были внесены в буфер во время сеанса работы
с emacs, связанный с ним файл не будет изменен до тех пор, пока вы не сохраните со-
держимое буфера. Если выйти из emacs без сохранения буфера (при определенной

Вам также может понравиться