Emacs с удобствами
версия 0.9 (от 2 июня 2004 года)
Содержание
- Необходимое введение
- Компиляция в Emacs
- Краткий курс ECB
- CVS и Emacs
- Примеры
- Моя хирагана для Emacs
- Благодарности
Авторские права на этот документ принадлежат Антону
Кульчицкому (©2004, Антон Кульчицкий). Этот документ
может распространяться и изменяться в соответствии с
требованиями GNU Free Documentation License, Version 1.2, или
любой более поздней версией этой лицензии, опубликованной Free
Software Foundation, без неизменяемых разделов, без текстов на
обложке и подложке. Текст лицензии доступен по адресу
http://www.gnu.org/copyleft/fdl.html.
1. Введение
Недавно я написал статью Точки Emacs
в которой попытался рассказать о редакторе Emacs и о своих
методах работы в нем. Эта новая статья задумана как продолжение
"точек", но построена на несколько иных
основах. Если "точки" — это рассказ на тему
"как, ребята, я здорово устроился в Emacs", то этот
документ я надеялся будет гораздо больше похож на документацию,
пусть с авторскими особенностями (как удачными, так и не
очень). То есть я постараюсь осветить вопросы полнее,
подробно рассказать об источниках (где что прочитать).
Однако, одна вещь останется без изменений: я, как и в прошлый
раз, буду рассказывать только о вещах, которые мне интересны и
которые я использую.
Несколько слов об обозначениях. В отличие от первой статьи,
здесь я буду использовать только стандартные обозначения. Так
'C-x' обозначает одновременное нажатие на клавишу
'Ctrl' и клавишу 'x' (не букву, которая может быть другой в текущей
раскладке). Если же мы пишем 'C-x s', то это значит нажатие
'C-x', а затем уже нажатие на клавишу 's'. Другое стандартное
обозначение включает в себя мета клавишу. Обычно, эта клавиша
привязана к 'Alt' и 'Esc', но по разному. Так, например, 'M-q'
обозначает либо одновременное нажатие на 'Alt' и 'q', либо на
последовательное нажатие сначала на 'Esc', а затем, после отпускания
"эскейпа", на 'q'. Наконец, в "точках" я ввел
двойную мета последовательность. Когда я два раза нажимаю на 'Esc', а
потом на некоторую клавишу. Выяснилось, что в отличие от других
комбинаций, эти комбинации никем не заняты, но при том не менее удобны
(а в смысле запоминания и напряжения пальцевых мускулов даже более
удобны). Вообще говоря, для пользователя как бы оставлены комбинации с
'C-c', но это на самом деле не совсем так. Почти все режимы и моды,
которые вы возьмете со стороны содержат команды с 'C-c'. Так вот,
такие свои комбинации клавиш я пишу с 'MM'. Например, 'MM-u'
обозначает либо "два раза на 'Esc', потом на 'u'", либо, что
тоже самое, только более общо, "один раз 'Esc', потом
'M-u'".
Как верно замечают фанаты редактора Vim, в Emacs просто
бешенное количество привязок и "распальцовок", которые
невозможно держать в голове все, особенно если они выглядят как 'C-c
M-C-s h i t'. Они лишь не говорят, что это, в общем, не нужно. На
самом деле каждый пользователь создает свою собственную хирагану,
несколько важных комбинаций, которые необходимо помнить, а остальные
просто не использует. Этой хираганы хватает за глаза. Я призываю
каждому пользователю разработать свой "алфавит" для
редактора, и в качестве примера я привожу в последней главе многие из
тех комбинаций, которые использую сам. Кроме того, все мои привязки
стараются следовать и другому важному принципу: да здравствует
наименьшая нагрузка на суставы пальцев и кисти. :) На мой вкус,
пропагандируемая мной комбинация 'MM-клавиша' полностью решает эту
проблему. При этом все преимущества Emacs остаются.
В этой статье речь пойдет о компиляции в Emacs, ECB
(Emacs Code Browser) и работе с CVS в Emacs. Что касается CVS, то в
свое время эта система настолько захватила меня, что я перевел под CVS
не только все свои программы, но также свою домашнюю страницу в
интернете, все свои текстовые документы и все свои статьи, инструкции
и прочее, что набиралось в LaTeX. Если вы еще незнакомы с какой-нибудь
системой контроля версий, то очень настоятельно советую это
сделать. Эффект от перехода будет колоссальным, даже если большинство
этих проектов имеет лишь одного разработчика — вас. Основное,
что я получил от такого перехода — это возможность редактировать
программы и документы на любой машине, будь это дом, работа или
незнакомый десктоп, одолженный на час: лишь бы была CVS и выход в
интернет. Все изменяется централизованно и вы не плодите версий и не
морочите себе голову с их синхронизацией. Второе: вы всегда можете
проследить изменения, которые вы вносили. Третье: вы можете
централизовано организовать архивацию ваших документов. Четвертое: вы
не храните уймы временных файлов и не архивируете их. И так далее и
тому подобное.
Прежде чем приступать к делу, хочется немного еще
поразглагольствовать и морально себя подготовить к трудному писанию
самой статьи. Надеюсь, читатель не будет сильно раздосадован, что я не
перешел к делу немедленно, а собираюсь немного заняться прелюдией к
делу. Если же читатель таки раздосадован, то прошу читателя пропустить
все дальнейшее введение и приступить немедленно к чтению технического
материала. Я же пока продолжу философию.
Итак, чем этот редактор хорош, так это тем, что в нем
ничего не устаревает. Кто помнит книги начала девяностых о
персональных компьютерах и системы DOS? Кто сейчас серьезно будет
учиться по документации к Windows 95? Но совсем другое дело
изучать UNIX, TeX или Emacs по старым книгам. При этом никто всерьез
не будет говорить, что, мол, UNIX, TeX или Emacs — программы
устаревшие и ими не стоит пользоваться. Более того, если по примеру
рейтингов в спорте или в музыке меня бы спросили, какую из
прикладных систем я бы назвал среди лучших за всю историю
развития программного обеспечения, то мой ответ был бы: TeX и Emacs. Я
бы их сравнил с Elvis Presley и Beatles в рок-н-ролле или с Каримом
Абдул Джабаром и Майклом Джорданом в баскетболе. Но в отличие от
людей, срок жизни программ и текстов не ограничен биологическими
причинами. В результате в информатике и Elvis и John Lennon все еще
поют столь же мощно как и ранее. Пусть базовый TeX — этакий
корень большого дерева — больше и не будет развиваться, как
решил его создатель Дональд Кнут. Однако, продолжают развиваться его
многочисленные побеги: LaTeX с пакетами, всевозможные дорогие и
полубестолковые аналоги Scientific
WorkPlace или бесплатный, но толковый GNU TeXmacs.
Это можно сказать с еще большим основанием о Emacs. Он
популярен, он везде доступен и он невероятно удобен для тех, кто его
знает (для тех кто не знает, существует другой замечательный редактор
Vim с иной базовой философией и с непримиримыми фанатами, явлением
свойственным Vim не из-за его особенностей каких-то, а скорее из-за
его относительной молодости. Впрочем, они не столь молоды, если иметь
в виду еще старичка vi, так что я уподобил бы Vim в рамках той же
аналогии Rolling Stones). Наконец, Emacs интенсивно развивается на
двух конкурирующих ветках... Так, а вел я это к тому, что писать о
Emacs легко и приятно: такие статьи живут довольно долго. Например, в
своих статьях я иногда привожу ссылки на довольно старые
материалы. Однако, эти материалы все еще ничуть не устарели и будут,
верю, полезными для читателя.
Напоследок во введении хочу обратить внимание на то, что
в этой статье у Emacs нигде нет меню на моих скриншотах. Оно, на мой
вкус, ненужно и лишь занимает место. Однако, меню всегда доступно по
правому клику мышки с прижатой клавишой Ctrl. Об этом, как ни странно,
мало кто догадывается.
Emacs создан программистами для программистов (что не отменяет его
популярности и в иных сообществах). Тогда он просто обязан
поддерживать обычные программистские рутинные вещи, такие как
компиляция программ. И действительно он это делает. Для дальнейшего
изложения эта глава будет очень важна, это будет нужно, например, для
рассказа о ECB.
Итак, как вы уже знаете, у Emacs есть буферы. Буферы можно условно
поделить на служебные и... неслужебные, простые. Названия служебных
буферов обычно начинается и кончается звездочкой. Деление это более
чем условно, так как на самом деле дело не в буфере и его названии, а
в моде, в которой он функционирует. Скажем, буфер calendar не
служебный (в названии нет звезд), но ведет себя совершенно необычно
для простого буфера.
Итак, допустим у вас в редакторе открыт буфер с вашей замечательной
программой, скажем, на C. Кроме того, у вас в той же директории
расположен файл для программы make (например, Makefile). Можно не
пользоваться Emacs для компиляции (так делают многие, и это не плохо,
но речь не о том). Можно запустить оболочку в отдельном окне
(например, xterm), переключиться в нее и набрать "make". Далее увидеть
список с ошибками и переключиться обратно в редактор, чтобы их
исправить. Затем снова в оболочку и снова компилировать. Это легко, но
в Emacs существуют другие пути, которые могут оказаться для многих
более эффективными.
Решение компромиссное — это запустить в отдельном буфере
(служебном) оболочку. В Emacs доступно две оболочки: shell и
eshell. Мне кажется, вторая является более удобной, пусть небыстрой. В
этой оболочке можно снова набрать "make" и дело повторяется. Только
переключаться надо не между отдельными приложениями, а между буферами
редактора. Впрочем, если работа идет в терминальном режиме, а не в X
Window, то преимущество такого метода считается очевидным (хотя не так
уж трудно скакать между терминалами по 'Alt-F1', 'Alt-F2' и так далее).
Наконец, решение которое рекомендуется. Надо набрать команду 'M-x
compile' и Emacs должен запустить "make" сам. На самом деле по
умолчанию запускается "make -k", где ключ "-k" заставляет make
продолжать после ошибки так долго как только возможно, чтобы вывелось
как можно больше ошибок. По умолчанию make прекращает работать после
первой же ошибки. И всю информацию, которую раньше бы вы читали в
консоли, Emacs зашвыривает в служебный буфер *compilation*.
Преимущества этого метода в особенностях буфера *compilation*. Вообще
говоря, если у вас ошибки сгенерированы компиляторами GNU или другими
более-менее стандартными компиляторами (вроде icc, но я не проверял),
то нажатие на ошибке Enter в этом буфере должно вас выбросить на
строку в буфер, где эта ошибка случилась. Далее, во время компиляции
во всех других буферах Emacs в статусе будет светиться
"Compilation". Действительно, для компиляции вовсе не обязательно,
чтобы буфер *compilation* был видим. Более того, вы можете продолжать
редактировать пока идет компиляция. Когда (и если) компиляция
закончилась, то статус меняется на обычный. Чтобы прервать компиляцию,
надо набрать 'M-x kill-compilation'. На самом деле это очень полезная
команда, особенно при работе с TeX.
Естественно, вместо "make -k" можно приписать к компиляции любую
команду. Которая даже может быть разной для документов разного типа
(не советую).
Маленький итог. У меня все это настроено следующим образом. Команды
'M-x compile' и 'M-x kill-compilation' привязаны к комбинациям клавиш
'MM-m' (от make) и 'MM-k' (от kill) соответсвенно. По команде 'M-x
compile' сначала сохраняется весь буфер (мало ли что случится),
вызывается "make all", а когда все закончится, выводится надпись в
минибуфер, что все кончилось. Вывод информации настроен так, чтобы
буфер *compilation* прокручивался по мере процесса компиляции, чтобы
видеть что происходит. Это пока все. Остальные настройки этого режима
будут связаны с ECB. А теперь кусок из .emacs в котором все это
настраивается:
(setq compilation-scroll-output 1)
(global-set-key (kbd "\e\em"
) 'user-save-and-make-all)
(global-set-key (kbd "\e\ek"
) 'kill-compilation)
(defun user-save-and-make-all ()
"save and call compile as make all"
(interactive)
(save-buffer)
(compile "make all"
)
(message "make all executed!"
))
У буфера *compilation* есть много дополнительных
особенностей и способов с ним работать. Обо всех этих особенностях я
советую прочитать в документации (можно на русском, например в
переводе Alex Ott'а).
ECB расшифровывается как Emacs Code Browser, а
переводится примерно как Имаксовый обозреватель кода. В итернете у ECB
существует страница http://ecb.sourceforge.net на
Sourceforge. Задачей этой пришлепки на Emacs является придание
последнему формы интегрированной среды разработки программ (и не
только) с возможностью легко маневрировать в длинном коде, видеть его
макро структуру на разных уровнях, легко переключаться между буферами
с текстами программы, управлять процессом компиляции, видеть дерево
директорий и легко по нему перемещаться и другое, все что может
облегчить процесс писания программ.
На самом деле ECB дает возможность работать не только с
программами, но и с документами. Я использую его даже при написании
текстов для домашней страницы из-за удобства перескоков между буферами
и работы с деревом директорий. Впрочем, ECB прекрасно справляется с
обзором структуры документов на LaTeX. На самом деле не сам ECB, а
пакеты, которые он использует.
Установка
Установка ECB может оказаться для некоторых
трудной. Впрочем, сейчас все очень упростилось. Для начала стоит
сказать, что установка ECB для GNU Emacs и XEmacs несколько
отличается. Я имею опыт работы только с GNU Emacs и поэтому кратко
опишу инсталляцию ECB именно для этой версии редактора. Впрочем, судя
по всему, для XEmacs все происходит проще (если даже ECB там не стоит
по умолчанию).
Вот краткая инструкция по установке ECB на GNU Emacs:
1 Загрузите и распакуйте где-нибудь ECB архив. Последняя версия
всегда доступна с официальной
страницы.
2 Кроме этого вам надо установить (если они еще не
установлены) сначала следующие пакеты: semantic, eieio и speedbar
причем новейших версий (для точных требований надо прочитать файл
README). Впрочем, есть путь установить сразу все эти три пакета (и еще
пару бонусов) и не мучиться. Для этого надо загрузить лишь CEDET. Это
коллекция инструментов для разработки под Emacs. Эта коллекция
содержит все что необходимо для правильной работы ECB. Следует ставить
именно CEDET, если у вас нет предубеждения против бета версий, так как
CEDET на момент написания этой статьи был доступен лишь в своих бета
версиях. Скачать пакет можно с сайта CEDET. Врочем, как
всегда, есть анонимный доступ к CVS репозиторию. Будем считать, что вы
загрузили и распаковали архив последней версии CEDET в качестве
второго шага установки.
3 Чтобы установить CEDET необходимо запустить "make"
(это обязательно должен быть GNU make) в директории которая
образовалась после разворачивания архива (если надо что-то более
сложное, например у вас несколько версий Emacs, читайте README). Потом
надо под рутом скопировать всю директорию в которой вы все и делали
туда, где находятся ваши пакеты для Emacs. Это может быть
"/usr/local/share/emacs/" или как у меня на рабочей машине
"/usr/local/emacsscr/" и так далее. Например, вы можете использовать
команду
su -c "cp -R cedet-1.0beta2b /usr/local/emacsscr/"
Наконец надо "прописать" CEDET в .emacs. У меня это сделано так:
(setq semantic-load-turn-useful-things-on t)
(load-file "/usr/local/emacsscr/cedet-1.0beta2b/common/cedet.el"
)
4 Теперь надо заняться непосредственно ECB. Зайдите в
директорию с ECB и отредактируйте файл Makefile, который содержит
ошибочный путь к CEDET. Для этого найдите переменную CEDET и вместо
виндузятного пути, который там есть, наберите свой. Для моей рабочей
машины я должен был бы написать
CEDET=/usr/local/emacsscr/cedet-1.0beta2b
После чего запустите "make". На самом деле этот шаг не необходим. Это
всего лишь бинарная компиляция ECB. Он может работать и без
этого. Однако, этот шаг очень рекомендуется для более быстрой работы.
5 Наконец, надо скопировать ваш новый ECB туда же, куда
вы прежде скопировали последнюю версию CEDET. Для меня это команда
вроде:
su -c "cp -R ecb-2.24 /usr/local/emacsscr/"
И прописать ECB в .emacs. У меня это выглядит так:
(add-to-list 'load-path "/usr/local/emacsscr/ecb-2.24"
)
(require 'ecb)
Теперь все должно заработать. Естественно, все эти
пакеты (CEDET, ECB и так далее) можно устанавливать локально в своей
родной домашней директории. Тогда рутовый пароль не нужен.
Первое что надо сделать
Первое что надо сделать — это настроить ECB. Это
надо сделать обязательно! Все настройки надо делать при помощи
автоматической функции ECB, а не прямым редактированием .emacs. Знаю,
многим это не понравится. Но все же это единственный нормальный путь,
чтобы все работало. ECB автоматически добавляет код в ваш .emacs, в
самый хвост его, и комментирует. Ручное редактирование возможно, но
лучше воспользуйтесь автоматом. Для настройки надо запустить команду
"M-x ecb-customize". В основном окне покажутся кнопочки с настройками
как показано на картинке.
Как и всегда в ECB по умолчанию переходы в директории и
разделы по ссылкам осуществляются средней кнопкой мыши или нажатием
клавиши Enter. Итак, что надо настроить в первую голову. Чтобы указать
какую-то конкретную установку, я буду писать в стиле:
группа: такая-то, опция: такая-то. Начнем.
Во-первых, в новой (на момент написания статьи) версии
2.24 была добавлена опция для автоматического определения пустых
директорий. Не знаю что это такое и знать не хочу, так как с этой
опцией у меня не работает окно с директориями. Когда это исправят я не
знаю, но сейчас у меня лечится это лишь полным отключением этого
нововведения. Давайте отключим это в первую очередь. Для этого надо
переключить группа: Ecb Directories group, опция: Ecb Prescan
Directories For Emptyness. Надо установить здесь off. Затем надо пойти
вверх окна и нажать средней кнопкой: Save For Future Sessions. Эта
кнопка должна нажиматься после всех настроек (можно после изменения
сразу нескольких параметров, а не каждого), чтобы опции сработали для
следующих запусков Emacs. Не надо забывать, что сами опции сработают
лишь только после перезапуска редактора.
Следующее, что надо сделать, на мой взгляд, это
отключить "подсказку дня" при каждом старте ECB. Для этого надо
установить в off переключатель: группа: General, опция: Ecb Tip Of The
Day.
Я бы рекомендовал изначально поменять разбивку по
умолчанию Emacs на окна. Если у вас рабочая область достаточно
высокого разрешения, то я бы рекомендовал, исходя из своего долгого
опыта работы с ECB, раскладку left1. Это устанавливается следующим
образом: группа:Layout, опция: Ecb Layout Name. Надо набрать имя
разбивки. Например, left1. Советую поэкспериментировать самим, если
left1 вам кажется неудобной. Все примеры из этой статьи сделаны с этой
разбивкой.
Очень не советую запускать ECB автоматически при каждом
старте Emacs. Впрочем, если все же решите, что это вам надо, то
смотрите группа:General, опция:Ecb Auto Activate.
Наконец, я советую сразу настроить окно для
компиляции. Это делается в группе опций Layout, подгруппе ECB
compilation (это последняя в списке там). Все дальнейшие настройки
будут связаны только с этой подгруппой.
Во-первых, не советую оставлять окно для компиляции
шириной во весь редактор, как это сделано по-умолчанию. Если у вас
экран больше 800x600, то скорее всего вам подойдет более узкий
вариант: окно компиляции шириной в окно редактирования (вы это видите
на всех скриншотах этой статьи). Для этого надо переключить опцию Ecb
Compile Window Width в значение Width of edit-window.
Далее, советую выставить высоту окна. Мне нравится
высота в 10 линий. Заметьте, что окно может расширяться когда вы
находитесь в нем (не забывайте команду 'C-x o', которая перебрасывает
вас в соседнее окно в Emacs). Для того, чтобы поменять высоту зайдите
в опцию Ecb Compile Window Height.
Как я уже говорил, окно компиляции может увеличиваться,
если это необходимо. Это управляется опцией Ecb Compile Window
Temporally Enlarge. Я советую значение After selecting the compile
window. Которое расширяет окно компиляции, если вы в него
перешли.
А вот то, как будет увеличиваться окно компиляции при
переходе в него определяется в опции Ecb Enlarged Compilation Window
Max Height. Я использую значение Compute best height, которое обычно
работает как надо.
Напоследок стоит привязать комбинацию клавиш для быстрой
активации ECB. У меня все привязано к 'MM-E'. То есть так:
(global-set-key (kbd "\e\eE"
) 'ecb-activate)
На этом можно с настройками закончить. Я советую
почитать документацию и поэкспериментрировать.
Важное об окне компиляции
Не надо думать, что окно компиляции означает лишь вывод
диагностики. На самом деле вы можете сами перечислить какие окна
трактуются ECB как окна компиляции, то есть окна, которые при
указанных настройках будут располагаться под окном редактирования в
узеньком, саморасширяющимся когда надо окне. Для того, чтобы добавить
или убавить такие окошки надо отредактировать список буферов в группе
настроек Layout, подгруппе ECB compilation, опции Ecb Compilation
Buffer Names. Отредактируйте эту опцию, если установки по-умолчанию
вас не устраивают. Заметьте, что *eshell* относится именно к таким
буферам (это мне показалось очень удобно!).
Кстати, запуск eshell уже привязан в ECB к комбинации 'C-c . e'. Но я
все же использую свою собственную 'MM-S' привязку для этого (у меня
далеко не всегда активирован ECB, а встроенной оболочкой я пользуюсь
часто).
Давайте еще посмотрим, как помогает окно компиляции
перепрыгивать на ошибки в коде. На рисунке видно, как в окне
компиляции горит красным ошибка (я специально удалил точку с запятой
для демонстрации). Курсор уже стоит на нужной строке: это произошло
после перехода в буфер с диагностикой (я использую стандартное 'C-x
o') и нажатие Enter на ошибке (красном сообщении). Если даже файл не
открыт в редакторе, то он откроется и курсор запрыгнет на нужную
строчку. Единственное что жалко, так это то что такой вот попрыгун не
работает при компиляции файлов LaTeX.
Остальные прелести этого окна, думаю, вы узнаете методом
проб (может быть даже без ошибок).
Заключение
"Ага!" — скажет какой-нибудь читатель: "ты
рассказал как установить и настроить этот ECB, но не рассказал как в
нем работать". И правда. Я почти ничего об этом не рассказал. На самом
деле и рассказывать уже нечего: пробуйте сами. Лишь несколько основных
рекомендаций: (1) средняя кнопка входит внутрь, раскрывает или
локализует (2) если прижать Shift и Ctrl при клике мыши, то много
интересного может произойти (может обновиться экран, например) (3)
правая кнопка вызывает контекстное меню (в каждом окне свое), которое
особенно любопытно в окне с методами. Например, вы можете фильтровать
отображаемые классы или их методы в коде C++ по их доступности. Можно
показать только public методы, например. Любопытно еще то, что в ECB
меню включены даже команды для работы с CVS.
Теперь в путь, дорогой читатель, в путь. Самое главное сказано и,
надеюсь, сделано. И как всегда много интересного есть в
документации.
4. CVS и Emacs
CVS — это система контроля версий ваших документов. Это по сути
своей стандарт де факто для распределенной разработки программ в
сообществе. Не смотря на то, что существуют другие программы для того
же самого, даже такие превосходные как gnu-arch; даже не смотря на то,
что сам Линус Торвальдс использует BitKeeper (ну, он вообще никогда не
тяготел к аскетизму — что только на пользу конечным
пользователям); не смотря на то, что сам Майкрософт имеет свою систему
VSS, все равно CVS настолько доминирует, что, пожалуй, вообще
невозможно найти такую машину в мире UNIX, где бы он не был установлен
(пусть даже пользователь об этом и не знает). В общем, как бы то ни
было, но похоже CVS — это навсегда.
В связи с вышесказанным было бы наивно думать, что в
Emacs не предусмотрена работа с CVS. И действительно,
предусмотрена. И, в частности, предусмотрена легендарной личностью
Пером Седерквистом (Per Cederqvist), который прославился тем, что его
именем называется официальная документация по CVS. Так что, если вы
запускаете info CVS то получаете Седерквиста. На мой взгляд и
руководство и книга Седерквиста не самые лучшие, хотя возможно и самые
полные. Кстати, существует русский
Седерквист в переводе Алексея Махоткина. Я лично предпочитаю книгу
Open Source Development with CVS, написанную Moshe Bar и Karl Fogel. К
сожалению я не знаю есть ли у нее русский перевод. Скорее всего
нет. Для меня это настольная книга и я считаю ее лучшей покупкой
прошлого года. Впрочем, как легко видеть, самая свежая версия этой
книги всегда доступна онлайн.
Однако, давайте думать, что читатель давно знаком с CVS
и пользуется этой программой часто. Рассмотрим, что предлагает
фронтенд от Седерквиста, который называется pcl-cvs. Во всех более или
менее новых версиях Emacs этот пакет установлен по
умолчанию. Использовать его очень легко. Предположим, что вы
редактируете файл в рабочем каталоге. Теперь вы хотите внести
изменения в репозиторий. Для этого сначала надо перейти в cvs моду при
помощи команды 'M-x cvs-update'. В результате вы получите список
файлов, которые были обновлены из репозитория (если репозиторий
менялся), которые были вами отредактированы и отличаются от версий
репозитория (метка Modified) и файлов в рабочей версии, которые
неизвестны репозиторию (метка Unknown). Кстати, pcl-cvs умно фильтрует
свои сообщения. Так, вы не получите резервные или системные файлы в списке
неизвестных. Пример запуска этой команды приведен на рисунке.
Кстати, если вы решите пользоваться Emacs для работы с
CVS, то конечно надо привязать горячую клавишу для запуска
'cvs-update'. Кроме того, я бы посоветовал несколько усовершенствовать
вызов этой функции. Дело в том, что cvs-update сама по себе нуждается
в текущей директории. Я заставил ее запускаться по 'MM-u' в текущей
директории при помощи следующих команд в .emacs:
(defun user-cvs-update ()
"save and call pcl-cvs function cvs-update"
(interactive)
(save-buffer)
(cvs-update "."
nil)
(message "pcl-cvs update executed!"
))
(global-set-key (kbd "\e\eu"
)'user-cvs-update)
Так что на скриншоте вы видите результат запуска именно этой
функции. Чтобы заслать ваш замечательный файл в репозиторий, надо
выполнить команду commit. Нетрудно запомнить, что достаточно просто
курсором дойти до нужного файла и нажать кнопку 'c'. Процесс пойдет:
откроется дополнительное окно в котором вас попросят ввести
комментарий к данному добавлению. После введения комментария надо
набрать 'C-c C-c'. Не забывайте, что вновь возникшие окна легко
убивать при помощи 'C-x 0'.
Если вам надо сделать какую-либо операцию сразу с
несколькими файлами, то нужно выделить группу. Файл выделяется
клавишей 'm' (от "mark"). Развыделяется при помощи клавиши 'u'
("unmark"). Добавить файл или выделенную группу в репозиторию можно
при помощи клавиши 'a' ("add"). Клавиша '=' вызывает diff. Посмотреть дерево
можно при помощи '+'. Убрать буфер с глаз долой можно при помощи
'q'. Кстати, при описанных настройках 'MM-u' вызывать в cvs буфере не
стоит (бесполезно). Для того, чтобы в csv буфере вызвать update, надо
вместо этого набрать просто 'M-u'.
Не нужно думать, будто это единственный фронтенд к
Emacs для работы с cvs. Но, говорят, он самый удобный. На самом деле
ECB тоже предоставляет некоторые сервисы для работы с CVS. Мне они не
очень пока приглянулись, так как основаны на меню. Но "раз звезды
зажигают, значит это кому-нибудь нужно". На рисунке вы видите
контекстное меню для окна директорий. Чтобы его вызвать надо кликнуть
правой кнопкой на нужной директории. Как я понимаю, ECB видит
директорию CVS в рабочей директории и делает выводы. Подобные меню
доступны и при кликах на отдельных файлах. Там есть очень удобные
опции, которые могут оказаться полезными вне зависимости от того,
используете ли вы pcl-cvs (чует мое сердце, что ECB так вызывает
pcl-cvs).
5. Примеры
Эта глава посвящена в основном примерам использования
Emacs с описанными в этой статье вещами. По сути это просто серия
скриншотов с комментариями.
Пример 1. Моя домашняя страница
Моя домашняя страница управляется CVS, как я уже и
говорил во введении. Все это располагается на дружественном мне
сервере и я в любой момент могу вносить правку. Страницу я всегда
редактирую с помощью связки Emacs+ECB. Вообще говоря, у меня обычно
включен html-helper-mode, но я все больше склоняюсь к отказу от него,
так как иногда он начинает беспощадно тормозить. В принципе он мне не
нужен, так как я пользуюсь очень ограниченным арсеналом HTML, причем
многое у меня привязано к быстрым клавишам. В дальнейшем страница
переносится к моему хостеру при помощи программы gftp.
Пример 2. Удаленная работа в Emacs
Очень экзотический пример. На самом деле я удаленно
почти никогда не работаю в ECB, тем более в терминале, где мышь не
работает и надо помнить все клавиатурные привязки для ECB. Я установил
ECB и привел этот пример только для того, чтобы показать что все
работает и в текстовой моде, и то, что все работает под AIX не хуже
чем под GNU/Linux, и то, что ECB прекрасно встает локально (у меня нет
рутовых прав на этой машине). И то, что фортрановский код меня уже
утомил :).
Пример 3. Eshell в окне компиляции при активированном ECB
'MM-S' запускает eshell, потом 'C-x o' переходит в
него. Наконец, команда "ls -al" дает развернутый список всех файлов в
директории. При этом ECB раскрывает окно ровно настолько, чтобы был
виден результат последней команды. Переход назад в окно редактирования
(снова 'C-x o') уменьшит размер окна компиляции до заданных у меня 10
строк.
6. Моя хирагана для Emacs
Это приложение к статье со списком введенных мной
команд, которые я использую очень часто и которые всегда в
голове. Безусловно, у меня также на стенке висит шпаргалка для
специальных мод (calendar, cvs). Кроме этих команд, я использую совсем
небольшой набор команд из стандартного набора. Вот большая часть из
них (только что первое приходит в голову): 'C-x C-s',
'C-x b', 'C-x o', 'C-x 0', 'C-x 1', 'C-e', 'C-a',
C-d', 'C-x (', 'C-x )', 'C-x e', 'M-q', 'C-s', 'M-$', 'C-h', 'C-@',
'M-w', 'C-w', 'C-y', 'M-y'. И в общем, это все, что использую из
стандартных команд. Может забыл какую, тогда потом вставлю. Как
видите, это все команды, которые почти никогда не требуют сложных
"распальцовок" (когда нажимается три и более клавиш) или длинных
последовательностей нажатий (максимум две, но чаще одна).
Следующие таблицы более обширны. Они включают в
себя все комбинации типа 'MM-', которые я пропагандирую.
Глобальные привязки
Комбинация |
Значение |
|
|
MM-l |
Переход на строку с номером |
MM-m |
Сохранение файла и компиляция (от make) |
MM-k |
Убить процесс компиляции |
MM-u |
Сохранение и переход в CVS окно, cvs-update |
MM-c |
Запуск календаря и записной книжки |
MM-/ |
Сохранить в стеке текущую позицию и прыгнуть в
сохраненную ранее (некий аналог pushd без параметров в
оболочке, применяется как упрощенная процедура для сохранения
текущей позиции в регистрах, чтобы потом вернуться обратно) |
MM-Shift-/ |
Сохранить в стеке текущую позицию (аналог "pushd ."
в оболочке) |
MM-S |
Запуск оболочки eshell |
MM-E |
Активировать ECB |
Привязки к моде LaTeX (используется соответствующий
hook, привязки указаны не все, а лишь те, которые я использую чаще всего)
Комбинация |
Значение |
|
|
MM-( |
Вставка "\left(" |
MM-) |
Вставка "\right)" |
MM-[ и т.д. |
Аналогичные вставки для скобок "[", "]", "<", ">",
"\{", "\}", ".". |
MM-1 |
Вставка окружения equation |
MM-2 |
Вставка окружения multline |
MM-t |
Вставка "\texttt{}' |
MM-e c |
Вставка окружения cases. Вообще, любая команда
вида 'MM-e x' вставляет окружение, привязанное к клавише 'x'. К
таковым относятся, например, окружения (e)quation, (m)ultline,
(c)ases, (f)igure, e(n)umerate, (t)abular и так далее. |
Есть еще привязки к моде helper-html, но их совсем мало
(может быть пока) и они не очень универсальны, чтобы их приводить в
этой статье.
Как видите, не так много комбинаций клавиш используется
в реальной жизни. Кроме этого, все эти привязки очень легко
запоминаются и не нагружают пальцы рук и ног. Безымянный жмет дважды
на Esc, а правая рука уже готова давить нужную кнопку.
Вот и все, что я хотел рассказать в этой второй (может
последней?) статье про Emacs.
Снова даю ссылку на свой последний .emacs файл.
7. Благодарности
Благодарности... будут, как всегда.
>
Copyright © 1999-2004 Anton Kulchitsky,
e-mail: anton@kulchitsky.org.