- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF77:Emacs
Материал из Linuxformat.
Содержание |
Emacs для пользователя
часть 1 И вновь продолжается бой! Александр Кузьменков подливает масла в огонь древнего противостояния Vi и не-Vi.
Emacs — пожалуй, один из самых известных проектов-долгожителей, разрабатываемых под лицензией GPL. Когда-то давно, когда деревья были маленькими, а компьютеры - большими, небезызвестный Ричард Столлмен (Richard Stollmen) начал разрабатывать свою свободную Unix-подобную операционную систему GNU (Gnu’s Not Unix). Ричард относительно легко справился с написанием комплекта компиляторов GCC и множества других программ, среди которых был и Emacs, который задумывался им как текстовый редактор для программирования. И хотя своей главной цели Столлман пока не достиг (проекту ОС GNU не хватает стабильного ядра: работа над Hurd ведется довольно вяло), его GCC и Emacs приобрели такую популярность, что были портированы на большинство распространенных операционных систем и платформ.
Наверняка вы уже наслышаны о «святых войнах юниксоидов» на тему «Vim против Emacs», и скорее всего пробовали запускать Emacs. А может быть, вы — приверженец Vim и решили посмотреть на вечного конкурента своего любимого редактора?. Скорее всего потыкавшись в кнопки, расположенные на панели инструментов, вы побыстрее закрыли его, чтобы с чистой совестью вернуться в любимый Kate/Gedit/Evim/Tea, где все просто, логично и знакомо. Да, Emacs никак не подходит под определение «дружественной к пользователю программы» и вряд ли вам понравится с первого взгляда, но поработав с ним недельку-другую и «заточив» под свои нужды, вы вряд ли будете продолжать использовать Kate/Gedit для правки текста, а KDevelop/Anjuta/Eclipse — в качестве IDE. Подлинная мощь Emacs состоит в расширяемости: с помощью дополнительных компонентов он может заменить и почтовый клиент, и web-браузер, и ICQ/Jabber/IRC-клиент, и даже MP3-плеер.
Ядро Emacs, написанное на C, по сути, представляет собой интерпретатор языка Elisp (Emacs Lisp), а остальная часть редактора написана на этом языке. К чему такие сложности? На самом деле все довольно просто: Emacs — поистине огромный проект, и такой подход к разработке сделал его портирование на другие платформы и ОС довольно несложным делом. То есть оно сводится к портированию ядра программы — интерпретатора Elisp.
Cтоит упомянуть, что существует несколько различных версий Emacs: это GNU Emacs, до сих пор поддерживаемый Ричардом Столлменом; отпочковавшийся от него XEmacs; microEmacs, по слухам, являющийся любимым редактором Линуса Торвальдса, и еще несколько других. Мы будем ориентироваться на GNU Emacs, как на самую распространенную версию, поскольку она есть во всех известных дистрибутивах, в отличие от тех же XEmacs и microEmacs.
Основы основ
Давайте разберемся с тем, как работает этот монстр. Запустите Emacs и нажмите C-x C-f. В терминологии Emacs С означает клавишу Ctrl, а M — клавишу Meta, соответствующую клавишам Alt или Esc. То есть «нажмите C-x C-f» означает, что вы должны нажать x при зажатом Ctrl, а затем, не отпуская Ctrl, нажать f. Эта комбинация используется для открытия и создания файлов, а для сохранения служит C-x C-s. Да, вот такие неудобные на первый взгляд «горячие клавиши» выбраны в Emacs для таких простых действий. Впрочем, стоит сказать, что каждый опытный «емаксер» создает свою собственную раскладку клавиатурных комбинаций. При нажатии C-x C-f в нижней части окна, называемой минибуфером, появится приглашение к вводу имени файла для редактирования. Вы можете ввести имя как существующего файла (тогда он откроется для редактирования), так и не существующего. В последнем случае Emacs откроет пустой буфер, который впоследствии будет сохранен в указанный файл.
Буфер — одно из ключевых понятий Emacs, он представляет собой просто текст, открытый в данный момент в Emacs. На самом деле, это определение довольно неточное, но для начала сойдет: проникнувшись философией Emacs, вы и сами увидите, что буфер может содержать что угодно — и таблицу процессов, и текст, и даже PNG-картинку. По умолчанию при открытии Emacs создает два буфера — scratch и Messages. О первом вы можете прочесть в соответствующей врезке, а второй содержит отладочные сообщения редактора.
Минибуфер поддерживает функцию автодополнения имен файлов/каталогов по клавише Tab, на манер командной оболочки Bash.
Думаю, с открытием файла вы разобрались. Теперь попробуйте открыть другой файл, или создать новый. Как видите, он открылся, но куда делся предыдущий? Никуда — он просто находится в другом буфере! При открытии или создании файла Emacs создает для него новый буфер, который становится активным. Для переключения между буферами используется комбинация C-x C-b, после нажатия которой в минибуфере появится приглашение к вводу имени буфера, на который вы хотите переключится. Если вместо ввода имени буфера просто нажать Enter, то Emacs переместит вас к предыдущему буферу.
Для выхода из редактора служит комбинация C-x C-c. Если на момент выхода у вас будут измененные буферы, которые вы не сохранили, обратите внимания на строку минибуфера — Emacs обязательно спросит, не хотите ли вы сохранить изменения. Для закрытия одного лишь активного буфера применяется сочетание клавиш C-x C-k.
Окно редактирования Emacs можно заставить отображать сразу несколько буферов, разделив его на несколько независимых частей. Для разделения окна по горизонтали нажмите C-x 2, по вертикали — C-x 3. Перемещаться между различными частями окна редактирования можно при помощи сочетания C-x o. Для того, чтобы вернуться в обычный режим с отображением одного буфера в окне редактирования, нажмите C-x 1. Обратите внимание, что активным станет тот буфер, в которым вы находились до нажатия C-x 1.
Конечно же, не все команды Emacs имеют горячие клавиши — функций у редактора слишком много, да и каждое установленное дополнение добавляет свои собственные. Поэтому все команды можно вводить в минибуфере вручную. Если вы просто щелкните мышью на строке минибуфера, ничего путного из этого не выйдет. Для выполнения внутренних команд есть комбинация M-x (напомню, это Alt-x или последовательное нажатие Esc и x). Давайте потренируемся. Нажмите M-x, введите в минибуфер команду save-buffer (для имен команд так-же работает функция автодополнения) и нажмите Enter. В результате активный буфер (то есть редактируемый в данный момент) будет сохранен в файл. Как вы уже, наверное, догадались, именно эта команда привязана к комбинации C-x C-s.
Если вы случайно нажмете C-x или, например M-x, или просто передумаете вызывать какую-нибудь внутреннюю команду, нажмите C-g. После этого информация в минибуфере уничтожится, а сам он станет неактивным.
Процесс копирования-вставки в Emacs имеет свои особенности. Для копирования куска текста установите курсор на его начало и нажмите С-пробел. В минибуфере в это время должно появиться сообщение Mark Set («метка установлена»). Теперь с помощью клавиш-стрелок, PgUp/PgDown или Home/End доберитесь до конца нужного куска и нажмите C-w. Это команда вырезает часть текста и заносит его в буфер обмена. Для копирования нажмите вместо C-w M-w, а для вставки из буфера обмена — C-y. Конечно, можно вместо C-пробел использовать для выделения мышь, но быть может вы такой же мышефоб, как и я? Когда вы выделяете текст мышью, он подсвечивается, а при выделении с помощью комбинации C-пробел этого, по умолчанию, не происходит. Это можно исправить, активировав в главном меню опцию Active Region Highlighting (Transient Mark Mode), которая находится в подменю Options.
Путь к СУТРМ
Ну что ж, думаю, самые основы работы с Emacs вы постигли, давайте же превратим его в СУТРМ , то есть в Самый Удобный Текстовый Редактор в Мире. Во-первых, удалите файл .emacs из вашего домашнего каталога, если он там есть и перезапустите редактор — начнем, как говорится, с чистого листа.
Во-первых стоит рассказать Emacs’у, что мы по умолчанию хотим сохранять наши файлы в кодировке koi8-r. Для этого выберите в главном меню Options->Mule (Multilingual Environment)->Set Language Environment->Cyrillic->Cyrillic-KOI8. Теперь, если хотите, включите подсветку активного участка текста: Options->Active Region Highlighting (Transient Mark Mode) и подсветку парных скобок: (Options->Paren Match Highlighting (Show Paren Mode). Это, пожалуй, все, что лично я доверяю «автоматике» Emacs’а. Сохраните эти настройки, выбрав в меню Options->Save Options, дальше мы будем редактировать конфигурационный файл вручную.
Главным конфигурационным файлом Emacs, как вы уже поняли, является .emacs, находящийся в домашнем каталоге. Он, кстати, представляет собой самый настоящий скрипт на языке Emacs Lisp — именно поэтому его лучше редактировать вручную, тем более что в главном меню Emacs доступно меньше 10 % всех настроек Emacs.
Не кажется ли вам панель инструментов Emacs бесполезной? Мне вот, например, кажется, тем более, что клавиатурные сочетания всех кнопок, находящихся на ней, можно запомнить меньше чем за 10 минут. Для того, чтобы панель не появлялась при запуске Emacs, в .emacs нужно добавить такую строку:
(tool-bar-mode nil)
Истинные минималисты вроде меня могут добавить еще (menu-bar-mode nil) для скрытия главного меню и (scroll-bar-mode nil) для удаления полос прокрутки. К меню всегда можно обратиться с помощью щелчка правой кнопки мыши в буфере при зажатом Ctrl. Кстати, переключаться между буферами можно таким же образом, только вместо правой кнопки используйте левую.
Я знаю, вас раздражают эти C-x C-f и C-x C-s. Давайте же «перевесим» команды открытия и сохранения файла на другие комбинации. Добавьте следующие строки в свой .emacs:
(global-set-key «\C-s» ‘save-buffer) (global-set-key «\C-o» ‘find-file) (global-set-key «\M-f» ‘isearch-forward)
Таким образом мы назначили команды сохранения (save-buffer) и открытия файла (find-file) на C-s и C-o соответственно. Но зачем мы назначили на M-f какой-то isearch-forward? На самом деле это очень удобная функция линейного поиска по тексту, которая по умолчанию привязана к C-s (таким образом, без этой строки мы могли бы ее использовать лишь набрав вручную имя в минибуфере). Для поклонников mcedit можно порекомендовать такую конфигурацию:
(global-set-key [f2] ‘save-buffer) (global-set-key [f1] ‘find-file) (global-set-key [f7] ‘isearch-forward)
Подобным образом можно назначить любую комбинацию для любой функции. Главное, не забывайте обрамлять сочетания клавиш двойными кавычками (к функциональным клавишам это не относится) и ставить перед именами функций апострофы.
Наводим марафет
Вряд ли вас устраивает цветовая схема Emacs, которая установлена по умолчанию, да и шрифты никуда не годятся: латинские одного размера, кириллические — другого. Нужно исправлять ситуацию. Для изменения цветов редактора предусмотрены функции set-face-background и set-face-foreground. Первая отвечает за фон, вторая — за цвет раположенных на нем объектов. Например, в .emacs следующих строк:
(set-face-background ‘default «red») (set-face-foreground ‘default «blue»)
заставит Emacs выводить текст красными буквами на синем фоне (адское сочетание! Не повторяйте этого дома, ну или хотя бы предварительно к окулисту запишитесь). Вместо «red» или «blue» можно использовать цвета вроде «#3743ec», так что откройте палитру в Gimp и не ограничивайте себя всякими «green» и «black». Для изменения цветов меню нужно заменить ‘default на ‘menu.
Я предпочитаю использовать немного другой способ, который потребует значительно меньше телодвижений. Наверняка в вашем домашнем каталоге есть файл с описанием параметров ресурсов X-Window (он обычно называется .Xresources или .Xdefaults). Если его нет — создайте его и внесите в этот файл всего две строки:
Emacs*background: #3d3d3d Emacs*foreground: #e1e1e1
Теперь запустите xrdb ~/.Xresources для обновления параметров ресурсов. После этого и в меню, и в панели инструментов, и в буфере фоном будет «#3d3d3d», а цветом переднего плана (шрифта) - «#e1e1e1». Гораздо удобнее, не правда ли?
Так же дело обстоит и со шрифтами: есть функции set-face-font, работающие таким же образом, как и set-face-background, но удобнее использовать .Xresources. Мне нравится полужирный шрифт terminus:
Emacs*font: -xos4-terminus-bold-r-normal--14-140-72-72-c-80-koi8-r
Для выбора шрифта (а заодно и корректного составления его имени) рекомендую воспользоваться утилитой xfontsel, входящей в комплект X-Window.
Что ж, надеюсь, теперь вам приятнее смотреть на ваш Emacs…
Проверка орфографии
Что еще не помешало бы текстовому редактору? Наверное, проверка орфографии. В Emacs для проверки орфографии используется внешняя утилита ispell. Плюс ко всему существует специальный режим - flyspell-mode (для его работы также необходима ispell), который сделан на манер проверки орфографии в текстовых процессорах: вы печатаете слово, а flyspell сразу же проверяет его. Если такое слово не найдено в словаре, оно выделяется и подчеркивается. Щелкнув на подчеркнутом слове средней кнопкой мыши, вы сможете выбрать нужный вариант из тех, что подобрал flyspell или занести это слово в словарь. Разумеется, для работы flyspell вы должны установить в своей системе пакеты ispell и ispell-ru. Если ispell есть практически в любом дистрибутиве, то с ispell-ru (который содержит русский словарь для ispell) не все так гладко. Если вы не найдете его в своем дистрибутиве, вам придется скачать один из словарей отсюда: http://fmg-www.cs.ucla.edu/geoff/ispell-dictionaries.html.
После этого нужно указать Emacs, чтобы он использовал для проверки орфографии русский словарь. За имя словаря, используемого ispell и flyspell, отвечает внутренняя переменная ispell-dictionary. Очевидно, необходимо установить для нее значение «russian». Есть несколько способов сделать это. Если хотите установить какую-либо переменную только для текущего сеанса, то для этого прекрасно подойдет функция customize-variable. Но если вы захотите, например, всегда использовать русский словарь, то проще прописать значение соответствующей переменной в файл .emacs:
(setq flyspell-dictionary «russian»)
Давайте назначим командам проверки орфографии какие-нибудь простые комбинации:
(global-set-key [f11] ‘ispell-buffer) (global-set-key [f12] ‘flyspell-mode)
Теперь по клавише F12 вы сможете включать/выключать режим проверки «на лету», а по F11 производить пошаговую проверку. Возможно у читателя появится вопрос — а зачем нужно возиться с Emacs, если тот же Vim/Gedit/Kate подходит для удобного редактирования текста практически «из коробки»? Да, но ведь к Vim’у тоже нужно привыкать, а без документации использование Vim сродни ловле черного кота в темной комнате — можно ориентироваться только по звуку. Ну и наконец, если вы являетесь приверженцем Vim, почему бы просто из любопытства не посмотреть на то, как ваши любимые функции реализованы в Emacs? Kate/Gedit конечно же очень просты, однако в них нет и двадцатой части функций Emacs.
Да, Emacs довольно непрост в конфигурировании, но зато настройке поддается абсолютно все!
К сожалению, современной русскоязычной документации по Emacs не существует, есть лишь перевод руководства к уже давно устаревшей 19-й версии от Алекса Отта (см. http://linux.org.ru/books/emacsmanual). Впрочем, разобраться с Emacs можно и без официального руководства, благо теперь вы знаете основы, так что дальше дело пойдет быстрее. Некоторое количество полезной информации можно почерпнуть из Emacs wiki (http://www.emacswiki.org), на которой есть и русскоязычный раздел.
В крайнем случае, если вам что-то непонятно, пишите мне на rc_4096@list.ru.
Эта врезка специально для неутомимых экспериментаторов, которые всегда хотят иметь самые новые версии программ, и при этом готовы мириться с возможными ошибками.
Среди пользователей Vim широко распространено мнение о том, что, дескать, разработка Emacs ведется слишком медленно, поэтому новые версии выпускаются слишком редко. На самом же деле Emacs обновляется каждый день – достаточно посмотреть на CVS.
Emacs с каждым новым релизом содержит все больше и больше модулей: разработчики следят за тем, какие модули пользуются наибольшей популярностью, и стараются включить их в следующую стабильную версию редактора. Да и сами создатели модулей часто проявляют инициативу. Так, например, в 22-ю версию, которая сейчас активно развивается, попали популярные модули ido (см. врезку) и cua, позволяющий использовать стандартные для Windows/MacOS-программ горячие клавиши (кстати, ido и cua – творения одного человека – Kim F. Storm, см. http://www.cua.dk).
В новой версии улучшена поддержка Unicode, появилась новая документация (в том числе и на русском языке). Кроме того, теперь для сборки редактора можно использовать GTK2, что, безусловно, порадует ценителей прекрасного.
Итак, если вы хотите уже сейчас воспользоваться всеми благами Emacs 22, то приготовьтесь к трудностям: рабочие снимки CVS-дерева регулярно никто не выкладывает. А поскольку редактор обновляется каждый день, невозможно точно сказать, соберется у вас сегодняшняя версия или нет.
Если вас это не пугает, то можно приступить к получению CVS-дерева:
export CVS_RSH="ssh" cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co emacs
После завершения этой довольно длительной операции (еще бы, исходные тексты Emacs со всеми включенными модулями занимают около 90 Мб!) можно приступить к сборке:
cd emacs ./configure --prefix=/usr --with-xpm --with-jpeg --with-tiff --with-png --with-gtk make bootstrap make install
Опция --with-gtk говорит о том, что Emacs будет собран с поддержкой GTK2. Опции --with-xpm --with-jpeg --with-tiff и --with-png, в принципе, можно и не указывать – если вам не нужна поддержка соответствующих графических форматов (да, в Emacs можно смотреть картинки!).
Многие специально отключают этот буфер, а зря: никаких неудобств он не создает, а вот кое-какую пользу из него извлечь можно. Содержащийся в нем текст гласит, что его можно использовать для временного хранения какого-нибудь текста или для выполнения Lisp-операций. То есть это простейший интерфейс для Emacs Lisp. Попробуйте, например, ввести такое выражение:
(+ 3 4)
и для перехода на новую строку нажать не Enter, а C-j. Как видите, интерпретатор Elisp выдал ответ: 7. Таким образом, этот буфер можно использовать как продвинутый калькулятор с поддержкой переменных, сложных функций, рекурсии. Если, конечно, привыкните к обратной польской записи и скобкам, принятым во всех диалектах Lisp. Попробуйте еще несколько примеров:
(- (+ 5 9) (- 4 9)) (* (+ (/ 90 10) (+ 2 3)) (sqrt 4)) (setq g 9.8) (* 5 g)
Действие | Клавиатурная комбинация | Название функции |
---|---|---|
Создать/Открыть файл | C-x C-f | find-file |
Сохранить буфер в файл | C-x C-s | save-buffer |
Сохранить буфер под новым именем | C-x C-w | save-with-newname |
Сохранить все измененные буферы в файлы | C-x s | save-some-buffers |
Переключиться в другой буфер | C-x C-b | switch-to-buffer |
Разделить окно редактирования и открыть другой буфер | — | switch-to-buffer-other-window |
Закрыть активный буфер | C-x k | kill-buffer |
Установить метку | C-<пробел> | set-mark-command |
Вырезать выделенный текст | C-w | kill-region |
Скопировать выделенный текст | M-w | copy-region-as-kill |
Вставить скопированый/вырезаный текст | C-y | yank |
Разделить окно по горизонтали | C-x 3 | split-window-horizontally |
Разделить окно по вертикали | C-x 2 | split-window-vertically |
Поиск текста с подсветкой всех найденных участков | C-s | isearch-forward |
Отменить последнюю операцию | C-x u | undo |
Выйти из минибуфера | C-g | keyboard-quit |
Закрыть Emacs | C-x C-c | save-buffers-kill-emacs |
Думаю, после прочтения статьи приверженцы редактора Vim очень хотят услышать ответ на вопрос, чем же все-таки Emacs лучше, чем Vim.
Около полугода назад у меня были установлены оба этих редактора, и оба казались мне жутко неудобными. Для правки конфигурационных файлов я предпочитал использовать nano, а для редактирования исходных текстов – mcedit. Так и продолжалось, пока я не стал изучать документацию по Vim и Emacs. Обнаружилась интересная вещь – к Vim в его первоначальном виде привыкнуть гораздо легче, да и к сносному редактированию чего угодно он готов сразу же. Emacs же требует настройки любой мелочи, зато его можно превратить хоть в nano, хоть в IDE Visual C++.
По количеству расширений Emacs оставляет Vim далеко позади. Да и функциональность Vim’овских скриптов по сравнению с расширениями Emacs оставляет желать лучшего. Так, например, Vim’овского аналога Emacs Code Browser (ecb) и LaTeX-preview мне найти так и не удалось, как не удалось найти и других, не столь значимых для меня вещей. Emacs лучше интегрируется со сторонними приложениями: попробуйте заставить Vim работать с Maxima или Gnuplot. В основном это заслуга Emacs Lisp, на котором очень просто дописываются те функции, которых вам не хватает.
Если редактор вам нужен только для правки конфигурационных файлов, то вам одинаково подойдут и Emacs, и Vim. Если же вы намерены получить от текстового редактора нечто большее, то просто установите и тот, и другой, и вы сами без труда найдете эти самые N причин. Ну а если вы не хотите тратить время на чтение документации и настройку «какого-то там текстового редактора», то может быть стоит попробовать jEdit?
Несмотря на функцию автодополнения, вас наверняка раздражает отсутствие в Emacs обычного диалога открытия файла. Но ведь будь в Emacs такой диалог, любители делать-все-только-с-клавиатуры справедливо бы возмутились. Тем не менее, к Emacs есть отличное дополнение, делающее открытие файла и переключение между буферами невероятно простым и приятным. Называется оно ido, и, как и все дополнения к Emacs, представляет собой обычный Elisp-скрипт. Получить ido.el можно на сайте разработчика http://www.cua.dk. Давайте рассмотрим установку этого дополнения.
Для активации и использования функций любого дополнения Emacs, его нужно поместить в директорию автоматической загрузки (load-path). Рекомендую вам создать в своем домашнем каталоге директорию emacs, в которой будут располагаться дополнения. Скопируйте ido.el в ~/emacs/, а в .emacs добавьте следующие строки:
(add-to-list ‘load-path «~/emacs») (require ‘ido)
Первая строка добавляет ~/emacs в список директорий автозагрузки, вторая говорит о том, что при запуске редактора необходимо загрузить файл ido.el. Это значит, что теперь в редакторе стали доступны функции дополнения ido.el – в данном случае их имена начинаются с ido-. Однако для активации дополнения этого недостаточно, нужно еще включить ido-режим:
(ido-mode t)
Слово «t» в различных диалектах языка Lisp означает «true». Тем самым вы включили дополнение, и теперь можете посмотреть, как будет огранизовано открытие файла (нажмите C-x C-f). Отныне к этой комбинации привязана функция ido-find-file (это произошло после включение режима ido-mode). Для перемещения между директориями в ido-find-file можно использовать кнопки-стрелки, для выбора файла/директории – Enter, для выхода в родительский каталог – Backspace. Намного удобнее, чем обычный find-file, не правда ли? Подобным же образом теперь работает и переключение между буферами (C-x C-b).
Если вы будете постоянно пользоваться этим дополнением, логично было бы переназначить функции ido-find-file и ido-switch-buffer на более удобные комбинации:
(global-set-key [f1] ‘ido-find-file) (global-set-key [f11] ‘ido-switch-buffer)