Мария Сысойкина

Резкий скачок в развитии Linux и переход ее в разряд ОС для настольных ПК повлек за собой необходимость поиска качественных решений в области прикладного ПО. Впрочем, со временем проблема поиска трансформировалась в проблему выбора - средств как таковых набирается предостаточно, однако бесконечные споры о достоинствах того или иного пакета лишний раз убеждают неискушенного пользователя в отсутствии единственного, всеобъемлющего приложения, пригодного для решения любой задачи.

Обзоры существующих офисных пакетов для Linux, Интернет-приложений и средств разработки публикуются регулярно и повсеместно, но очень мало кто из авторов уделяет внимание испокон веков существовавшей и в Linux, и в Unix вполне интегрированной и функциональной среде - редактору Emacs.

Судя по тому, насколько хорошо (хотя абсолютно незаслуженно) забыт Emacs, его сегодня с легкостью можно назвать новым продуктом среди современных пакетов. Тем более что многим начинающим пользователям Linux Emacs, пожалуй, будет в новинку...

Конечно, Emacs - это не офисный пакет, однако в него входит развитый текстовый процессор. Это и не браузер уровня Netscape или Konqueror, однако многие успешно пользуются им для просмотра Web-страниц. Это и не новостной, и не почтовый клиент, но использовать его можно и для работы с электронной почтой и новостными группами. А редактор для программистов - это как раз изначальное предназначение Emacs.

Что такое Emacs

На сегодняшний день существуют две реализации Emacs. Первая - это GNU Emacs, разрабатываемый под эгидой Фонда свободного ПО (Free Software Foundation) небезызвестного Ричарда Столлмана (Richard Stallman). Текущая версия - 21.3 доступна на официальном сайте продукта http://www.gnu.org/software/emacs.

Второй вариант - XEmacs (ранее называвшийся Lucid Emacs). Текущая версия 21.4.12, официальный сайт - http://www.xemacs.org. Буква "X" в названии редактора в данном случае вовсе не означает, что это приложение для XWindow. Наоборот, обе реализации существовали задолго до появления каких бы то ни было графических оболочек, поэтому ориентированы прежде всего на работу в консольном режиме, однако прекрасно работают и под XWindow. Оба варианта действуют по лицензии GPL, следовательно, распространяются бесплатно и со всеми исходными кодами.

Обе реализации произошли от одного и того же предка - редактора макросов (отсюда и аббревиатура - Editor MACroS), созданного еще в 70-е годы для редактора TECO (Text Editor and COrrector). Фундаментальных различий между ними не так много, поэтому далее в статье будем говорить просто о среде Emacs, а различия оговаривать отдельно. Единственная, пожалуй, ощутимая разница заключается в том, что разработчики XEmacs ориентируются прежде всего на поддержку графики, дружественного интерфейса и тому подобных вещей.

Первоначально Emacs создавался для Unix и подобных ему ОС, а сейчас среда Emacs функционирует практически на всех платформах Unix и Linux; существуют также версии для Windows, MS-DOS и MacOS.

Итак, что же такое Emacs? В руководстве по GNU Emacs дается следующее определение: "Emacs - это расширяемый, настраиваемый, самодокументируемый экранный редактор реального времени".

"Расширяемый" - потому что само ядро Emacs занимает менее 2 Мбайт, а дополнительных модулей к нему существует множество. Наиболее известные модули, включаемые в установочный пакет Emacs, в дистрибутивах занимают порядка 30 Мбайт. Кроме них, можно найти менее распространенные модули в Интернете или написать свои. Подробнее о модулях поговорим чуть ниже.

"Настраиваемый" - Emacs можно настроить на выполнение практически любой задачи. Наиболее известные его применения: текстовый процессор, редактор разработчика, почтовый и новостной клиент, Web-браузер. И это лишь часть встроенных в Emacs возможностей. Кроме них, можно подключить любые известные модули, настроив и сконфигурировав существующие режимы работы или добавив новые.

"Самодокументируемый" - по словам специалистов, лучшая справка по Emacs - это сам Emacs. Работая в Emacs, можно получить справку практически по любой команде, любому действию, режиму и т. д.

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

Основные понятия

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

Буфер

В отличие от многих редакторов, открывая файл, Emacs считывает его содержимое в буфер - область оперативной памяти. Файл на диске при этом остается неизменным и доступным для других приложений. Все вносимые изменения сохраняются в буфере, а в файл они записываются только при сохранении на диск. Если открыто несколько файлов, то Emacs для каждого из них создает свой буфер, причем имя буфера не обязательно должно совпадать с именем файла. Буфер может создаваться не только для содержимого файла, но и в результате выполнения ряда команд, оперирующих с информацией. Так, при отладке программ в Emacs автоматически создается буфер для хранения сообщений отладчика. Термин "буфер" активно используется в документации по Emacs, в режимах и т. д.

Окна и фреймы

В терминологии Emacs "окно" - это область экрана, в которой отображается буфер, а не окно приложения, столь знакомое многим. При запуске Emacs на экране отображается одно окно, но некоторые функции Emacs могут временно открывать на экране дополнительные окна (например, для отображения справки или документации).

Тем не менее можно открыть несколько окон Emacs (окон в обычном понимании, т. е. несколько копий главного окна программы), например, для сравнения нескольких файлов. Такие обычные окна в терминах Emacs будут называться фреймами. Сколько бы ни было открыто фреймов, все они будут частями одного сеанса работы Emacs.

Комбинации клавиш

Поскольку Emacs создавался задолго до появления разнообразных графических сред, то в его основе заложено клавиатурное управление - вызов команд с помощью комбинаций клавиш. Разумеется, сейчас работать с Emacs можно и с помощью развитой системы меню, однако во всей документации в описаниях команд указываются именно соответствующие клавиши, да и выполнять некоторые действия бывает удобнее с клавиатуры.

В Emacs используются комбинации, включающие служебные клавиши Control, Meta, Shift и т. д. Существует общепринятая система их записи, используемая и при вызове команд, и при программировании функций на Elisp. Клавиша Control обозначается как "C", а запись "C-h" (вызов справки) означает одновременное нажатие клавиш "Control" и "h". Существуют и более сложные комбинации, например, "C-h k " - одновременное нажатие "Control" и "h", а затем при отпущенном Control нажатие k (вызов справки по конкретной команде или пункту меню). Аналогичным образом описываются команды, использующие клавишу Shift, которая обозначается как "S".

Что касается клавиши Meta, она используется во многих командах, однако имеется только на рабочих станциях Unix. Поэтому на клавиатурах персональных компьютеров вместо нее выступает клавиша Alt, а если и ее нет, то ее заменяет Escape (эту клавишу нужно нажать, а затем отпустить и нажимать следующие клавиши комбинации). В любом случае Meta обозначается как 'M'. Самая распространенная комбинация с этой клавишей - 'M-x' <имя_команды> - выполнение команды.

Кроме этих клавиш, комбинации могут включать клавиши табулятора (TAB), Escape (ESC), Return или Enter (RET), Linefeed (LFD, если она есть на клавиатуре) и пробел (SPC).

Режимы Emacs

Вообще говоря, несправедливо считать Emacs только текстовым редактором. Архитектура Emacs такова: он состоит из сравнительно небольшого ядра, написанного на языке C, и огромного числа модулей, описывающих различные режимы функционирования. Дополнительные модули пишутся на языке Emacs Lisp, или Elisp, который представляет собой язык высокого уровня, очень похожий на "обыкновенный" (common) Lisp. Таким образом, можно написать модуль для решения практически любой задачи, абсолютно не ограничиваясь только функциями текстового редактора. В этом аспекте Emacs правильнее будет считать интерпретатором Elisp, который по историческим причинам используется для редактирования.

Режимы определяют различное поведение и свойства Emacs, их можно включать, отключать и, конечно, настраивать. Иными словами, режимы работы Emacs приспосабливают редактор к обработке определенных типов текстов или к выполнению определенной задачи.

К наиболее известным режимам можно отнести следующие.

Режимы почтового клиента. В Emacs существует по меньшей мере четыре режима работы с почтой. В их числе - стандартный режим Rmail, достаточно развитый режим VM и сравнительно простой режим MH. Стандартный способ работы с электронной почтой в Emacs - программа Rmail.

Четвертый режим - Gnus - предназначен изначально для чтения новостных групп, однако вполне пригоден и для работы с почтой.

Режимы чтения новостей. Gnus - довольно развитый newsreader, имеющий одну очень важную особенность - возможность сортировки статей "по степени интересности": в системе существует система указания критериев (ключевых слов в заголовках), по которым определяется степень полезности статьи. Сообщения, не соответствующие критерию, могут автоматически удаляться.

Режим Web-браузера. W3 - пакет для Emacs, позволяющий работать с Web. Поддерживает все основные возможности обычных браузеров - просмотр изображений, таблиц, форм, фреймов, использование стилевых таблиц. Обладает большими возможностями настройки.

Вообще, в Emacs выделяют режимы основные и вспомогательные. Основные режимы служат для выполнения одной конкретной задачи, а вспомогательные могут использоваться совместно с несколькими основными. Например, существует довольно распространенный вспомогательный режим auto-fill, регулирующий правила переноса. Он позволяет настроить, например, автоматический перенос во всех строках в текстовом режиме, а в режимах программирования - перенос только в комментариях.

И вот, наконец, мы добрались до ключевого момента - режимов программирования.

Режимы программирования

Режимов, так или иначе связанных с разработкой, в Emacs множество. И это понятно - Emacs изначально создавался как редактор для программистов.

Большинство режимов программирования обеспечивает следующие возможности:

  • подсветка синтаксиса;
  • автоматические отступы и форматирование кода;
  • контекстная помощь по языку;
  • интерфейс к отладчику;
  • специфические для данного языка пункты в меню.

Самый, пожалуй, популярный режим программирования - это режим cc-mode, предназначенный, как видно из названия, для разработки на C/C++. Но в реальности он используется еще и для программирования на Java - синтаксис этого языка во многом похож на C, и, несмотря на то, что режим оптимизирован именно для языка C, остальные коды программ в нем нормально обрабатываются (рис. 1). Причем переход в этот режим осуществляется автоматически, при открытии файлов на C/C++ (заметим, что так же дело обстоит и с другими режимами).

Fig.1
Рис. 1. GNU Emacs: редактирование программы на C в режиме cc-mode.

В режиме cc-mode в кодах программы особыми шрифтами выделяются зарезервированные слова, команды препроцессора, текстовые строки и специальные символы. Автоматически проставляются отступы. По умолчанию стиль записи программы соответствует стилю проекта GNU, однако настройки всегда можно изменить, указав, например, в качестве используемого стиля стиль книги Kернигана и Ричи.

В режиме cc-mode используются команды перемещения по условиям (conditionals) вверх, вперед, назад; комментирование и раскомментирование области текста и т. д.

Что касается разработки на Java, то для этого языка существуют и собственные режимы. Один из них, JDEE-mode, превращает Emacs в полнофункциональную среду разработки на Java. Этот режим предоставляет следующие возможности:

  • собственное меню с пунктами компиляции, выполнения, отладки и сборки проекта и справкой;
  • подсветка синтаксиса;
  • автоматические отступы и форматирование кода;
  • возврат к ошибкам в кодах;
  • отладка и просмотр исходных кодов;
  • поддержка создания makefile.

Нельзя не сказать и о режиме emacs-lisp-mode. Это режим для редактирования программ на Elisp. В этом режиме автоматически формируются отступы, используются комментарии трех видов.

Режим редактирования Elisp позволяет работать как со всем буфером, так и с одним выражением, а также предоставляет возможность пользоваться отладчиком. Если редактируется текст на "другом" Lisp, то для него можно запускать внешний компилятор или интерпретатор.

Далее, существуют режимы для программирования на Perl - perl-mode и cperl-mode, режимы разработки на Fortran, TCL и т. д. Существует режим для разработки на Python, однако распространяется он только c XEmacs, а для GNU Emacs его нужно устанавливать отдельно. Называется он соответственно python-mode.

В Emacs существуют и режимы для разработки на HTML, SGML и XML.

Режим html-helper-mode предназначен для серьезной Web-разработки; помимо html, он поддерживает PHP, JSP и ASP. Для Web-разработки можно также использовать режим hm-html-menus, предлагающий разнообразные системы контекстных и выпадающих меню, содержащих операции для работы с html-документами. Режим поддерживает такие возможности, как добавление в документ ссылок и изображений при помощи операций drag-and-drop. Кроме того, тот же модуль обеспечивает и вспомогательный режим для html-редактирования, подключаемый к таким основным режимам, как psgml-html или даже perl-mode.

Упомянув режим psgml, расскажем о нем подробнее. Psgml-mode - это, пожалуй, один из самых серьезных и развитых режимов для работы с языками разметки. Поддерживает и SGML, и XML, позволяет работать с DTD, анализировать и проверять документы на соответствие DTD, содержит обширное меню с огромным количеством команд управления документами, элементами и конструкциями документа. Естественно, поддерживает такие функции, как подсветка синтаксиса, контроль закрывающих тегов и т. д., подключение внешних синтаксических анализаторов (парсеров).

Существует в Emacs и более простой режим для SGML, он так и называется: sgml-mode. Это стандартный режим, он поставляется со всеми версиями редактора.

К режимам sgml и psgml можно подключить вспомогательный режим XSLT-process, по сути превращающий Emacs в мощный XSLT-процессор. Этот режим обеспечивает такие возможности, как запуск XSLT-процессора для редактируемого буфера и отображение результата в новом буфере или же в браузере, и запуск XSLT-обработчика в режиме отладки для просмотра всего процесса трансформаций документа. В последнем режиме можно устанавливать точки останова (breakpoints), выполнять трансформации пошагово, просматривать глобальные и локальные XSLT-переменные и т. д.

Кроме режимов для написания текстов программ, есть ряд режимов, часто совершенно необходимых в процессе разработки. К ним прежде всего относится режим gud-mode, обеспечивающий подключение отладчиков: gdb, dbx, xdb, sdb, perldb, jdb и pdb.

После запуска отладчика становятся доступными все его команды, которые можно вызывать соответствующими клавишами в буфере отладки. Команды можно выполнять, используя те же клавиши, но с другим префиксом, из буфера исходного текста программы, если отладчик попадает в него в результате использования точек останова или пошагового выполнения программы.

Режим gud-mode позволяет добавлять и удалять точки останова, работать с окном (буфером) просмотра значений переменных (Watch-list), т. е. выполнять любые операции, доступные при отладке программ.

Помимо режима отладки при разработке могут понадобиться и следующие два режима: режим написания скриптов оболочек shell-script-mode и режим контроля версий - vc-mode.

Режим shell-script-mode предназначен для редактирования программ на языках многих оболочек с помощью весьма сходных команд: можно использовать команды для вставки в редактируемый текст выбора, ветвления, цикла по именам файлов или по числам, а также циклов с предусловием, с постусловием или с выбором.

Режим vc-mode предоставляет интерфейс к большинству популярных систем контроля версий (RCS, SCCS, CVS), значительно упрощая работу с файлами, версиями и т. д. Это стандартный режим Emacs.

Кроме того, существует масса режимов, полезных как при разработке, так и сами по себе, например, режимы работы с протоколами ftp и telnet, режим редактирования и создания makefile'ов, и еще многие и многие другие.

Настройка и подключение режимов осуществляется в файле .emacs. В нем можно настроить практически все, что касается поведения Emacs, - привязки клавиш и комбинаций клавиш, подключение основных режимов, использование вспомогательных режимов, использование/неиспользование подсветки для конкретных режимов, подключение новых языков программирования, распознавание типов файлов по расширениям и т. д. и т. п. На самом деле вопрос настройки Emacs заслуживает отдельного очень подробного рассмотрения, и рассказывать об этом в статье не имеет смысла. Лучше обратиться к документации по Emacs или к имеющимся в сети учебникам.

Естественно, что и XEmacs, и GNU Emacs позволяют работать одновременно в нескольких режимах, используя для этого несколько различных фреймов. Таким образом, можно одновременно редактировать текст программы, получая справку по используемым функциям, работать с нужной оболочкой, читать новостные группы и т. д., не выходя за рамки одного приложения (рис. 2), - вряд ли какая-либо из современных интегрированных сред предлагает такие же возможности.

Fig.2
Рис. 2. Интегрированная среда XEmacs: почтовый клиент VM, режим cc-mode, режим чтения документации, режим shell.

Так что в смысле интеграции и возможностей Emacs подчас превосходит современные системы и среды для Linux, по крайней мере среды разработки. В общем, как говорят, "старый друг лучше новых двух", а то и трех-четырех...