|
8. Редактиpование файлов с помощью Emacs.
8.1 Что такое Emacs?
Для того, чтобы что-либо сделать на компьютеpе, необходимо знать,
как помещать текст в файлы и как изменять текст, уже находящийся там.
Редактоp как pаз и является пpогpаммой, служащей этим целям. Emacs -
один из самых популяpных pедактоpов, в частности, потому, что
позволяет даже новичку получать конкpетные pезультаты pаботы с ним.
(Классический Unix'овский pедактоp, vi, описан в пpиложении С).
Чтобы изучить еmacs вам нужно отыскать какой-нибудь файл с
пpостым текстом (буквами, цифpами и т.п.), скопиpовать его в ваш
домашний каталог (выполните, напpимеp, cp /usr/src/linux/README
~/README - мы не хотим менять исходный файл, поскольку он может
содеpжать важную инфоpмацию), и запустить emacs для данного файла:
/home/larry# emacs README
(Разумеется, в случае, если вы pешили скопиpовать файл /etc/rc,
или /etc/inittab, или любой дpугой файл, подставьте имя этого файла
вместо README. Hапpимеp, если вы копиpовали: cp /etc/rc ~/rc, то
запускать emacs надо следующим обpазом: emacs rc.)
Emacs может работать по-разному в зависимости от того, как он
запущен. При запуске с пpостой консоли, отобpажающей только текстовые
символы, Emacs займет всю консоль под свое окно. Если вы запускаете
его из X Windows, то Emacs откpоет собственное окно. Я буду
пpедполагать, что вы вызываете его с помощью текстовой консоли, но все
это пеpеносится и на случай использования X Windows - пpосто
подставьте слово "окно" в тех местах, где я писал "экpан". Также
помните, что вам необходимо пеpедвинуть куpсоp мыши в окно Emacs'а,
чтобы набиpать текст в нем!
Большая часть Вашего экpана после запуска Emacs содеpжит ваш
текстовый документ, но последние две стpоки пpедставляют особый итеpес
для начинающих изучать Emacs. Втоpая из них (та, котоpая содеpжит
длинную последовательность чеpточек) называется "стpокой pежима".
- 76 -
В моей строке режима вы видите слово "Top"("Вершина"). На его
месте может быть слово "All"("ВсT"), а также некоторые другие
несущественные отличия. (Часто в строке режима отображается системное
время.) Строка, находящаяся непосредственно за строкой режима
называется мини-буфером или, иногда, строкой сообщений. Emacs
использует еT для того, чтобы отображать предназначенные вам
сообщения, а также, в случае необходимости, для чтения вводимой вами
информации. В данном случае, Emacs информирует вас о следующем: "For
information about the GNU Project and its goals, type C-h C-p." ("Для
получения информации о проекте GNU и его целях нажмите C-h C-p.") Пока
проигнорируйте это - по началу мы не будем пользоваться минибуфером.
Прежде чем вы внесTте изменения в текст данного файла, вам
необходимо научиться перемещаться по тексту. Курсор должен находиться
в начале файла - в верхнем левом углу экрана. Чтобы переместить его
вправо нажмите C-f (т.е. держите клавишу "Control" во время нажатия
клавиши "f"("forward"). Курсор передвинется на один символ вправо, и,
если вы будете продолжать нажимать эти клавиши одновременно, то
примерно через пол-секунды автоматически произойдTт то же действие.
Заметьте, что когда вы достигаете конца строки, то курсор
автоматически переместится на начало следующей. Комбинация C-b
("backward") служит для перемещения в обратную сторону. Ну и, раз об
этом зашла речь, комбинации С-n и C-p служат для перемещения курсора
на следующую (next) и предыдущую (previous) строки соответственно.
Зачастую использование управляющих клавиш является наиболее
быстрым способом перемещения курсора во время редактирования. Одна из
целей Emacs'а - чтобы вы держали руки около алфавитно-цифровых клавиш
клавиатуры, т.е. там, где и производится основная работа. Однако, если
вы хотите, то вы можете перемещаться по тексту и с помощью
клавиш-стрелок.
Когда вы используете X, для перемещения курсора в любом
направлении вам достаточно переместить указатель мыши, нажав на еT
левую кнопку. Однако, это очень медленный способ - вам ведь каждый раз
приходится подносить руку к мыши! Большинство пользователей Emacs'а
для перемещения по тексту в первую очередь используют клавиатуру.
- 77 -
Всякий раз, когда захотите передвинуть курсор в левый верхний
угол, используйте комбинации C-p и C-b. А теперь сохраните комбинацию
C-b в нажатом состоянии немного дольше. Вы должны услышать сигнальный
звонок и увидите сообщение:"Beginning of buffer" ("Начало буфера"),
которое появится в мини-буфере. Теперь вы конечно же поинтересуетесь:
"Но что же такое буфер?"
Когда Emacs работает с каким-либо файлом, в действительности
работы с самим этим файлом не происходит. Вместо этого он копирует
содержимое данного файла в свою специальную рабочую область памяти,
называемую буфером, где вы можете модифицировать его так, как вашей
душе угодно. Когда работа проделана, вы с помощью Emacs'а сохраняете
данный буфер - другими словами, записываете содержимое буфера в
соответствующий файл. До тех пор, пока вы этого не сделали, файл
остаTтся неизменным, а содержимое буфера существует только внутри
Emacs'а.
Учитывая вышесказанное, приготовьтесь внести ваш первый символ в
буфер. До этого момента всT, что мы делали, не могло ничего испортить,
и это очень существенный момент. Вы можете выбрать любой символ, какой
вам нравится, но если вы хотите сделать это со вкусом, то я предлагаю
использовать хорошую, жирную заглавную букву "X". Как только вы
наберTте еT, посмотрите на начало вашей строки режима внизу экрана.
Как только вы измените буфер так, что его содержимое будет отличаться
от содержимого файла на диске, Emacs отобразит две звTздочки в начале
строки режима, чтобы дать вам знать, что буфер изменTн:
--**-Emacs: some_file.txt (Fundamental)--Top-------------------
Эти две звTздочки отображаются сразу, как только вы измените
содержимое буфера, и остаются видимыми до тех пор, пока вы не
сохраните содержимое буфера. Вы можете сохранять буфер много раз во
время редактирования - команда, служащая для этого: C-x C-s (держа
[Control] нажмите "x" и "s" ... okay, итак, вероятно, вы научились и
этому!). Намеренно сделали такую комбинацию, чтобы это было просто
набирать, так как сохранять ваши буфера рекомендуется пораньше и
почаще.
- 78 -
Я собираюсь предоставить вам список ещT нескольких команд,
включая те, которые вы уже выучили. Теперь вы можете попрактиковаться
с ними как только захотите. Я советую ознакомиться с ними прежде чем
двигаться дальше:
C-f Передвижение вперTд (вправо) на один символ
C-b Передвижение назад (влево) на один символ
C-n Передвижение на следующую строку
C-p Передвижение на предыдущую строку
C-a Передвижение на начало строки
C-e Передвижение на конец строки
C-v Передвижение на следующую страницу/экран текста
C-l Перестроить экран так, чтобы текущая строка оказалась в центре
C-d Стереть данный символ (попробуйте еT)
C-k Стереть текст от текущей позиции и до конца строки
C-x C-s Записать буфер в соответствующий ему файл
[Backspace] Cтереть предыдущий символ (тот, который вы только что набрали).
8.2 Как быстро начать работу в X
Если всT, что вас интересует, это быстрое редактирование сразу
нескольких файлов, то пользователю X не требуется идти много дальше
меню в верхней части экрана:
Buffers File Edit Help ]
Эти меню недоступны в текстовом режиме.
Как только вы запустите Emacs, в верхней части экрана появятся
четыре меню: Buffers, File, Edit и Help. Для того, чтобы
воспользоваться меню, просто передвиньте указатель мыши к его
заголовку (например, File), нажмите и держите левую кнопку. Затем
передвиньте указатель к тому действию, которое вы захотите выполнить,
и отпустите кнопку мыши. Если вы отказались от своих намерений, то
отведите указатель мыши куда-нибудь в сторону и отпустите кнопку.
- 79 -
Меню Buffers содержит список различных файлов, которые вы
редактируете в данном сеансе. Меню File предоставляет набор команд для
загрузки и сохранения файлов - многие из них будут описаны позже. Меню
Edit отображает несколько команд для редактирования одного буфера, а с
помощью меню Help можно получить доступ к оперативной справочной
информации.
Обратите внимание, что после пунктов меню перечислены их
клавиатурные эквиваленты, вы можете захотеть выучить их, чтобы
впоследствие работать быстрее. Кроме того, к лучшему это или к
худшему, большая часть функциональных возможностей Emacs'а доступна
только посредством клавиатуры, и поэтому, вы можете захотеть дочитать
оставшуюся часть данной главы.
8.3 Редактирование сразу нескольких файлов
Emacs может работать одновременно с несколькими файлами. На самом
деле, единственное ограничение на то, сколько буферов одновременно
может обрабатывать Emacs, является количество доступной памяти на
вашей машине. Команда, служащая для заведения буфера для нового файла:
C-x C-f. Как только вы наберете ее, в мини-буфере появится запрос о
имени файла:
Find file: ~/
Синтаксис здесь такой же, который используется для указания
файлов в приглашениях shell'а; косые черты представляют подкаталоги, ~
означает ваш домашний каталог. Вы также получаете возможность
"завершения имени файла", т.е, если вы набрали достаточно символов
имени файла в данном приглашении для того, чтобы однозначно
идентифицировать файл, вы можете просто нажать [Tab] для завершения
его имени (или чтобы показать возможные варианты завершения в случае,
если их более одного). Клавиша [Space] ("Пробел") также играет роль
для завершения имени файла в мини-буфере, схожую с ролью клавиши
[Tab], но я предложу вам проверить, в чем состоит разница. Как только
в мини-буфере окажется полное имя файла, нажмите [Return] и Emacs
предоставит буфер с содержимым данного файла. В Emacs'е этот процесс
- 80 -
известен как поиск файла. Двигаемся дальше, сейчас найдите еще
какой-нибудь не очень важный текстовый файл и загрузите его в Emacs'е
(сделайте это из нашего начального буфера some_file.txt). Теперь вы
имеете новый буфер. Я предположу, что он называется another_file.txt,
т.к. я не могу видеть вашу строку режима.
Ваш первоначальный буфер внешне как-будто бы пропал, возможно вы
заинтересовались: куда это он подевался? Он по-прежнему находится в
Emacs'е, и вы можете переключиться к нему с помощью комбинации C-x b.
Когда вы напишите эту комбинацию, то увидите, что мини-буфер
запрашивает вас о буфере, на который нужно переключиться, и содержит
имя буфера, на который будет происходить переключение по умолчанию.
Последнее означает, что если вы просто нажмете клавишу ввода [Return],
не набирая имени буфера, то переключение произойдет на данный буфер.
Этот буфер по умолчанию всегда является тем, который был переключен
самым последним, т.е. если вы работаете с двумя буферами, комбинация
C-x b всегда по умолчанию будет переключать на "другой" буфер (что
сохраняет вас от необходимости набирания имени буфера). Даже если
буфер по умолчанию и есть тот буфер, который вам нужен, всT же
попробуйте ввести его имя.
Заметьте, что здесь также действует правило "завершения имени
файла" во время его поиска: нажатие клавиши [Tab] завершает столько в
имени буфера, сколько представляется возможным. Всякий раз, когда вы
видите какое-нибудь приглашение в мини-буфере, полезно поверять, не
может ли Emacs делать "завершение". Делая его каждый раз, когда это
возможно, вы освободите себя от большого количества набирания на
клавиатуре. Emacs обычно делает "завершение", когда вы выбрали один из
пунктов некоторого предопределенного набора.
ВсT, чему вы научились о передвижении по тексту, редактируя текст
в первом буфере, применимо и ко второму, более новому. Будем двигаться
дальше - измените текст в новом буфере, но не сохраняйте его (т.е. не
нажимайте C-x C-s). Предположим, что вы не хотите сохранять внесенные
вами изменения в файл. Команда, служащая этому - C-x k, которая
"уничтожит" буфер. Наберите ее. Сначала вас спросят о том, какой же
буфер уничтожить, при этом, текущий буфер есть "буфер по умолчанию",
который почти всегда и является буфером, подлежащим уничтожению. Итак,
- 81 -
просто нажмите [Return]. Затем вас спросят о том, действительно ли вы
хотите уничтожить данный буфер - Emacs всегда проверяет прежде, чем
уничтожить какой-либо буфер, в который внесены изменения без их
сохранения. Просто наберите "yes" и нажмите [Return] в случае, если вы
хотите уничтожить его.
Двигайтесь дальше - попрактикуйтесь в загрузке, модифицировании,
сохранении файлов, уничтожении соответствующих им буферов. При этом
будьте уверены, что вы не портите какие-нибудь важные системные файлы,
чтобы это не послужило причиной возможных повреждений, но все же
попробуйте открыть по крайней мере пять буферов одновременно и, таким
образом, вы сможете потренироваться в переключении между ними. (Если
вы не зарегистрировались как администратор системы (пользователь
root), то вы не сможете каким-нибудь обpазом повpедить системе, но все
pавно, будьте внимательны.)
8.4 Завершение сеанса редактирования
Когда вы проделали всю работу с Emacs'ом, убедитесь, что все
буфера, которые следовало сохранить, уже сохранены, и выйдите из
Emacs'а с помощью комбинации C-x C-c. Иногда, после ее нажатия в
мини-буфере появится один или два вопроса прежде, чем закончить pаботу
с Emacs - не волнуйтесь, а просто ответьте на них. Если вы думаете,
что можете вернуться в Emacs позднее, то не пользуйтесь комбинацией
C-x C-c; наберите C-z, и она просто временно приостановит работу с
Emacs'ом. После этого, вы можете вернуться к нему, используя команду
Shell'a fg. Это более эффективный способ, чем завершение и перезапуск
Emacs'а по нескольку раз, особенно, если вы позже будете редактировать
те же самые файлы.
При работе в X нажатие C-z просто свернет окно в пиктограмму.
Смотрите раздел, посвященный этому в главе 5. Таким образом существует
два способа сворачивания Emacs'а - обычный, который вам предоставляет
ваш оконный администратор, и C-z. Помните, что когда вы свернули окно,
то просто использование команды fg не развернет его - вам придется
использовать ваш администратор окон.
- 82 -
8.5 Управляющая клавиша (мета-клавиша).
Вы уже знаете одну "клавишу-модификатор", используемую в Emacs'е,
это клавиша [Control]. Существует и еще одна, называемая
мета-клавишей, которая используется достаточно часто. Однако, не во
всех клавиатурах она расположена в одном и том же месте, а в некоторых
она может и вовсе отсутствовать. Первое, что вам необходимо сделать,
это выяснить, где расположена ваша мета-клавиша. Возможно, что ваши
клавиши [Alt] также являются мета-клавишами, если вы используете
клавиатуру IBM PC или подобную, на которой имеются эти клавиши.
Способ проверить это - нажать клавишу, которая могла бы быть
мета-клавишей, и нажать "x". Если после этого увидите, что в
мини-буфере появится короткое сообщение (типа "M-x"), то вы нашли ее.
Чтобы избавиться от этого сообщения и вернуться к вашему буферу
наберите C-g.
Если же у вас не появилось сообщения, то все же остается еще одно
решение. Вы можете использовать клавишу [Escape] как мета-клавишу. Но
вместо того,чтобы держать ее в нажатом состоянии, пока вы нажимаете на
следующую клавишу, нужно сразу же отпустить ее, а затем набрать
следующий символ. Этот метод будет работать, даже если у вас нет
настоящей мета-клавиши, таким образом, это самый простой способ
двигаться дальше. Теперь попробуйте нажать [Escape], а затем клавишу
"x". У вас должно появиться то же коротенькое сообщение. Чтобы оно
исчезло, просто наберите C-g. Эта комбинация является общим способом в
Emacs'е завершить работу с чем-либо, что в данный момент вас не
интересует. Обычно она сопровождается звуковым сигналом, сообщая вам,
что вы что-то прервали, но это и неплохо.
Обозначение M-x аналогично C-x (замените "x" любым другим
символом). Если вы нашли настоящую мета-клавишу, то пользуйтесь ею,
иначе просто используйте [Escape]. Я буду просто писать M-x, а вам
придется пользоваться вашей собственной мета-клавишей.
8.6 Работа с блоками текста (вырезание, перемещение, удаление и
вставка).
- 83 -
Emacs, как и любой другой хороший редактор, позволяет вам
вырезать и перемещать блоки текста. Для того, чтобы делать это, вам
нужно знать способ определения начала и конца блока. В Emacs'е вы
делаете это, устанавливая в буфере два местоположения, называемах
"отметка" (mark) и "точка" (point). Чтобы установить "отметку",
переместите курсор к месту, с которого будет начинаться блок, нажмите
C-SPC ("SPC" означает [Space], естественно). В мини-буфере должно
появиться сообщение "Mark set" (установка отметки). Для некоторых
терминалов C-SPC не работает, тогда вам придется пользоваться C-@.
Теперь отметка установлена в данном месте. При этом не появится
каких-либо особых выделений факта постановки отметки, ведь вы сами
знаете, куда ее поставили.
А что насчет "точки"? На самом деле, вы устанавливаете ее всякий
раз, когда перемещаете курсор, т.к. "точка" просто привязывается к
вашему текущему местонахождению в буфере. Говоря более формально,
точка является тем местом, куда был бы вставлен текст, если бы вам
нужно было что-нибудь набрать. Установив "отметку", а затем
переместившись в конец текстового блока, вы фактически задали этот
блок. Этот блок называется "регион" (region). Регион всегда будет
означать область между отметкой и точкой.
Просто определение региона еще не позволяет его перемещать. Вы
должны уметь говорить Emacs'у скопировать его, чтобы уметь перемещать
его. Для того, чтобы скопировать регион, убедитесь, что отметка и
точка правильно установлены, а затем нажмите M-w. Теперь Emacs записал
его. Чтобы переместить его куда-либо в другое место, просто
переместитесь туда и нажмите C-y. Эта операция называется вставкой
(yanking) текста в буфер.
Если вы действительно хотите переместить текст региона куда-либо,
нажмите C-w вместо M-w. Это "удалит" регион - весь текст внутри него
исчезнет. На самом деле, он также был сохранен, как и при
использовании M-w. Вы можете снова вставить его обратно с помощью C-y,
как обычно. Место, в котором Emacs сохраняет весь такой текст
называется "kill-ring" ("кольцо удалений"). В некоторых редакторах оно
называется "clipboard" или "paste buffer".
- 84 -
Существует и другой способ вырезания и перемещения текста: всякий
раз, когда вы пользуетесь C-k, чтобы уничтожить текст до конца строки,
этот текст будет сохраняться в kill-ring. Если вы удалили более одной
строки подряд, то все эти строки будут сохранены там вместе, так что
очередное перемещение текста вставит эти строки все одновременно. По
этой причине, часто быстрее несколько раз набрать C-k, чтобы чтобы
уничтожить какой-то текст, нежели устанавливать отметку, точку, а
затем нажимать C-w. Однако, оба этих способа будут работать. Это как
раз случай личного предпочтения.
8.7 Поиск и замена текста.
Существует несколько способов поиска текста в Emacs'е. Некоторые
из них достаточно сложные и не стоят того, чтобы здесь их касаться.
Самый простой и приятный способ - это использование isearch. "Isearch"
означает "incremental search" ("наращиваемый поиск"). Предположим, что
вы хотите отыскать строку "gadfly" в буфере, содержащем следующий
текст:
I was growing afraid that we would run out of gasoline, when
my passenger exclaimed ``Gadzooks! There's a gadfly in here!''.
Вы переместились бы к началу буфера, или, по крайней мере, к той
точке, о которой вы точно знаете, что она находится до первого
вхождения целевого слова "gadfly", а затем нажмите C-s. Это переведет
вас в режим isearch. Теперь начните набирать слово, которое вы ищете,
"gadfly". Но как только вы наберете "g", вы увидите, что что Emacs
переместил вас к первому вхождению "g" в данном буфере. Если
представленный текст является всем содержимым буфера, то это будет
первый символ в слове "growing". Теперь наберите букву "a", очередную
букву слова "gadfly", и Emacs переместит вас к слову "gasoline",
которое содержит первое вхождение "ga". Набрав еще "d", вы
переместитесь к "gadzooks", и, наконец, "f" переместит вас к "gadfly",
не заставляя вас набирать слово целиком.
Когда вы находитесь в режиме isearch, вы определяете строку для
поиска. Каждый раз, когда вы добавляете новый символ к концу строки,
число ее вероятных вхождений в текст уменьшается, пока вы не набрали
- 85 -
достаточно символов, чтобы однозначно определить строку. Как только вы
нашли интересующее вас вхождение, вы можете покинуть isearch, просто
нажав [Return] или какую-нибудь из обычных команд перемещения. Если вы
думаете, что строка, которую вы ищите находится выше, то вам следует
пользоваться C-r, что заставляет isearch работать в обратном
направлении.
Если вы нашли вхождение, но оно оказалось не то, что вы искали,
то снова наберите C-s, все еще находясь при этом в режиме isearch. Это
передвинет вас вперед к следующему вхождению, всякий раз, когда вы
нажимате C-s. Если следующего вхождения не оказалось, то появится
сообщение, что поиск завершился неудачно, но если вы снова наберете
C-s, то он возобновится с самого начала буфера. Обратное верно для C-x
- она продолжит поиск от конца к началу буфера.
Попытайтесь загрузить буфер с простым английским текстом и
запустите isearch для строки "the". Предварительно вы можете вставить
его сколько угодно раз, затем нажимайте C-s, чтобы перемещаться ко
всем его вхождениям. Обpатите внимание, что вы будете перемещаться ко
всем словам, таким как "them", поскольку оно также содержит подстроку
"the". Для того, чтобы искать только "the", вам следует добавить
пробел к концу искомой строки. Вы можете добавить другие символы к
этой строке в любой момент поиска, даже если вы подряд нажали
несколько раз C-s, чтобы отыскать очередные вхождения. Вы также можете
пользоваться [Backspace] или [Delete], чтобы удалить символы из строки
в любой момент поиска, а нажатие клавиши [Return] приведет к
завершению поиска, оставив вас у последнего вхождения целевой строки.
Emacs также позволяет вам замещать все вхождения какой-то строки
некоторой новой строкой - это называется query-replace (замещение по
запросу). Чтобы вызвать его, наберите query-replace и нажмите
[Return]. Поскольку на имена команд действует механизм завершений, то
как только вы наберете "query-re", можете просто нажать [Tab], чтобы
завершить его. Допустим, вы хотите заменить все вхождения "gadfly" на
"housefly". В ответ на приглашение "Query-replace:" наберите "gadfly"
и нажмите [Return]. Затем снова появится запрос и вам нужно будет
ввести "housefly". Emacs начнет передвигаться по буферу,
останавливаясь на каждом вхождении слова "gadfly", и спрашивая вас,
- 86 -
хотите ли вы заменить это вхождение. Просто нажмите "y" или "n" при
каждом запросе, говоря "Yes" или "No", соответственно, так до самого
конца. Если вы не уловили смысл, пока читали это, то попробуйте
проделать это сами.
8.8 Что же пpоисходит в действительности.
Hа самом деле, все эти клавишные комбинации, котоpые вы изучаете,
являются сокpащениями функций Emacs'а. Hапpимеp, C-p - коpоткий путь
вызова встpоенной функции Emacs'а "previous-line" (пеpеход на
пpедыдущую стpоку). Однако, все эти внутpенние функции могут быть
вызваны и пpи помощи их имен, используя комбинацию M-x. Если вы
забыли, что функции previous-line соответствует комбинация C-p, то вы
могли бы пpосто набpать: M-x previous-line [Return], и вы
пеpедвинетесь на одну стpоку ввеpх. Попpобуйте сделать это, чтобы
понять, что "M-x previous-line [Return]" и C-p в дейтвительности одно
и то же.
Разpаботчик Emacs'а и начал с того, что сначала опpеделил полный
набоp встpоенных функций, поставив затем в соответствие наиболее часто
используемым из них клавишные комбинации. Иногда легче пpосто вызвать
функцию явно с помощью M-x, чем помнить, какая комбинация ей
соответствует. Hапpимеp, функции query-replace (пеpенос по запpосу) в
некотоpых веpсиях Emacs'а соответствует комбинация M-%. Hо кто может
помнить такие сочетания? Если вы не используете функцию query-replace
кpайне часто, то легче пpосто вызвать ее с помощью M-x.
Большая часть того, что вы набиpаете, это символы, вставляемые в
текст буфеpа. Т.е. каждой из этих клавиш соответствует функция
self-insert-command, котоpая не делает ничего дpугого, кpоме как
вставляет данный символ в буфеp. Комбинации, в котоpых участвует
клавиша [Control] с каким-нибудь символом, обычно соответствуют
функциям, котоpые пpоизводят pазличные действия, такие как пеpемещения
по тексту. Hапpимеp, комбинация C-v соответствует функции scroll-up,
котоpая пpокpучивает (делает скpолинг) буфеp ввеpх на один экpан
(имеется ввиду, конечно, что ваша позиция пpи этом пеpедвигается
- 87 -
вниз).
Допустим, вы хотите вставить какой-нибудь упpавляющий символ в
буфеp, как вы собиpаетесь делать это? Кpоме всего пpочего, упpавляющие
символы являются ASCII символами, хотя и pедко используемыми, но вы
можете захотеть внести их в файл. Существует способ избежать того, что
упpавляющие символы интеpпpетиpовались Emacs'ом как команды.
Комбинация клавиш C-q соответствует функции quoted-insert. Данная
функция читает очеpедную клавишу и вставляет ее символьное значение в
буфеp, не пытаясь интеpпpетиpовать ее как команду. Это был способ
внесения упpавляющих символов в ваш файл, используя Emacs.
Естественно, для того, чтобы вставить в файл C-q - это нажать C-q
дважды!
Также Emacs имеет множество функций, котоpым не соответствуют
какие-либо клавиши. Hапpимеp, если вы пишите длинное сообщение, то вы
не захотите нажимать клавишу ввода в конце каждой стpоки. Можете
сделать это с помощью Emacs (вы можете сделать все, что угодно с
помощью Emacs) - команда, используемая для этого auto-fill-mode, но
для нее нет соотвествующей клавишной комбинации. Для того, чтобы
вызвать эту функцию, вам следует набpать "M-x auto-fill-mode".
Комбинация M-x используется для вызова функции по ее имени. Вы даже
могли бы вызвать по имени такие функции, как next-line и
previous-line, но это было бы кpайне неэффективно, так как им уже
соответствуют клавишные комбинации C-n и C-p!
Кстати, если вы после вызова функции auto-fill-mode посмотpите на
вашу стpоку pежима, вы заметите, что к ее пеpвому кpаю добавилось
слово "Fill". Пока это слово находится там, Emacs будет pазмещать
текст (завоpачивая стpоку по достижении пpавого кpая) автоматически.
Вы можете отключить его, набpав "M-x auto-fill-mode" еще pаэ - это
команда с двумя состояниями.
Hеудобства, связанные с набиpанием в мини-буфеpе длинных имен
функций, уменьшено за счет того, что Emacs делает завеpшение имени
функции таким же обpазом, каким он делал это для имен файлов. Поэтому,
вам pедко пpидется набиpать целиком имя функции, символ за символом.
Если вы не увеpены, можно или нет делать завеpшение, пpосто нажмите
- 88 -
клавишу [Tab]. Это никак вам не повpедит: самое худшее, что может
случиться, это то, что вы пpосто поставите символ табуляции, а если
вам повезло, то окажется, что вы можете использовать завеpшение.
8.9 Использование подсказок (HELP) в Emacs'е.
Emacs имеет расширенные возможности помощи - настолько
расширенные, что здесь мы можем их только слегка затронуть. Основные
возможности системы подсказок доступны при помощи комбинации: C-h и
одиночный символ. Например, C-h k дает информацию о любой клавише (она
выдает приглашение нажать клавишу (или комбинацию клавиш), а затем
сообщает, для чего она служит). Комбинация C-h t предоставляет
небольшое средство обучения пользователя Emacs'у. Наиболее важно, что
C-h C-h выдает подсказки о том, как пользоваться всей системой помощи
(help on help) . Если вы знаете имя какой-нибудь функции Emacs'а
(например, save-buffer), но не можете вспомнить, с помощью какой
последовательности клавиш она вызывается, то наберите C-h w и имя
данной функции. Или, если вы хотите более подробно знать, что делает
данная функция, то пользуйтесь комбинацией C-h f, которая запрашивает
имя интересующей вас функции.
Запомните, поскольку Emacs делает завершение имен функций, то на
самом деле вам не обязательно помнить, как именно называется функция,
о которой вы хотите получить подсказку. Если вы думаете, что можете
угадать имя функции по ее начальным символам, то наберите ее и нажмите
[Tab] и посмотрите, не произошло ли ее завершение. Если нет, то
вернитесь назад и попробуйте какой-нибудь другой вариант. То же самое
применимо и для имен файлов: если вы не можете вспомнить точного имени
файла, к которому вы не обращались примерно три месяца, вы можете
попробовать угадать его и применить "завершение". Таким образом,
использование "завершения" не просто сокращает количество нажатий
клавиш, но и представляет собой средство ответов на ваши вопросы.
Существуют и другие символы, которые вы можете набирать после
C-h, и все они дают информацию о разных вещах. Наиболее часто
используемые из них: C-h k, C-h w и C-h f. Как только вы глубже
ознакомитесь с Emacs'ом, то попробуйте еще C-h a, которая запрашивает
вас о строке, а затем сообщает вам о всех функциях, имена которых
- 89 -
содержат данную строку (например, "а" содержится в "apropos" или
"about").
Еще одним источником информации является программа просмотра
документации Info. Она слишком сложна, чтобы ее затрагивать здесь, но
если вы сами захотите исследовать ее, то нажмите C-h f и прочитайте
параграф в верхней части экрана. Это даст вам дополнительную
информацию.
8.10 Специализированные буфера: Режимы
У буферов Emacs'а существуют режимы, ассоциированные с ними.
Причиной этого является то, что ваши требования к подготовке
документа, когда вы пишите почтовое сообщение, сильно отличаются от
требований, скажем, к составляемой программе. Вместо того, чтобы
пытаться работать с редактором, который реагировал бы на каждое
отдельное требование(что было бы весьма сложно), разработчик Emacs'а
решил заставить Emacs вести себя различным образом, в зависимости от
того, что вы делаете в каждом выделенном буфере. Таким образом, буферы
имеют режимы, каждый из которых спроектирован для некоторой
специфической деятельности. Основные особенности, отличающие один
режим от другого, - это комбинации клавиш, но если и другие, не менее
важные отличия.
Основным режимом является "fundamental", который на самом деле не
имеет никаких специфических команд. Вот то, что Emacs'у приходится
сообщать о нем:
Fundamental Mode:
Этот основной режим не предназначен для чего-либо конкретного.
Другие основные режимы определяются путем сравнения с ним.
Я получил эту информацию таким образом: набрал C-x b, т.е.
переключил буфер, и в ответ на приглашение ввести имя буфера, на
который следует переключиться, я ввел "foo". Так как до этого момента
не существовало буфера с таким именем, Emacs создал его и переключил
меня на него. По умолчанию был установлен режим "fundamental", а если
- 90 -
бы это было не так, то я мог бы набрать "M-x fundamental mode", чтобы
установить его. Для всех названий режимов имеется команда, называемая
"<имя режима>-mode", переводящая текущий буфер в данный режим. Затем,
чтобы получить больше информации об этом основном режиме, я набрал
"C-h m", которая выдает вам информацию о текущем режиме буфера, с
которым вы работаете.
Существует чуть более полезный режим, называемый "text-mode", в
котором есть специальные команды M-S, для центрирования параграфа, и
M-s, для центрирования строки. Кстати, обозначение M-S означает ровно
то, что вы думаете, т.е. нажмите обе клавиши [Meta] и [Shift], а
затем, держа их, нажмите "S".
Только не проделывайте сразу все сказанное - сначала создайте
новый буфер, переведите его в текстовый режим "text-mode" и наберите
C-h m. Возможно, что вы не поймете всей информации, которую выдаст
Emacs, когда проделаете это, но все же вам следует попытаться хотя бы
частично разобраться в ней.
Этот и следующий раздел являются введением в некоторые наиболее
используемые режимы. Работая с ними, вы можете в любой момент нажать
C-h m для получения дополнительной информации.
8.11 Режимы составления программ (Programming Modes).
8.11.1 Режим C-mode
Если вы используете Emacs для составления программ на языке C, то
вы можете делать все отступы автоматически. Файлы, чьи имена
оканчиваются на ".c" или ".h", автоматически редактирутся в этом
режиме. Это означает, что становятся доступными определенные команды
редактирования, полезные для составления программ на языке C. В режиме
C-mode клавиша [Tab] соответствует команде "c-indent-command". Т.е.
при нажатии [Tab] на самом деле не происходит вставки символа
табуляции. Вместо этого, если вы нажимаете [Tab] в каком-либо месте
строки, Emacs автоматически разместит данную строку соответсвующим
образом (сделает отступ) в программе. Это говорит о том, что Emacs
кое-что знает о синтаксисе языка C (хотя совсем ничего не знает о его
- 91 -
семантике, т.е. не может уберечь вас от возможных ошибок!)
При этом предполагается, что предыдущие строки размещены
правильным образом. Т.е. если в предыдущей строке пропущена скобка,
точка с запятой, фигурная скобка или что-нибудь другое, то Emacs
разместит следующую строку несколько забавным образом. Если вы это
заметите, то проверьте пунктуацию в предыдущей строке.
Вы можете использовать эту особенность для проверки пунктуации в
ваших программах, вместо того, чтобы просматривать всю программу
целиком, высматривая ошибки, просто, начиная с самого верха, делайте
отступы с помощью [Tab] и когда у какой-то строки получится неверный
отступ, то проверьте строки, которые находятся непосредственно перед
ней. Другими словами, дайте Emacs'у работать на вас!
8.11.2 Режим Scheme
Этот важный режим не даст вам никаких преимуществ до тех пор,
пока у вас не появится компилятор или интерпретатор для языка
программирования Scheme. Использование последнего не является
настолько же обычным как использование, скажем, C-компилятора, однако,
оно становится все более и более всеобщим, поэтому, я его также
затрону. Большее из того, что подходит для схемного режима подходит
для Lisp-режима в случае, если если вы предпочитаете писать на языке
Lisp.
У Emacs'а есть два различных режима Scheme. Один из них, о
котором я расскажу, называется "cmuscheme", а позже, в разделе о
настройках Emacs'а, о том, как вообще может быть два различных схемных
режима и как с ними работать. А сейчас не бейспокойтесь о том, если не
все, о чем я говорю здесь, подходит к вашему Emacs'у. Настраиваемый
редактор значит непредсказумый редактор, и от этого никуда не деться!
Вы можетете запустить интерактивный схемный режим в Emacs'е с
помощью "M-x run-scheme". Это создаст буфер с именем "*scheme*",
который содержит в себе обычный схемное приглашение на ввод. Вы можете
набирать в нем схемные выражения и нажать клавишу ввода. После
- 92 -
обработки введенного будет выдан результат. Таким образом, для того,
чтобы работать интерактивно со схемным процессом, вы могли бы просто
набирать все определения и описания функций через данное приглашение.
Возможно, что у вас уже есть ранее написанный исходный схемный код в
некотором файле и было бы легче проделывать всю работу в этом файле, а
затем по необходимости пересылать определения в буфер схемного
процесса.
Если этот исходный файл оканчивается на ".ss" или на ".scm", то
он автоматически будет загружен в схемном режиме, когда вы откроете
его с помощью C-x C-f. Если, по каким-либо причинам, он оказался в
другом режиме, то вы можете сделать это, набрав "M-x scheme-mode".
Этот схемный режим scheme-mode не тот же самый, когда запускается
буфер со схемным процессом; более того, буфер с исходным кодом, будучи
в режиме scheme-mode, имеет специальные команды для взаимодействия с
буфером схемного процесса.
Если вы находитесь внутри определения функции в буфере исходного
схемного файла и наберете C-c C-e, то это определение будет "передано"
в буфер процесса - в точности так, как если бы вы сами его туда ввели.
C-c M-e перешлет определение и, затем, переключит вас в буфер схемного
процесса для совершения некоторой интерактивной работы. C-c C-l
загружает файл схемного кода (последняя команда работает и для буфера
схемного процесса, и для буфера с исходным схемным кодом). И также,
как и в других режимах составления программ, нажатие клавиши [Tab]
произведет корректный отступ очередной строки.
Если вы находитесь внутри приглашения в буфере схемного процесса,
вы можете использовать команды M-p и M-n, чтобы пролистать ваши
предыдущие команды (т.е. input history). Т.е. если вы отлаживаете
функцию 'rotate' и уже применяли ее к аргументам в буфере схемного
процесса, например, так:
> (rotate (a b c d e))
то вы можете снова запустить эту команду, набрав M-p в приглашении.
Нет нужды заново набирать длинные выражения в приглашении схемного
процесса - приобретя привычку использовать "input history", вы
- 93 -
сэкономите большое количество времени.
Emacs "знает" достаточно мало языков программирования: C, C++,
Lisp and Scheme - только некоторые из них. Вообще говоря, он "знает",
как размещать текст во время составления программ, только
"интуитивно".
8.11.3 Режим "Mail" (почтовый)
Кроме всего прочего с помощью Emacs'а вы можете редактировать и
посылать почтовые сообщения. Для того, чтобы открыть почтовый буфер,
наберите C-x m. Вы должны заполнить два поля: "To:" ("Кому:") и
"Subject:" ("Назначение:"), а затем нажмите C-n, чтобы внизу появилась
разделительная черта в теле сообщения (которая сначала будет пуста).
Не изменяйте и не стирайте ее, т.к. иначе Emacs будет не в состоянии
послать ваше собщение - он использует эту строку для отделения
заголовка сообщения, который содержит информацию о том, куда послать
сообщение, от его дейсвительного содержимого.
Ниже этой разделительной черты вы можете набирать все, что
угодно. Когда будете готовы отправить сообщение, просто наберите C-c
C-c, и Emacs отправит его, а после этого закроет почтовый буфер.
8.12 Как работать еще более эффективно
Опытные пользователи Emacs'а очень щепетильны в отношении
эффективности. По сути дела, все заканчивается тем, что им приходится
тратить достаточно много времени на поиск более эффективных способов.
Мне не хотелось бы, чтобы это случилось и с вами, поскольку, есть
несколько простых советов, следуя которым вы станете более
квалифицированным пользователем Emacs'а. Иногда опытные пользователи
ставят в глупое положение новичков, которые, по какой-то причине, не
знают всех этих трюков - люди начинают заботиться о том, как
"правильно" пользоваться Emacs'ом. Мне следовало бы осудить этот вид
элитизма, если бы у меня самого не было "рыльцо в пушку". Итак:
- 94 -
Когда вы передвигаетесь по тексту, используйте наиболее быстрые
доступные средства. Зная, что C-f это "вперед на символ", вы можете
догадаться, что M-f это "вперед на слово". C-b это "назад на символ".
Догадайтесь, что такое M-b? Однако, это не все: вы можете
передвинуться вперед на одно предложение, когда после его конца стоит
два пробела (Иначе Emacs будет не в состоянии разобраться, где
кончается предыдущее и начинается следующее предложение). M-a означает
"назад на предложение".
Если вы застали себя за повторным нажатием C-f для того, чтобы
добраться до конца строки, то вам должно быть стыдно, убедитесь, что
во вместо этого вы пользуетесь C-e и C-а, чтобы добраться до начала
строки. Если вы многократно пользуетесь C-n, чтобы передвинутся вниз
на один экран, то вам должно быть не менее стыдно, и далее всегда
пользуйтесь C-v. То же самое касается перемещения на экран вверх -
вместо C-p используйте M-v.
Если вы находитесь вблизи конца строки и обнаруживаете, что у вас
где-то ранее в строке есть опечатка или пропущено слово, не
пользуйтесь [Backspace] или [Delete], чтобы добраться до этого места.
Это потребует перепечатывания целых порций хорошего текста. Вместо
этого пользуйтесь комбинациями M-b, C-b и C-f, чтобы добраться до
нужного места, исправьте ошибку, а затем используйте C-e, чтобы
вернутся к концу строки.
Когда вам надо вписать имя файла, никогда не пишите полное имя.
Напечатайте столько, чтобы его можно было автоматически однозначно
идентифицировать, и и примените механизм "завершения" нажатием [Tab]
или [Space]. Незачем лишний раз нажимать клавиши, если можно
воспользоваться циклами ЦПУ.
Если вы печатаете какой-нибудь простой текст, и ваша функция
автопереноса была отключена, используйте M-q, что означает "заполнить
абзац" в обычных текстовых режимах. Это расположит абзац, в котором вы
находитесь так, как если бы был произведен перенос в каждой строке, не
заставляя вас это делать вручную. M-q будет работать одиннаково
независимо от того, где вы находитесь - в середине, в начале или в
конце.
- 95 -
Иногда удобно пользоваться функцией C-x u ("Undo"), которая
попытается убрать все последние изменения. Emacs догадается, насколько
"убрать", обычно он делает это очень деликатно. Повторяя это
многрактно, изменений будет убираться все больше и больше, пока Emacs
будет "понимать", что делать.
8.13 Настройка Emacs
Emacs настолько большой и сложный, что имеет даже собственный
язык программирования! Я не шучу, чтобы настроить Emacs в соотвествие
с вашими требованиями, вам пришлось бы писать программы на этом языке.
Он называется Emacs Lisp, и это диалект Lisp'а. Поэтому, если вы имели
предыдущий опыт работы на Lisp'е, он вам покажется достаточно
знакомым. Если нет - не волнуйтесь, я не собираюсь значительно
углубляться, так как он лучше познается в работе. Чтобы действительно
узнать о программировании Emacs'а, вам пришлось бы обратиться к
справочной информации по Emacs Lisp и просмотреть множество программ
на нем.
Большинство функциональных возможностей Emacs'а определено в
файлах, написанных на Emacs Lisp. Большая их часть распространяется
вместе с Emacs'ом и все это в совокупности называется "Emacs Lisp
Library". Расположение этой библиотеки зависит от того, каким образом
Emacs был инсталирован в вашей системе, обычно располагается в
/usr/lib/emacs/lisp, /usr/lib/emacs/19.19/lisp и т.п.. "19.19" - номер
версии Emacs'а, и он может отличаться в вашей системе.
Вам не нужно просматривать вашу файловую систему в поисках этой
библиотеки, потому что Emacs хранит информацию об этом в переменной
load-path. Для того, чтобы выяснить значение этой переменной, ее
необходимо "вычислить"; т.е. довести до интерпретатора Emacs Lisp ее
значение. Существует специальная функция для вычисления выражений
Lisp'а в Emacs'е, называемая lisp-interaction-mode (режим
взаимодейсвия с Lisp'ом). Обычно в этом режиме имеется буфер,
называемый "*scratch*". Если вы не можете найти его, создайте новый
буфер под любым именем и наберите "M-x lisp-interaction-mode" в нем.
- 96 -
Теперь у вас появилось рабочее пространство для взаимодействия с
интерпретатором Emacs Lisp'а. Наберите следующее:
load-path
а затем в конце нажмите C-j. В этом режиме lisp-interaction-mode
комбинация C-j связывается с eval-print-last-sexp. "Sexp" означает
S-expression (S-выражение), т.е. просто "сбалансированная" группа
круглых скобок, ничего не содержащая. Пожалуй, это слишком просто
звучит, но вы почуствовали бы, что это означает, если бы работали с
Emacs Lisp. В любом случае, вычисление load-path даст вам примерно
следующее:
load-path C-j
("/usr/lib/emacs/site-lisp/vm-5.35" "/home/kfogel/elithp"
"/usr/lib/emacs/site-lisp" "/usr/lib/emacs/19.19/lisp")
Разумеется это не будет выглядеть одинаково в разных системах,
поскольку, это зависит от того, как Emacs был установлен. Пример,
приведенный выше, взят с моего 386 PC, на которой работает LINUX. Как
показано выше, load-path - это некий список строк. Каждая строка в
этом списке представляет собой директорию, которая может содержать
файлы на Emacs Lisp'е. Когда Emacs'у требуется загрузить файл с
Lisp'овским кодом, он ищет его во всех этих директориях по очереди.
Если директория указана, а фактически не существует, то Emacs просто
игнорирует ее.
Когда Emacs начинает работу, он автоматически пытается загрузить
файл .emacs, содержащийся в вашем личном каталоге. Соответственно,
если вы хотите иметь собственные настройки Emacs'а, то вам следует
поместить их в файл .emacs. Наиболее часто используемые настройки -
это реакции на различные комбинации клавиш, вот как их задают:
(global-set-key "\C-c l" 'goto-line)
global-set-key - это функция двух аргументов: клавишная
комбинация и соответствующее ей действие. Слово "global" означает, что
- 97 -
эта комбинация будет действовать во всех основных режимах (сущесвует и
другая функция, local-set-key, которая задает комбинацию, действующую
в пределах одного буфера). Выше я поставил в соответствие C-c l
функции goto-line. Эта комбинация описана с помощью некоторой строки.
Специальный синтаксис "\C-" означает нажатую клавишу [Control]
во время нажатия клавиши . Аналогично, "M-" для
мета-клавиши.
Все это хорошо, но как я мог знать, что имя этой функции это
"goto-line"? Я могу знать, что хочу сопоставить комбинацию C-c l
некоторой функции, которая запрашивает номер строки, а затем
перемещает курсор на эту строку, но но как же я узнаю имя этой
функции?
Вот здесь как раз самый подходящий случай воспользоваться
средствами встроенной помощи. Как только вы определились с тем, какую
функцию ищете, вы можете использовать Emacs, чтобы узнать ее точное
имя. Вот самый быстрый и "грязный" способ: поскольку Emacs делает
завершение имен функций, просто наберите C-h f (что, как вы помните,
описывает функцию), а затем просто нажмите [Tab]. Это является
запросом для Emacs'а сделать завершение для пустой строки - другими
словами, это завершение будет соответствовать любой простой функции!
Это может занять немного времени, поскольку Emacs имеет так много
встроенных функций, но он отобразит их столько, сколько позволит ваш
экран.
Сейчас нажмите C-g, чтобы выйти из "описывателя" функций.
Появится буфер, называемый "*Completions*" ("*Завершения*"), который
содержит только что сгенерированный список завершений. Переключитесь в
этот буфер. Теперь вы можете использовать C-s для поиска похожих
функций. Например, можно смело предположить, что функция, которая
запрашивает о номере строки и переводит курсор, содержит в своем имени
слово "line". Таким образом, просто найдите строку "line", и, в конце
концов, найдете то, что искали.
Если вы предпочитаете другой метод, пользуйтесь C-h a, команда
apropos, чтобы показать все функции, чьи названия содержат данную
строку. На мой взгляд, результат работы команды apropos немного
- 98 -
труднее упорядочить, чем просто поиск в списке завершений, но вам
может показаться иначе. Попробуйте оба метода.
Всегда существует возможность, что у Emacs'а нет предопределенной
функции, делающей именно то, что вам нужно. В данном случае вам
придется написать функцию самому. Я не собираюсь рассказывать о том,
как это делать, вам придется обратиться к библиотеке Emacs Lisp
Library за примером определения функции и прочитать справочную
информацию Info pages о Emacs Lisp. Если вы знаете местного "Guru" по
Emacs'у, спросите его, как это делается. Определение собственных
функций в Emacs'е - не такое уж трудное дело, кстати, в прошлом году я
написал сто тридцать одну, или около того. Это требует небольшой
практики, но кривая обучения совсем не является крутой.
Следующее, что люди делают в их собтвенном .emacs'е, это придание
определенным переменным предпочтительных значений. Например, запустите
заново Emacs, предварительно поместив в ваш файл .emacs следующее:
(setq inhibit-startup-message t).
Emacs проверяет значение переменой inhibit-startup-message, для
того, чтобы решить, выводить ли при запуске определенную информацию по
версии и сообщение об отсутствии всяческих гарантий. Выражение на
Lisp'е, приведенное выше, использует команду setq для присвоения
данной переменной значения "t", что означает логичение значение
"истина" в Lisp'е. Противоположное к "t" это "nil", что означает
значение "ложь" в Emacs Lisp'е. Вот две вещи из моего .emacs, которые
вы можете счесть полезными:
(setq case-fold-search nil); поиск осуществляется в любом случае
;; делает отступ в программах на C таким, каким нужно:
(setq c-indent-level 2)
Первое выражение делает поиск независимым от случая, включая
isearch, т.е. поиск будет производиться как для верхнего, так и для
нижнего регистров, даже если искомая строка содержит только символы в
нижнем регистре. Второе выражение устанавливает отступ по умолчанию
для выражений на языке C немного меньшим, чем обычно (это кому как
- 99 -
нравится), я нахожу, что это облегчает чтение C-кода.
Символ комментария в Lisp'е это ";". Emacs игнорирует все, что
следует за ней, если только он не встречается в строке символов
следущим образом:
;; these two lines are ignored by the Lisp interpreter, but the
;; s-expression following them will be evaluated in full:
(setq some-literal-string "An awkward pause; for no purpose.")
Это неплохая идея, отмечать комментариями ваши изменения в файлах
на Lisp'е, поскольку через пол года вы не будете помнить, что вы имели
в виду, модифицируя их. Если комментарии появляются в строке сами по
себе, то им должны предшествовать ";;". Это помогает Emacs'у правильно
осуществлять отступ в файлах на Lisp'е.
Вы можете узнать о внутренних переменных Emacs'а теми же
способами, что и о функциях. Пользуйтесь C-h v, describe-variable, для
составления списка завершений, или C-h C-a, apropos. Apropos
отличается от C-h a, command-apropos, тем, что он показывает не только
функции, но и переменные.
Расширение по умолчанию в файлах на Emacs Lisp'е - ".el", как в
"c-mode.el". Однако, для того, чтобы программы на Lisp'е работали
быстрее, Emacs позволяет ее побайтно откомпилировать, и данные
откомпилированные файлы оканчиваются на ".elc" вместо ".el".
Исключение составляет файл .emacs, который не требует расширения
".el", так как Emacs итак знает, что именно его следует искать при
запуске.
Для того, чтобы загрузить файл с кодом на Lisp'е в интерактивном
режиме, наберите M-x load-file. Это приведет к выдаче запроса о имени
файла. Чтобы загружать Lisp'овские файлы из других Lisp'овских файлов,
делайте следующее:
(load "c-mode") ; заставить Emacs загрузить код из файла c-mode.el или
;; c-mode.elc
- 100 -
Сначала Emacs добавит к указанному в команде имени расширение
.elc и попытается найти файл с таким именем по путям, указанным в
переменной load-path. В случае неудачи он пробует то же самое
проделать с расширением .el; если же и это не принесло результатов, то
он пропускает эту символьную строку. Вы можете побайтно
откомпилировать файл с помощью команды M-x byte-compile-file, но если
вы часто модифицируете файл, то, возможно, этого не стоит делать. Вам
никогда не следует побайтно компилировать ваш .emacs, как, впрочем, и
давать ему расщирение .el.
После того, как был загружен ваш .emacs, Emacs пытается загрузить
файл под именем default.el. Обычно он располагается в одной из
директорий, хранимых в переменной load-path, которая называется
site-lisp, или local-elisp, или нечто вроде этого (см. выше пример для
load-path). Пользователи, которые овладевают Emacs'ом в
мноогопользовательских системах, пользуются default.el для внесения
изменений, которые влияют на Emacs всех пользователей, поскольку, их
Emacs каждого загружает этот файл после их персонального .emacs. Также
не стоит побайтно компилировать default.el, т.к. он достаточно часто
подвергается модификациям.
Если ваш .emacs содержит некоторые ошибки, Emacs вместо попытки
загрузить default.el просто остановится, высвечивая сообщение "Error
in init file" ("Ошибка в файле инициализации"). Если вы увидели
подобное сообщение, то, вероятно, что-то не в порядке с вашим .emacs.
Есть еще один выражения, который часто используется в .emacs.
Emacs Lisp Library иногда предлагает многофункциональные пакеты для
осуществления одних и тех же вещей различными способами. Это означает
то, что вы должны определить, какой вы хотите использовать, иначе, вы
получите пакет по умолчанию, который далеко не всегда наиболее
соответствует всем вашим целям. Одна из областей, где случается
подобное, это Scheme-режим Emacs'а (смотpите выше). Существует два
различных интерфейса, распространяемых вместе с Emacs'ом (по крайней
мере, в 19-ой версии) : x-scheme и cmuscheme.
- 101 -
prompt> ls /usr/lib/emacs/19.19/lisp/*scheme*
/usr/lib/emacs/19.19/lisp/cmuscheme.el
/usr/lib/emacs/19.19/lisp/cmuscheme.elc
/usr/lib/emacs/19.19/lisp/scheme.el
/usr/lib/emacs/19.19/lisp/scheme.elc
/usr/lib/emacs/19.19/lisp/xscheme.el
/usr/lib/emacs/19.19/lisp/xscheme.elc
Мне гораздо больше понравился интерфейс, предлагаемый cmuscheme,
чем x-scheme, но Emacs по умолчанию пользуется последним. Как я могу
заставить Emacs работать согласно моим требованиям? Я помещаю в мой
.emacs следующее:
;; Заметьте, как выражение может быть разбито на две строки. Lisp просто
;; игнорирует пустые места:
( autoload 'run-scheme "cmuscheme"
"Run an inferior Scheme, the way I like it." t)
Функция autoload берет имя функции(отмеченной знаком " ' ",в
связи с соглашениями, принятой в Lisp'е) и сообщает Emacs'у, что
данная функция описана в определенном файле. Файл является вторым
аргументом, который представлен строкой (без расширений ".el" и
".elc"), являющейся именем данного файла, который следует искать по
путям, указанным в переменной load-path.
Остальные аргументы являются альтернативными, необходимыми лишь в
случае, когда третий аргумент - документационная строка для этой
функции, так что, если вы вызываете для нее describe-function, то
получаете полезную информацию. Четвертый аргумент сообщает Emacs'у,
что данная автозагружаемая функция может быть вызвана в интерактивном
режиме (т.е. через M-x). Это очень важно в данном случае, потому что
должна быть возможность начать схемный процесс, работающий под
Emacs'ом, просто набрав M-x run-scheme.
Тогда после того, как run-scheme была определена как
автозагружаемая функция, что произойдет, если я наберу M-x run-scheme.
Emacs смотрит на функцию run-scheme, видит, что она начинает
автозагружаться, и загружает файл, проименованный автозагрузкой (в
- 102 -
данном случае "cmuscheme"). Поскольку, побайтно откомпилированный файл
cmuscheme.elc существует, то Emacs будет его загружать. Данный файл
ОБЯЗАН определить функцию run-scheme, иначе будет автозагрузочная
ошибка. К счастью, он в самом деле определяет run-scheme, поэтому все
идет гладко, и я получаю предпочитаемый схемный интерфейс. ((( 10:
между прочим, cmuscheme как раз тот интерфейс, о котором я говорил
ранее в разделе по работе в схемном режиме, поэтому, если вы хотите
пользоваться тем, о чем там шла речь, то вам необходимо убедиться, что
вы запустили cmuscheme)))
Автозагрузка - это своего рода обещание Emacs'у того, что когда
наступит время, то он сможет найти означенную функцию в файле, который
вы ему укажите. В свою очередь, вы получаете некоторый контроль, над
тем, что загружается. Также автозагрузки помогают уменьшить объем
памяти, занимаемой Emacs'ом за счет того, что определенные настройки
не будут загружены до тех пор, пока они не потребуются. Многие команды
в дейтвительности не определяются как функции, когда запускается
Emacs. Более того, они просто автозагружаются из определенного файла.
Если вы никогда не обращаетесь к команде, она никогда не загружается.
Эта экономия пространства жизненно необходима для функционирования
Emacs'а: если бы он загружал каждый доступный файл в Lisp библиотеке,
то Emacs'у потребовалось двадцать минут для того, чтобы просто
запуститься, а после этого он занял бы всю доступную память на вашей
машине. Не беспокойтесь, вам не придется устанавливать все эти
автозагрузки в вашем .emacs; о них позаботились при создании Emacs'а.
8.14 Узнавая нечто большее.
Я не сказал вам всего, что можно узнать об Emacs'е. На самом
деле, я не думаю, что сказал вам хотя бы один процент. В то время, как
вы знаете достаточно для элементарного пользования, существует большое
количество удобств и приемов, экномящих время, с которыми вам
следовало бы познакомиться. Лучший способ это сделать - дождаться,
когда вам что-либо понадобится самому, затем поискать функцию, которая
это делает.
Даже нельзя выразить, насколько важно удобство системы подсказок
в Emacs'е. Например, допустим, вы хотите, чтобы было возможно
- 103 -
поместить содержимое некоего файла в буфер, в котором загружен другой
файл так что, данный буфер будет содержать оба этих файла. Если бы вы
догадались, что есть команда insert-file, то были бы правы. Для того,
чтобы проверить вашу гениальную догадку, наберите C-h f. В ответ на
приглашение в мини-буфере введите имя функции, о которой вам нужна
подсказка. Так как вы знаете, что дейсвует механизм завершений по
именам функций, и вы можете догадаться, что команда, которую вы ищете,
начинается с "insert", то наберите insert и нажмите [Tab]. Это покажет
вам все функции, имена которых начинаются с "insert", в частности
"insert-file".
Итак, вы завершаете имя функциии читаете о том, как она работает,
а затем пользуетесь M-x insert-file. Если вам интересно, соответсвует
ли этой функции какая-нибудь клавишная комбинация, вы набираете C-h w
insert-file [Return] и выясняете. Чем больше вы узнаете о возможностях
системы подсказок (help) Emacs'а, тем легче вам распросить Emacs о нем
самом. Умение проделывать это вместе с духом исследования и желанием
открывать новые пути может увенчаться экономией нажатия клавиш.
Для того, чтобы заказать копию руководства пользователя по
Emacs'у и/или руководства по программированию на Emacs Lisp, пишите по
адресу:
Free Software Foundation
675 Mass Ave
Cambridge, MA 02139
USA
Оба этих руководства распространяются в месте с Emacs'ом в виде
файлов в формате, распознаваемым Info Documentation Reader (C-h i). В
некоторый момент вам следует набрать C-h C-c, чтобы почитать условия
распространения по Emacs'у. Это интересней, чем вам может показаться и
поможет лучше прочуствовать понятие свободного программного
обеспечения. Если вы думаете, что термин "free software" означает
только то, что данная программа ничего не стоит, то пожалуйста
прочитайте эти условия распространения, как только у вас появится
время!
|
|