Версия для печати

Архив документации на OpenNet.ru / Раздел "Обработка текста" (Многостраничная версия)

Emacs с удобствами

Оригинал: /kulchitsky.org
Автор: Anton Kulchitsky

версия 0.9 (от 2 июня 2004 года)

Содержание

  1. Необходимое введение
  2. Компиляция в Emacs
  3. Краткий курс ECB
  4. CVS и Emacs
  5. Примеры
  6. Моя хирагана для Emacs
  7. Благодарности

Авторские права на этот документ принадлежат Антону Кульчицкому  (©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. Об этом, как ни странно, мало кто догадывается.

2. Компиляция в Emacs

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 в котором все это настраивается:

;;compilation window shall scroll down
(setq compilation-scroll-output 1)

(global-set-key (kbd "\e\em") 'user-save-and-make-all)
(global-set-key (kbd "\e\ek") 'kill-compilation)

;;general compile function call "make all"
(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'а).

3. Краткий курс ECB

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. У меня это сделано так:
;;cedet (instead of semantic)
;;Configuration variables here:
(setq semantic-load-turn-useful-things-on t)
;; Load CEDET
(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. У меня это выглядит так:
;;code view
(add-to-list 'load-path "/usr/local/emacsscr/ecb-2.24")
(require 'ecb)

Теперь все должно заработать. Естественно, все эти пакеты (CEDET, ECB и так далее) можно устанавливать локально в своей родной домашней директории. Тогда рутовый пароль не нужен.

Первое что надо сделать

Первое что надо сделать — это настроить ECB. Это надо сделать обязательно! Все настройки надо делать при помощи автоматической функции ECB, а не прямым редактированием .emacs. Знаю, многим это не понравится. Но все же это единственный нормальный путь, чтобы все работало. ECB автоматически добавляет код в ваш .emacs, в самый хвост его, и комментирует. Ручное редактирование возможно, но лучше воспользуйтесь автоматом. Для настройки надо запустить команду "M-x ecb-customize". В основном окне покажутся кнопочки с настройками как показано на картинке. Start of 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, а встроенной оболочкой я пользуюсь часто). Compilation error: jump to the line with error

Давайте еще посмотрим, как помогает окно компиляции перепрыгивать на ошибки в коде. На рисунке видно, как в окне компиляции горит красным ошибка (я специально удалил точку с запятой для демонстрации). Курсор уже стоит на нужной строке: это произошло после перехода в буфер с диагностикой (я использую стандартное '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. К сожалению я не знаю есть ли у нее русский перевод. Скорее всего нет. Для меня это настольная книга и я считаю ее лучшей покупкой прошлого года. Впрочем, как легко видеть, самая свежая версия этой книги всегда доступна онлайн. Start of ecb-customize

Однако, давайте думать, что читатель давно знаком с CVS и пользуется этой программой часто. Рассмотрим, что предлагает фронтенд от Седерквиста, который называется pcl-cvs. Во всех более или менее новых версиях Emacs этот пакет установлен по умолчанию. Использовать его очень легко. Предположим, что вы редактируете файл в рабочем каталоге. Теперь вы хотите внести изменения в репозиторий. Для этого сначала надо перейти в cvs моду при помощи команды 'M-x cvs-update'. В результате вы получите список файлов, которые были обновлены из репозитория (если репозиторий менялся), которые были вами отредактированы и отличаются от версий репозитория (метка Modified) и файлов в рабочей версии, которые неизвестны репозиторию (метка Unknown). Кстати, pcl-cvs умно фильтрует свои сообщения. Так, вы не получите резервные или системные файлы в списке неизвестных. Пример запуска этой команды приведен на рисунке.

Кстати, если вы решите пользоваться Emacs для работы с CVS, то конечно надо привязать горячую клавишу для запуска 'cvs-update'. Кроме того, я бы посоветовал несколько усовершенствовать вызов этой функции. Дело в том, что cvs-update сама по себе нуждается в текущей директории. Я заставил ее запускаться по 'MM-u' в текущей директории при помощи следующих команд в .emacs:

;;general CVS function call "cvs-update"
(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'. Start of ecb-customize

Не нужно думать, будто это единственный фронтенд к Emacs для работы с cvs. Но, говорят, он самый удобный. На самом деле ECB тоже предоставляет некоторые сервисы для работы с CVS. Мне они не очень пока приглянулись, так как основаны на меню. Но "раз звезды зажигают, значит это кому-нибудь нужно". На рисунке вы видите контекстное меню для окна директорий. Чтобы его вызвать надо кликнуть правой кнопкой на нужной директории. Как я понимаю, ECB видит директорию CVS в рабочей директории и делает выводы. Подобные меню доступны и при кликах на отдельных файлах. Там есть очень удобные опции, которые могут оказаться полезными вне зависимости от того, используете ли вы pcl-cvs (чует мое сердце, что ECB так вызывает pcl-cvs).

5. Примеры

Эта глава посвящена в основном примерам использования Emacs с описанными в этой статье вещами. По сути это просто серия скриншотов с комментариями.

Start of ecb-customize

Пример 1. Моя домашняя страница

Моя домашняя страница управляется CVS, как я уже и говорил во введении. Все это располагается на дружественном мне сервере и я в любой момент могу вносить правку. Страницу я всегда редактирую с помощью связки Emacs+ECB. Вообще говоря, у меня обычно включен html-helper-mode, но я все больше склоняюсь к отказу от него, так как иногда он начинает беспощадно тормозить. В принципе он мне не нужен, так как я пользуюсь очень ограниченным арсеналом HTML, причем многое у меня привязано к быстрым клавишам. В дальнейшем страница переносится к моему хостеру при помощи программы gftp.

Start of ecb-customize

Пример 2. Удаленная работа в Emacs

Очень экзотический пример. На самом деле я удаленно почти никогда не работаю в ECB, тем более в терминале, где мышь не работает и надо помнить все клавиатурные привязки для ECB. Я установил ECB и привел этот пример только для того, чтобы показать что все работает и в текстовой моде, и то, что все работает под AIX не хуже чем под GNU/Linux, и то, что ECB прекрасно встает локально (у меня нет рутовых прав на этой машине). И то, что фортрановский код меня уже утомил :).

Start of ecb-customize

Пример 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.


Точки Emacs

версия 1.2.1 (от 1 июня 2004 года)

Содержание

  1. Введение
  2. Русский язык в Emacs
  3. Скроллинг, размер шрифта и пространство
  4. Esc-esc (meta-meta) последовательность
  5. Блуждания по буферу (колеса и прыгалки)
  6. Макросы, замены и повторы
  7. Emacs code browser и программирование
  8. Редактирование LaTeX и HTML
  9. Благодарности

Авторские права на этот документ принадлежат Антону Кульчицкому ©2004. Этот документ может распространяться и изменяться в соответствии с требованиями GNU General Public License, копия которой доступна по адресу http://www.gnu.org/copyleft/gpl.html.

1. Введение

В недавние времена, когда я считал себя счастливым с Windows, а моего соседа по работе, японца — чудаком, который по неизвестным причинам с глубокого далека работает в FreeBSD, я почитал Visual C + MFC верхом совершенства, а устройство Windows довольно удобным, хотя и не лишенным множества недостатков.

Но тут появилась проблема. Мне надо было работать на моей машине (по тем временам очень мощной) одновременно с двух машин удаленно (используя дополнительное довольно дорогое программное обеспечение). Однако система не захотела пускать меня сразу с двух других машин. Я удивился и... позвонил в местный Microsoft, где мне очень вежливо объяснили, что я должен купить Виндоус сервер, чтобы работать двоим (?!) на одной машине. Можно было сделать еще несколько манипуляций, самая дешевая из которой утраивала стоимость операционной системы, которая уже тогда казалась мне непомерно высокой.

Честно говоря, я разозлился. Почему это я не могу нормально работать, как хочу, с честно купленной Windows 2000 Professional? Пусть с двух машин, что за дело? Оказалось, что я купил не систему, а лицензию, одну лицензию. Чтобы работать с двух машин, надо иметь их две. А на самом деле — другую систему (которая ничем, собственно, от установленной не отличается, кроме возможности удаленного доступа).

Я рвал и метал. Я обещал, что снесу это уродство насовсем (у меня был и другой стимул — я должен был использовать UNIX на будущем месте моей работы)... Тут меня поймал на слове мой сосед японец, как и я, помешанный на будо. С японской вежливостью он сказал, что такие обещания надо держать, и предложил мне помощь в форматировании диска. Мне пришлось согласиться, чтобы сохранить лицо... И только чтобы уж в чем-то поупорствовать, я на чистый винчестер поставил не BSD, но GNU/Linux.

А дальше началось то самое будо: путь воина. Путь линуксоида очень напоминает путь воина, главными особенностями которого являются ответственность и самодисциплина. Но и награды этого пути достойны: это свобода и мастерство. Кроме того, Линукс, как оказалось, ничуть не хуже Windows, а кое-в-чем и превосходит ее.

На этом пути первая гора, на которую стоит забраться — это редактор GNU Emacs (впрочем, ему ничем не уступает, а в чем-то и превосходит его ответвление XEmacs). Я не стал "гуру" этого редактора, отнюдь, но сумел стать достаточно квалифицированным для моих целей пользователем за довольно короткое время. Привыкая к непривычному окружению, я все больше и больше ценил удобство этого метаредактора. И теперь мне хочется рассказать о маленьких особенностях моей работы. Уверен, что для многих мастеров Emacs'а все сказанное будет тривиальным. Я заранее бью челом этим гуру, но прошу их удалиться. Эта статья не для них — они и так все на свете знают. Эта статья для таких же, как и я, мирных юзеров, которые, возможно, оценят некоторые из моих настроек и приемчиков, а может, и распространят применение Emacs на другие задачи. Эта статья еще и для тех, кто вообще не использует этот редактор — например, для убежденных фанатов Vim. Возможно, они захотят попробовать Emacs в какой нибудь области, где Вим не приносит им радости.

Это не учебник по Emacs. Это просто этюды на тему. И больше ничего. Чтение для удовольствия и для маленькой пользы, возможно (по крайней мере, разделы о русификации, скроллинге и применении ecb довольно общие и могут рассматриваться как некий HOWTO). Я не объясняю, что такое .emacs файл, например, или Emacs Lisp. Для тех, кто не знает, .emacs — это файл, в котором располагаются команды на языке Emacs Lisp, которые запускаются при каждом старте редактора. Обычно .emacs используется для основных настроек вроде установки размера шрифтов или подгрузки каких-нибудь дополнительных модулей. Так что все же объяснил! От названия этого файла и происходит название статьи.

Учебники по Emacs написаны очень хорошо и кое-что приличное переведено на русский язык. Я особо хотел бы отметить следующие материалы, доступные в интернете:

  1. Руководство по Emacs, размещено на отличном линyкс-ресурсе ЛОР (linux.org.ru) и "описывает использование и простую настройку редактора", как сказано в самом этом документе.
  2. Emacs для начинающих HOWTO (Emacs Beginner's HOWTO). Отличное введение для начинающих.

Напоследок я хочу сказать пару слов для новичков. Emacs — это как классическая литература или серьезная музыка, требует усилий при обучении. Обучение на первых этапах — не самое легкое занятие. Меня в первую неделю двигало лишь две вещи: упрямство и беззаветная любовь к Emacs моего друга-японца (о, он даже почту смотрит в нем, на мой вкус это уже почти извращение), которому я доверял в этих вопросах. Однако к концу второй недели наступило-таки просветление. Помните, главное — не лениться читать и разбираться! У Emacs великолепная встроенная справочная система, в которой я и нашел ответы на почти все свои вопросы. Кроме того, есть множество форумов, где вам ответят даже на самые тупые вопросы (даже если и обругают, но это уже неважно).

Еще забыл сказать, что эта статья о GNU Emacs, не о XEmacs. Впрочем, думаю, многое будет верно и для последнего. Не знаю, как XEmacs, но GNU Emacs есть буквально на всех машинах. В моем компьютерном центре он всегда под рукой — как на огромных IBM и Cray, так и на всех Sun и Apple. И, конечно, на моей линуксовой писюковой двупроцессорной машине. Кстати, у меня на машине только одна система! Виндоус должен был умереть и он умер.

2. Русский язык, скроллинг и размер шрифта в Emacs

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

Чтобы использовать встроенные международные возможности редактора, его нужно установить вместе с leim, который можно скачать оттуда же, откуда и редактор (в случае XEmacs все уже включено в дистрибутив). Если вы устанавливали GNU Emacs со стандартного дистрибутива Линукс, то обычно он уже скомпилирован вместе с leim, так что можно не беспокоиться. Если же вы скачали самую последнюю версию (на момент написания статьи это 21.3.2), то нужно скачать еще и leim и растарить (я имею в виду tar -zxf blablabla.tar.gz) его в ту же директорию, где вы растарили GNU Emacs. После этого емаксовый скрипт ./configure автоматически создаст Makefile для компиляции вместе с leim. Очень просто.

После этого вам нужно позаботиться о локализации по умолчанию. Для этого в .emacs следует добавить следующие строки:

;;cyrillic enviroment
(set-language-environment 'Cyrillic-KOI8)

Это дает вам кои-8 по умолчанию и автоматически правильно отображает шрифты в русских (кои-8) файлах. К сожалению, поддержка UTF-8 (Unicode) еще плохая (начало 2004 года), причем не только в Emacs, но и в пакетах проверки грамотности, которые этот редактор использует (GNU ispell), так что я не советую пользоваться ею для русских текстов, при всей моей любви к Unicode. И не используйте иксовую локализацию, когда работаете в Emacs. Кроме того, что она менее удобна, она еще и ломает комбинации клавиш по умолчанию. Хуже, если она настроена на ввод в кодировке Windows (точнее, в другой кодировке, отличной от настройки редактора). Тогда Emacs не сможет нормально сохранить ваш документ.

Я печатал вслепую в раскладке Windows и поэтому хотел оставить ту раскладку, к которой я привык. Для этого пришлось перепрограммировать некоторые клавиши. Сделал я это довольно вульгарно, но работает эффективно (смотрите вставку с кодом).

Теперь мелочи, которые делают очень удобным переключение раскладок в Emacs. Я использую переключение по 'Alt-Shift-9' (то есть 'M-(' в стандартных emacs'овых обозначениях) для включения русского и 'Alt-Shift-0' (то есть 'M-)') для включения английского. Я не использую универсальную комбинацию для переключения между языками, так как не всегда помню, на каком я сейчас конкретно языке, а посмотреть забываю. Это приносит страдания (для тех, кто понимает: это чуть ли не главная причина, почему я не люблю Vim — в нем два режима работы). Однако для простого переключения все же держу специальную (стандартную в Emacs) комбинацию 'Alt-\' (то есть 'M-\'). При помощи этих комбинаций я всегда твердо знаю, какой язык будет выбран. Еще, лучше не использовать похожие комбинации с клавишей 'Ctrl', так как они вам понадобятся для макросов. О макросах читайте ниже в этой статье.

Краткое отступление о стандартных обозначениях специальных клавиш. Клавиша 'Ctrl' обозначается как 'C' в Emacs. Например, вместо 'Ctrl-a' пишут 'C-a'. Аналогично, для клавиши 'Alt' имеется обозначение 'M', то есть "мета" — историческое название. Однако эта же клавиша обозначает 'Esc'. То есть вместо 'Alt-x' можно набрать 'Ecs x'. Это бывает очень удобно (смотрите ниже). Наконец, я даю в одинарных кавычках все комбинации клавиш в этой статье.

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

(global-set-key (kbd "\C-\\") 'user-toggle-input-method)
(global-set-key (kbd "\e(") 'user-to-cyr)
(global-set-key (kbd "\e)") 'user-to-nil)

(defun user-cyrillic-redefinitions ()
  "Set of global keys binding for cyrillic.
This function is to be called from user-toggle-input-method"
  (global-set-key (kbd "?") (lambda()(interactive)(insert ",")))
  (global-set-key (kbd "/") (lambda()(interactive)(insert ".")))
  (global-set-key (kbd ",") (lambda()(interactive)(insert ":")))
  (global-set-key (kbd ":") (lambda()(interactive)(insert "%")))
  (global-set-key (kbd "*") (lambda()(interactive)(insert ";")))
  (global-set-key (kbd ";") (lambda()(interactive)(insert "*")))
  (global-set-key (kbd ".") (lambda()(interactive)(insert "?"))))

(defun user-nil-redefinitions ()
 "Restoring global keys binding after user-cyrillic-redefinitions.
This function is to be called from user-toggle-input-method"
  (global-set-key (kbd "?") (lambda()(interactive)(self-insert-command 1)))
  (global-set-key (kbd "/") (lambda()(interactive)(self-insert-command 1)))
  (global-set-key (kbd "$") (lambda()(interactive)(self-insert-command 1)))
  (global-set-key (kbd ",") (lambda()(interactive)(self-insert-command 1)))
  (global-set-key (kbd ":") (lambda()(interactive)(self-insert-command 1)))
  (global-set-key (kbd "*") (lambda()(interactive)(self-insert-command 1)))
  (global-set-key (kbd ";") (lambda()(interactive)(self-insert-command 1)))
  (global-set-key (kbd ".") (lambda()(interactive)(self-insert-command 1))))

(defun user-toggle-input-method ()
  "Change the stadart function tuggle-input-method
to redefine keys for cyrillic input from UNIX type to win type"
  (interactive)
  (toggle-input-method)
  (if (string= current-input-method "cyrillic-jcuken")
      (user-cyrillic-redefinitions)
    (user-nil-redefinitions))
  (message "keybord changed to %s" current-input-method))

(defun user-to-cyr ()
  "Change input method to Cyrillic,
I bound this function with Alt-Shift-9, that is M-("
  (interactive)
  (when (string= current-input-method nil)
      (user-toggle-input-method)))

(defun user-to-nil ()
  "Change input method to nil (generally to English),
I bound this function with Alt-Sfift-0 that is M-)"
  (interactive)
  (when (string= current-input-method "cyrillic-jcuken")
      (user-toggle-input-method)))

Вместо длинных команд с lambda/insert здесь есть соблазн написать что-то более простое, вроде

 (global-set-key (kbd "?") (kbd ","))

Но это не будет работать, и вот почему. Данная команда означает, что вместо клавиши "?" должна быть "нажата" клавиша ",", а это не то, что нужно, так как если нажать эту клавишу в русской раскладке, то получится русская буква "б". Приведенный код с функцией insert заставляет не нажать на эту самую клавишу, а вызвать функцию вставки конкретного символа (в данном случае запятой), того, который нам нужен. Однако если вам не требуется переопределять клавиши под распальцовку Windows, то функции типа user-cyrillic-redefinition вам не нужны и можно обойтись лишь коротким вариантом:

(global-set-key (kbd "\C-\\") 'user-toggle-input-method)
(global-set-key (kbd "\e(") 'user-to-cyr)
(global-set-key (kbd "\e)") 'user-to-nil)

(defun user-toggle-input-method ()
  "Change the stadart function tuggle-input-method
to redefine keys for cyrillic input
from UNIX type to win type"
  (interactive)
  (toggle-input-method)
  (message "keybord changed to %s" current-input-method))

(defun user-to-cyr ()
  "Change input method to Cyrillic,
I bound this function with Alt-Shift-9, that is M-("
  (interactive)
  (if (equal current-input-method nil)
      (user-toggle-input-method)))

(defun user-to-nil ()
  "Change input method to nil (generally to English),
I bound this function with Alt-Sfift-0 that is M-)"
  (interactive)
  (if (equal current-input-method "cyrillic-jcuken")
      (user-toggle-input-method)))

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

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

3. Скроллинг, размер шрифта и пространство

Что сразу я отверг в Emacs, так это "дерготню". Если курсор попадет на нижнюю строчку, то экран у вас дернется и мгновенно несколько строк будет отмотано, чтобы вы видели строки под курсором (это называется агрессивная перемотка). По умолчанию вас закинет аж в центр окна. С непривычки мне это показалось чудовищным! Терпеть не могу, когда что-то дергается. Но в Emacs настраивается абсолютно все. Чтобы добиться гладкого скроллинга, я добавил следующие строки в .emacs:

;;my favourite scrolling
(setq scroll-conservatively 50)
(setq scroll-preserve-screen-position 't)

Второе, что мне не нравилось во всех редакторах Windows (особенно это раздражало в Visual C) — это то, что когда я дохожу до низа окна редактора, я перестаю видеть продолжение текста. Для обычных текстов это не проблема. Но при программировании очень важно видеть как верх, так и низ. Вообще говоря, в Emacs существует популярная команда Ctrl-l, которая устанавливает текущую строку в центр видимого окна. Это чудесно, конечно, и у многих, я знаю, эта самая популярная команда редактора. Но меня это не устраивало, так как мне было лень давить на лишнюю комбинацию клавиш, к тому же при нажатии экран снова дергался, и я должен был в течение целого мгновения искать курсор глазами, а главное — я успевал разозлиться из-за того, что пришлось отвлечься на такую ерунду.

К счастью, решение оказалось легким и приятным! Надо установить видимую часть окна больше, чем активную. В итоге вы будете видеть нижние строчки, а скроллинг с предыдущими установками не даст экрану дергаться, когда вы дойдете до невидимой границы. Это называется установкой полей снизу и сверху. Параметр в скобках указывает размер полей. В реальности у меня стоит 15, что связано с высоким разрешением экрана. Итак, все это может быть настроено следующей командой в .emacs:

(setq scroll-margin 10)

Последнее из удобств, о котором я хотел сказать здесь — это размер шрифта. Маленький шрифт по умолчанию раздражал мне глаза, и я установил его покрупнее при помощи следующей строчки в .emacs:

(set-face-font 'default "7x14")

Увы, после этого редактор стал загружаться заметно дольше. Я не знаю, как от этого избавиться.

Последнее мелкое усовершенствование — это освобождение пространства от ненужной (хорошо, хорошо, для меня не нужной) панели с кнопками. Вообще говоря, работа с этой панелькой в GNU Emacs и XEmacs несколько отличается. Рецепты, верные для второго, не работают в первом. Решение найти не очень легко, если просто бродить по документации. Все что говорит встроенная справка — это наличие функции (tool-bar-mode) которая высвечивает меню, если его не было и тушит, если было. Однако, команда C-h f выдает дополнительную информацию о наличии необязательного аргумента. Если задан положительный аргумент, то панель будет включена, если нуль или отрицательный — выключена. Итак, выключаем панель следующей командой

(tool-bar-mode 0)
Впрочем, возможно что панель иногда может оказаться полезной. Ее можно менять в зависимости от моды (каламбур) и можно самому создавать к ней кнопки и привязывать к различным функциям. Однако, я сам это никогда не использовал. Мне гораздо приятнее, когда больше места для редактирования. Наконец, истинные аскеты, обходятся и без меню:
(menu-bar-mode 0)
И действительно, главное меню вам будет доступно всегда не зависимо от этой опции просто правым кликом мыши при прижатой клавише Ctrl.

4. Esc-esc (meta-meta) последовательность

Я открыл, что в Emacs очень много комбинаций клавиш уже занято под разные команды. Иногда комбинации очень удобны, иногда — нет. В любом случае почти все удобные комбинации заняты под что-нибудь. Даже зарезервированная для пользователей комбинация "C-c" нарасхват у тех, кто пишет всевозможные пакеты и обычно занято все приличное, если вы, конечно, не сидите в "голом" Emacs.

Как мне кажется, я нашел очень хороший для себя выход. Дело в том, что 'M-' (Meta) в Emacs значит не только (и не столько) кнопку 'Alt', а больше кнопку 'Esc'. Скажем, вместо 'Alt-x' для запуска какой-либо функции вы можете нажать сначала 'Esc', а потом уже 'x'. Это решило многие проблемы. Оказалось, что иногда быстрее нажать левой рукой на 'Esc', а правой тут же на клавишу, чем распальцовывать эту клавишу с альтом. Тогда почему бы не нажать на 'Esc' дважды?! Я веду это к тому, что комбинации 'Esc Esc клавиша' (в стандартной терминологии 'M-M-клавиша') не заняты, но все же очень удобны.

Справедливости ради следует заметить, что существуют машины, у которых есть специальная кнопка 'Meta'. В таком случае ее нужно использовать вместо 'Esc'. Более того, некоторые перепрограммируют клавиатуру с кнопкой со значком Microsoft как кнопку 'Meta' и используют ее в том же самом ключе. Возможно, кто-нибудь найдет это тоже удобным. Мне привычнее жить с 'Esc'.

Например, чтобы найти строку с каким-либо номером, я использую комбинацию 'Esc Esc l', после чего ввожу номер строки и попадаю куда нужно в большом файле. Очень удобно при программировании. Для этого я добавил следующую строчку в .emacs:

(global-set-key (kbd "\e\el") 'goto-line)

Другой пример из моего .emacs. Очень удобно запускать команду оболочки "make all", предварительно сохранив редактируемый буфер в файл. Для этого я добавил следующие строки в .emacs:

;;general compile function call "make all"
(defun user-save-and-make-all ()
  "save and call shell command: make all"
  (interactive)
  (save-buffer)
  (shell-command "make all")
  (message "make all executed!"))
;;C-xs,M-x make all \n
(global-set-key (kbd "\e\em") 'user-save-and-make-all)

Еще примеры будут в других разделах статьи

5. Блуждания по буферу (колеса и прыгалки)

Этот раздел посвящен важному вопросу перемещений по буферу. Не всегда мы просто линейно печатаем в одном месте окна какой-то текст. Часто приходится бродить по разным местам файла или просто просматривать, что было уже написано. Однако, просто стрелочки управления курсором и кнопки Page Up и Page Down не всегда соответствуют потребностям и желаниям. Самое популярное устройство для блуждающих — это и полезное и приятное колесико на мышке. По ряду причин, по умолчанию оно выключено в редакторе. Чтобы включить его в Emacs надо добавить следующую строчку в .emacs:

(mouse-wheel-mode 1)

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

Теперь мне хочется рассказать о другой возможности блужданий. Иногда нужно постоянно отпрыгивать в какое-то фиксированное место буфера для того, чтобы свериться с текстом или скопировать оттуда какие-то части. Обычно это решается открытием второго окна с тем же самым буфером и перескакиванием из одного окна в другое. Мне кажется это чудовищно неудобным. Вспоминая свое детство-отрочество-юность я с нежностью думаю о чудесном мех-матовском порождении под названием MIM, известном еще как редактор Микромир. В нем было несколько встроенных команд, которые по другому решали проблему. Самая удобная серия из этих команд делала следующее. Первая команда запоминала место где находится курсор в некотором регистре. Вторая же делала простую цепочку операций. Она запоминала текущее место курсора и прыгала на место, которое было запомнено до нее. Это было очень удобно. Например, пусть мы редактируем нечто в буффере, но иногда должны сверяться с заголовком буфера. Итак, пришло время первого прыжка. Мы запоминаем текущее место редактирования и отматываем туда, где надо сверяться с кодом. Далее, вызываем вторую команду. Она запоминает место, с которым мы будем еще сверяться, и прыгает назад, туда где мы редактируем. Далее, приходит время для второй сверки. Мы снова просто вызываем вторую команду и прыгаем в нужное место буфера. А потом опять ту же команду, чтобы вернуться. Очаровательно!

В Emacs можно сделать еще круче! Можно так прыгать даже между двумя буферами. Что вообще открывает широкие горизонты. Мне могут возразить, что такая опция как бы и не нужна, ведь есть регистры! Во-первых, скажу я вам, те команды, которые там предусмотрены по-умолчанию я не могу запомнить толком уже год моей работы с редактором! Там надо набирать сложнейшие распальцовки, которые сделают честь даже новому русскому. Во-вторых, еще скажу я вам, гораздо менее удобно использовать регистры, ибо надо запоминать в каком регистре какое место вы сохранили. А потом надо дважды выполнить сложную распальцовку для одной, по-сути, операции. Сначала надо запомнить позицию (одна распальцовка), а потом прыгнуть в запомненную ранее (другая распальцовка) и продолжать держать в голове какая позиция в каком регистре. Наконец, заняты у вас два регистра, хотя это совершенно не требовалось.

Итак, я предлагаю команду 'Meta-Meta-Shift-/' для того, чтобы запомнить текущую позицию и команду 'Meta-Meta-/' для того, чтобы перейти на запомненную позицию, прежде запомнив текущую. Конечно, вы можете придумать иные распальцовки для команд. И, конечно, это никак не отменяет использование регистров. Однако, после введения описанных команд я о регистрах совсем и думать забыл. Итак, следующий код может быть и в ваших .emacs

;;Toggle between saved positions as in MIM editor
(defun save-point-and-switch ()
  "Save current point to register 0 and go
to the previously saved position"
 (interactive)
 (let (temp)
   (setq temp (point-marker))
   (when (not (equal (get-register 0) nil))
     (jump-to-register 0))
   (set-register 0 temp)))
;;Save current position to register 0
(defun save-point-only ()
 "Save current point to register 0"
 (interactive)
 (set-register 0 (point-marker)))

(global-set-key (kbd "\e\e/") 'save-point-and-switch)
(global-set-key (kbd "\e\e?") 'save-point-only)

Надо еще помнить, что эта программа использует таки силу регистров. Точнее силу регистра 0. То есть при использовании этих команд стоит воздержаться от использования именно этого регистра.

6. Макросы, замены и повторы

Часто нужно выполнить несколько сложных (то есть составных) действий подряд. Чтобы избежать повторения нескольких операций, можно использовать макросы. Например, если вы скачали какой-нибудь текст из библиотеки Мошкова, чтобы распечатать для родных и друзей в виде удобной книжки, и при этом решили использовать редактор LaTeX, то вам, скорее всего, захочется проделать несколько элементарных манипуляций с текстом. Например, вставить между абзацами дополнительную строку. Это можно сделать следующим способом. Обычно абзац в этой библиотеке начинается с красной строки — нескольких пробелов подряд (положим, 5 пробелов). В таком случае можно вставить строку при помощи простого алгоритма: найти пять пробелов ('C-s'), остановиться в начале этой строки ('C-a'), нажать клавишу 'Enter'. Можно запомнить эту комбинацию в виде макроса. Чтобы начать запись макроса, надо нажать 'C-(' (поэтому не стоит использовать эту комбинацию для переключения языков), после чего выполнить запланированный алгоритм и завершить запись комбинацией 'C-)'. После этого это действие вызывается одной командой: 'C-x e', то есть сначала 'Ctrl-x', а потом клавиша 'e'. Пока это маленькое преимущество по сравнению со всей серией. Однако теперь у нас всего одна команда вместо трех (не считая ввода пробелов в строку поиска), и ее можно выполнить много-много раз автоматически при помощи мультипликатора команд 'C-u'. Нажав 'C-u', скажем, три раза подряд, вы заставите Emacs выполнить ваш макрос аж 64 разa (в общем случае, если вы нажмете 'C-u' n раз, вы получите 4 в степени n операций. В общем, вы можете нажать 'C-u #', где '#' обозначает количество повторений последующей операции. При этом если вы дойдете до конца файла раньше, чем кончатся эти команды, то Emacs остановится, пискнет так противно (бип) и будет снова готов к работе. Ничего не испортится.

Далее, можно заменить все вхождения '...' на команду '\dots', а также '- ' на '--- ' или '-- ', чтобы получить нормальные многоточия и тире. Но здесь лучше всего использовать простую команду замены, которая вызывается при помощи комбинации 'M-%' (то есть 'Alt-%'). Макросы можно еще применить для выделения заголовков жирным шрифтом.

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

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

documentclass[10pt,twocolumn]{report}

\usepackage[english,russian]{babel}
\usepackage[koi8-r]{inputenc}

%page configuration: Letter, for A4 format
%change to commented parameters
\textwidth=165mm %159.2mm
\textheight=240mm %252mm
\topmargin=0mm %-14mm
\oddsidemargin=2mm
%===================

\sloppy

\begin{document}

    МЕСТО ДЛЯ ТЕКСТА

\end{document}

Кроме того, полезно написать простой Makefile. Например, такой:

BASE=zatvornik

all: tex ps

tex:
	latex $(BASE).tex

ps:
	dvips $(BASE).dvi -o $(BASE).ps

psview:
	gv -geometry 975x700 $(BASE).ps & 

Где вместо слова zatvornik надо поставить имя файла для переработки. Кстати, если у вас нет старинной, но великолепной программы gv для просмотра и печати постскрипта, скачайте ее, либо используйте другую программу, либо работайте с dvi, либо сгенерируйте pdf. В общем, полная свобода. Пример того, что должно получиться, можно увидеть на картинке (щелкните на ней мышью, чтобы открыть в натуральную величину). An example of the book from Moshkov's library

Естественно, макросы помогают не только в таких случаях. Часто в программе надо заменить кусок кода довольно интеллектуальным способом. То есть не просто текст на текст, а части текста на части текста. Это легко программируется при помощи макросов. Поэтому я бы посоветовал выучить эти комбинации или, что еще удобней, повесить их перед собой, чтобы всегда можно было вспомнить.

7. Emacs Code Browser (ecb) и программирование

Это чудо мне посоветовали на ЛОРе, когда я плакал о том, как мне не хватает возможностей Visual C. И я нашел там много удобств, которые мне так нравились в майкрософтовской среде. Вместе с другими возможностями самого редактора GNU Emacs получается прекрасная среда для программирования. Кроме того, эту систему я использую для работы в LaTeX и при написании HTML.

Расскажу об основных функциях ecb, которые мне здорово облегчают плутания по коду. Прежде всего, это функция переключения между файлами простым щелчком средней кнопки мыши на имени файла в нижнем окне ecb (конечно, можно настроить все так, что это будет не нижнее окно, но меня устраивают настройки по умолчанию). Если там этого файла нет, то его можно найти при помощи дерева каталогов (верхнее окно) и списка файлов в текущей директории (второе окно сверху). Другая функция — это та же средняя кнопка в третьем сверху окне. Если вам надо попасть в функцию или на переменную, то достаточно щелкнуть на имени этой функции или переменной в этом окне и она будет найдена и отображена в основном окне Emacs. Страшно удобно, особенно когда вы работаете с классами (смотрите иллюстрацию внизу параграфа, как всегда щелчок мыши на маленьком рисунке приводит к большой картинке). ECB and C++ editing in Emacs

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

На мой взгляд, ecb — одна из лучших свободных интегрированных сред. Безусловно, есть еще такие замечательные вещи, как KDevelop и Anjuta, еще несколько более мелких свободных проектов, но все они имеют два связанных недостатка для меня: они не связаны с Emacs (все же лучше привыкать к меньшему числу вещей), и они менее гибки в настройках, так как менее гибка среда редактирования. Не говоря о том, что среда Emacs — это нечто, проверенное долгим временем. При этом ecb+Emacs никак не уступают по возможностям другим IDE (интегрированным средам разработки). Для примера, на иллюстрации внизу изображен вариант редактирования HTML кода этой страницы с использованием моды ecb. ECB and HTML editing in Emacs

Получить ecb можно по адресу http://ecb.sourceforge.net. Только надо установить еще несколько пакетов, от которых зависит ecb. Лучший путь для этого — скачать пакет Cedet, который содержит все, что нужно для ecb, в одном флаконе.

При установке пакета лучше скомпилировать Lisp исходники. Читайте инструкции по установке в указанных выше дистрибутивах.

8. Редактирование LaTeX и HTML

В Emacs можно делать очень много чего, но не все мне нравится. Что действительно удобно, так это писать документы в формате LaTeX. Для этого вполне достаточно использовать моду по умолчанию, хотя и разработано достаточно много всевозможных пакетов именно для LaTeX'а.

Здесь же мне хотелось привести лишь свой собственный способ ускорeния ввода окружений LaTeX. Я использую следующее правило: команда 'M-M-e' задает режим окружения (смотрите главу об esc-esc). Следующая буква определяет, какое. Скажем, команда 'M-M-e e' вставит в документ окружение equation. Чтобы это работало (и притом работало только при редактировании LaTeX документов), надо добавить в .emacs следующие строки:

;;general enviroment insertion
(defun user-latex-ins-env (textln)
  "insert enviroment in current point"
  (interactive)
  (if (bolp)
    (user-latex-ins-env-bof textln)
    (user-latex-ins-env-nbof textln))
  (message "%s enviroment inserted..."textln))

(define-key tex-mode-map
  "\e\eee" (lambda()(interactive)(user-latex-ins-env "equation")))

После этого можно лишь добавлять строки вроде последних двух, заменяя только слово "equation" на любое необходимое. Например, 'M-M-e v' у меня работает как окружение verbatim. Для этого в .emacs добавлено лишь следующее:

(define-key tex-mode-map
  "\e\eee" (lambda()(interactive)(user-latex-ins-env "verbatim")))

Ну и так далее. Кроме того, я определил много других удобных мне горячих клавиш с 'M-M-'. Например, 'M-M-{' вставляет в документ строчку "\left\{".

(define-key tex-mode-map 
  "\e\e{" (lambda()(interactive)(insert "\\left\\{")))

Ниже на рисунке вы можете увидеть, как редактируется статья, сверстанная в LaTeX. An example of the book from Moshkov's library

И теперь буквально два слова об HTML. Существует огромное число замечательных свободных программ для создания страниц для интернета. Однако огромное количество людей продолжает использовать Emacs, улучшая специальные моды и расширяя таким образом и без того бескрайние возможности этого редактора. Пример, посвященный редактированию в ecb, использует специальную моду html-helper-mode, которую я очень советую скачать и установить для Emacs.

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

Здесь привожу ссылку на мой .emacs файл (совсем чуть-чуть измененный)

Наконец, в планах улучшения этой статьи — добавление рассказа об auctex,, что советовали очень многие... когда разберусь с ним, как следует, конечно.

9. Благодарности

Спасибо всем, кто помог найти ошибки в коде и в тексте. Особенно я благодарю Евгения Зайцева (a.k.a. lg), подсказавшего много улучшений в приведенном коде и Евгения Балдина, который прислал (и сделал) отличные документы по локализации, которые я учел в статье и сослался на них. Я благодарю также Майка Андреева, приславшего ценное исправление кода для скроллинга.

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

Обсудить статью на местном форуме        


 

Copyright © 1999-2004 Anton Kulchitsky, e-mail: anton@kulchitsky.org.


Emacs с удобствами

версия 0.9 (от 2 июня 2004 года)

Содержание

  1. Необходимое введение
  2. Компиляция в Emacs
  3. Краткий курс ECB
  4. CVS и Emacs
  5. Примеры
  6. Моя хирагана для Emacs
  7. Благодарности

Авторские права на этот документ принадлежат Антону Кульчицкому  (©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. Об этом, как ни странно, мало кто догадывается.

2. Компиляция в Emacs

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 в котором все это настраивается:

;;compilation window shall scroll down
(setq compilation-scroll-output 1)

(global-set-key (kbd "\e\em") 'user-save-and-make-all)
(global-set-key (kbd "\e\ek") 'kill-compilation)

;;general compile function call "make all"
(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'а).

3. Краткий курс ECB

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. У меня это сделано так:
;;cedet (instead of semantic)
;;Configuration variables here:
(setq semantic-load-turn-useful-things-on t)
;; Load CEDET
(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. У меня это выглядит так:
;;code view
(add-to-list 'load-path "/usr/local/emacsscr/ecb-2.24")
(require 'ecb)

Теперь все должно заработать. Естественно, все эти пакеты (CEDET, ECB и так далее) можно устанавливать локально в своей родной домашней директории. Тогда рутовый пароль не нужен.

Первое что надо сделать

Первое что надо сделать — это настроить ECB. Это надо сделать обязательно! Все настройки надо делать при помощи автоматической функции ECB, а не прямым редактированием .emacs. Знаю, многим это не понравится. Но все же это единственный нормальный путь, чтобы все работало. ECB автоматически добавляет код в ваш .emacs, в самый хвост его, и комментирует. Ручное редактирование возможно, но лучше воспользуйтесь автоматом. Для настройки надо запустить команду "M-x ecb-customize". В основном окне покажутся кнопочки с настройками как показано на картинке. Start of 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, а встроенной оболочкой я пользуюсь часто). Compilation error: jump to the line with error

Давайте еще посмотрим, как помогает окно компиляции перепрыгивать на ошибки в коде. На рисунке видно, как в окне компиляции горит красным ошибка (я специально удалил точку с запятой для демонстрации). Курсор уже стоит на нужной строке: это произошло после перехода в буфер с диагностикой (я использую стандартное '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. К сожалению я не знаю есть ли у нее русский перевод. Скорее всего нет. Для меня это настольная книга и я считаю ее лучшей покупкой прошлого года. Впрочем, как легко видеть, самая свежая версия этой книги всегда доступна онлайн. Start of ecb-customize

Однако, давайте думать, что читатель давно знаком с CVS и пользуется этой программой часто. Рассмотрим, что предлагает фронтенд от Седерквиста, который называется pcl-cvs. Во всех более или менее новых версиях Emacs этот пакет установлен по умолчанию. Использовать его очень легко. Предположим, что вы редактируете файл в рабочем каталоге. Теперь вы хотите внести изменения в репозиторий. Для этого сначала надо перейти в cvs моду при помощи команды 'M-x cvs-update'. В результате вы получите список файлов, которые были обновлены из репозитория (если репозиторий менялся), которые были вами отредактированы и отличаются от версий репозитория (метка Modified) и файлов в рабочей версии, которые неизвестны репозиторию (метка Unknown). Кстати, pcl-cvs умно фильтрует свои сообщения. Так, вы не получите резервные или системные файлы в списке неизвестных. Пример запуска этой команды приведен на рисунке.

Кстати, если вы решите пользоваться Emacs для работы с CVS, то конечно надо привязать горячую клавишу для запуска 'cvs-update'. Кроме того, я бы посоветовал несколько усовершенствовать вызов этой функции. Дело в том, что cvs-update сама по себе нуждается в текущей директории. Я заставил ее запускаться по 'MM-u' в текущей директории при помощи следующих команд в .emacs:

;;general CVS function call "cvs-update"
(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'. Start of ecb-customize

Не нужно думать, будто это единственный фронтенд к Emacs для работы с cvs. Но, говорят, он самый удобный. На самом деле ECB тоже предоставляет некоторые сервисы для работы с CVS. Мне они не очень пока приглянулись, так как основаны на меню. Но "раз звезды зажигают, значит это кому-нибудь нужно". На рисунке вы видите контекстное меню для окна директорий. Чтобы его вызвать надо кликнуть правой кнопкой на нужной директории. Как я понимаю, ECB видит директорию CVS в рабочей директории и делает выводы. Подобные меню доступны и при кликах на отдельных файлах. Там есть очень удобные опции, которые могут оказаться полезными вне зависимости от того, используете ли вы pcl-cvs (чует мое сердце, что ECB так вызывает pcl-cvs).

5. Примеры

Эта глава посвящена в основном примерам использования Emacs с описанными в этой статье вещами. По сути это просто серия скриншотов с комментариями.

Start of ecb-customize

Пример 1. Моя домашняя страница

Моя домашняя страница управляется CVS, как я уже и говорил во введении. Все это располагается на дружественном мне сервере и я в любой момент могу вносить правку. Страницу я всегда редактирую с помощью связки Emacs+ECB. Вообще говоря, у меня обычно включен html-helper-mode, но я все больше склоняюсь к отказу от него, так как иногда он начинает беспощадно тормозить. В принципе он мне не нужен, так как я пользуюсь очень ограниченным арсеналом HTML, причем многое у меня привязано к быстрым клавишам. В дальнейшем страница переносится к моему хостеру при помощи программы gftp.

Start of ecb-customize

Пример 2. Удаленная работа в Emacs

Очень экзотический пример. На самом деле я удаленно почти никогда не работаю в ECB, тем более в терминале, где мышь не работает и надо помнить все клавиатурные привязки для ECB. Я установил ECB и привел этот пример только для того, чтобы показать что все работает и в текстовой моде, и то, что все работает под AIX не хуже чем под GNU/Linux, и то, что ECB прекрасно встает локально (у меня нет рутовых прав на этой машине). И то, что фортрановский код меня уже утомил :).

Start of ecb-customize

Пример 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.