версия 1.2.1 (от 1 июня 2004 года)
Авторские права на этот документ принадлежат Антону Кульчицкому ©2004. Этот документ может распространяться и изменяться в соответствии с требованиями GNU General Public License, копия которой доступна по адресу http://www.gnu.org/copyleft/gpl.html.
В недавние времена, когда я считал себя счастливым с 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 написаны очень хорошо и кое-что приличное переведено на русский язык. Я особо хотел бы отметить следующие материалы, доступные в интернете:
Напоследок я хочу сказать пару слов для новичков. Emacs — это как классическая литература или серьезная музыка, требует усилий при обучении. Обучение на первых этапах — не самое легкое занятие. Меня в первую неделю двигало лишь две вещи: упрямство и беззаветная любовь к Emacs моего друга-японца (о, он даже почту смотрит в нем, на мой вкус это уже почти извращение), которому я доверял в этих вопросах. Однако к концу второй недели наступило-таки просветление. Помните, главное — не лениться читать и разбираться! У Emacs великолепная встроенная справочная система, в которой я и нашел ответы на почти все свои вопросы. Кроме того, есть множество форумов, где вам ответят даже на самые тупые вопросы (даже если и обругают, но это уже неважно).
Еще забыл сказать, что эта статья о GNU Emacs, не о XEmacs. Впрочем, думаю, многое будет верно и для последнего. Не знаю, как XEmacs, но GNU Emacs есть буквально на всех машинах. В моем компьютерном центре он всегда под рукой — как на огромных IBM и Cray, так и на всех Sun и Apple. И, конечно, на моей линуксовой писюковой двупроцессорной машине. Кстати, у меня на машине только одна система! Виндоус должен был умереть и он умер.
Первое дело, которое стоит сделать — это начать использовать родной язык. Для этого совершенно не стоит применять переключение на русский, которое вы используете в 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), я бы посоветовал прочитать более подробные описания русификации.
Что сразу я отверг в 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)
И действительно, главное меню вам будет доступно всегда не зависимо от
этой опции просто правым кликом мыши при прижатой клавише Ctrl.
(menu-bar-mode 0)
Я открыл, что в 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)
Еще примеры будут в других разделах статьи
Этот раздел посвящен важному вопросу перемещений по
буферу. Не всегда мы просто линейно печатаем в одном месте окна
какой-то текст. Часто приходится бродить по разным местам файла или
просто просматривать, что было уже написано. Однако, просто стрелочки
управления курсором и кнопки 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. То есть при использовании этих команд стоит воздержаться от использования именно этого регистра.
Часто нужно выполнить несколько сложных (то есть составных) действий подряд. Чтобы избежать повторения нескольких операций, можно использовать макросы. Например, если вы скачали какой-нибудь текст из библиотеки Мошкова, чтобы распечатать для родных и друзей в виде удобной книжки, и при этом решили использовать редактор 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. В общем, полная свобода. Пример того, что должно получиться, можно увидеть на картинке (щелкните на ней мышью, чтобы открыть в натуральную величину).
Естественно, макросы помогают не только в таких случаях. Часто в программе надо заменить кусок кода довольно интеллектуальным способом. То есть не просто текст на текст, а части текста на части текста. Это легко программируется при помощи макросов. Поэтому я бы посоветовал выучить эти комбинации или, что еще удобней, повесить их перед собой, чтобы всегда можно было вспомнить.
Это чудо мне посоветовали на ЛОРе, когда я плакал о том, как мне не хватает возможностей Visual C. И я нашел там много удобств, которые мне так нравились в майкрософтовской среде. Вместе с другими возможностями самого редактора GNU Emacs получается прекрасная среда для программирования. Кроме того, эту систему я использую для работы в LaTeX и при написании HTML.
Расскажу об основных функциях ecb, которые мне здорово облегчают плутания по коду. Прежде всего, это функция переключения между файлами простым щелчком средней кнопки мыши на имени файла в нижнем окне ecb (конечно, можно настроить все так, что это будет не нижнее окно, но меня устраивают настройки по умолчанию). Если там этого файла нет, то его можно найти при помощи дерева каталогов (верхнее окно) и списка файлов в текущей директории (второе окно сверху). Другая функция — это та же средняя кнопка в третьем сверху окне. Если вам надо попасть в функцию или на переменную, то достаточно щелкнуть на имени этой функции или переменной в этом окне и она будет найдена и отображена в основном окне Emacs. Страшно удобно, особенно когда вы работаете с классами (смотрите иллюстрацию внизу параграфа, как всегда щелчок мыши на маленьком рисунке приводит к большой картинке).
Вообще, по моему мнению, именно с появлением таких функций в интегрированных средах разработки, как навигация по классам с учетом иерархии, объектно-ориентированное программирование заиграло всеми своими достоинствами, а основные недостатки этого подхода (сложность отслеживания иерархии и навигация) практически исчезли.
На мой взгляд, ecb — одна из лучших свободных интегрированных сред. Безусловно, есть еще такие замечательные вещи, как KDevelop и Anjuta, еще несколько более мелких свободных проектов, но все они имеют два связанных недостатка для меня: они не связаны с Emacs (все же лучше привыкать к меньшему числу вещей), и они менее гибки в настройках, так как менее гибка среда редактирования. Не говоря о том, что среда Emacs — это нечто, проверенное долгим временем. При этом ecb+Emacs никак не уступают по возможностям другим IDE (интегрированным средам разработки). Для примера, на иллюстрации внизу изображен вариант редактирования HTML кода этой страницы с использованием моды ecb.
Получить ecb можно по адресу http://ecb.sourceforge.net. Только надо установить еще несколько пакетов, от которых зависит ecb. Лучший путь для этого — скачать пакет Cedet, который содержит все, что нужно для ecb, в одном флаконе.
При установке пакета лучше скомпилировать Lisp исходники. Читайте инструкции по установке в указанных выше дистрибутивах.
В 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.
И теперь буквально два слова об HTML. Существует огромное число замечательных свободных программ для создания страниц для интернета. Однако огромное количество людей продолжает использовать Emacs, улучшая специальные моды и расширяя таким образом и без того бескрайние возможности этого редактора. Пример, посвященный редактированию в ecb, использует специальную моду html-helper-mode, которую я очень советую скачать и установить для Emacs.
Вот и все, что я хотел рассказать про Emacs. Если у кого-то есть предложения по улучшению моей статью или моей работы в Emacs, пожалуйста, пишите!
Здесь привожу ссылку на мой .emacs файл (совсем чуть-чуть измененный)
Наконец, в планах улучшения этой статьи — добавление рассказа об auctex,, что советовали очень многие... когда разберусь с ним, как следует, конечно.
Спасибо всем, кто помог найти ошибки в коде и в тексте. Особенно я благодарю Евгения Зайцева (a.k.a. lg), подсказавшего много улучшений в приведенном коде и Евгения Балдина, который прислал (и сделал) отличные документы по локализации, которые я учел в статье и сослался на них. Я благодарю также Майка Андреева, приславшего ценное исправление кода для скроллинга.
Я особо исключительно благодарю Виктора Серебрянского, который взял на себя колоссальный труд вычитки моего текста. Текста, который представлял из себя воистину авгиевы конюшни и который после профессиональной правки по крайней мере не раздражает глаза безграмотностью. Все, что осталось неграмотным, лежит на моей совести, так как я изменил некоторые части уже после редакции.
Обсудить статью на местном форуме
Copyright © 1999-2004 Anton Kulchitsky, e-mail: anton@kulchitsky.org.