[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16. Ваш файл `.emacs'

"Вы не должны любить Emacs чтобы любить его" --- в этом парадокслальном утверждении секрет GNU Emacs. Просто, `из коробки', Emacs --- это только редактор. Большинство людей, которые используют Emacs, настраивают его, чтобы он соответствовал их собственным нуждам.

GNU Emacs в основном написан на Emacs Lisp; это значит, что записав некоторое выражение на Emacs Lisp вы можете изменить или расширить Emacs.

Настройка Emacs по умолчанию  
16.1 Общесистемные файлы инициализации  
16.2 Установка переменных для одной сессии  
16.3 Начало файла `.emacs'  
16.4 Режимы Text и Auto Fill  
16.5 Почтовые алиасы  
16.6 Режим отступа по табуляции (Indent Tabs)  
16.7 Некоторые привязки клавиш  
16.8 Загрузка файлов  
16.9 Автозагрузка  
16.10 Простое расширение: line-to-top-of-window  Создаем функции; связываем ее с клавишей.
16.11 Таблицы ключей  
16.12 Цвета X11  Цвета в версии 19 для системы X Window.
16.13 Разное для версии 19  Автоматически изменяем размер минибуфера...
16.14 Измененная строка режима  

Настройка Emacs по умолчанию

Есть люди которых устраивает конфигурация Emacs по умолчанию. Обычно Emacs запускает режим С, когда вы редактируете С файл, запускает режим Fortran когда вы редактируете программу на Fortran, и запускает режим Fundamental когда вы редактируете простой файл с неизвестным расширением. Все это имеет смысл, если вы не знаете кто будет использовать Emacs. Кто знает, что захочет сделать человек с обычным файлом? Режим Fundamental самый подходящий для этого режим, точно также как и режим С --- подходящий выбор для редактирования программ на языке С. Но если вы знаете кто и для каких целей будет использовать Emacs --- вы сами --- тогда это имеет смысл настроить Emacs.

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

Вы можете настроить или расширить Emacs написав или изменив файл `~/.emacs'. Это ваш персональный файл инициализации; его содержимое написанное на Emacs Лиспе, говорит Emacsу что делать.

В этой главе описан простой файл `.emacs'; для получения дополнительной информации смотрите section `The Init File' in The GNU Emacs Manual, и section `The Init File' in The GNU Emacs Lisp Reference Manual.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.1 Общесистемные файлы инициализации

Кроме вашего персонального инициализационого файла, Emacs автоматически загружает различные инициализационные файлы для всех пользователей компьютера, если они существуют. Они имеют ту же самую форму что и ваш файл `.emacs', но загружаются всеми.

Два общесистемных файла инициализации `site-load.el' и `site-init.el' загружаются в Emacs и затем `дампируются' если создается `дампированная' версия Emacs, как обычные файлы. (Дампированный Emacs загружается более быстро. Однако, если однажды файл загружен и дампирован, то изменения в нем не приведут к изменению поведения Emacs если вы сами не загрузите или не передампируете Emacs). See section `Building Emacs' in The GNU Emacs Lisp Reference Manual, и файл `INSTALL' в дистрибутиве).

Три других общесистемных файла инициализации загружаются автоматически каждый раз, когда вы запускаете Emacs, если они существуют. Это файлы `site-start.el', который загружается перед вашим файлом `.emacs', файл `default.el' и файл для типа терминала, которые оба загружаются после вашего файла `.emacs'.

Установки и определения в вашем файле `.emacs' перепишут конфликтующие установки и определения в файле `site-start.el' если он существует; но установки и определения в файле `default.el' и файле типа терминала перепишут ваши установки в файле `.emacs'. (Вы можете защитить споры с терминалом установив term-file-prefix в nil. See section Простое расширение.)

Файл `INSTALL' который поставляется с дистрибутивом, содержит описание файлов `site-init.el' и `site-load.el'.

Файлы `loadup.el', `startup.el' и `loaddefs.el' управляют загрузкой Emacs. Эти файлы находятся в каталоге `lisp' дистрибутива Emacs и их стоит внимательно изучить и заново использовать.

В файле `loaddefs.el' содержится много полезных предложений насчет того, что можно поместить в ваш собственный файл `.emacs' или в файл всего компьютера.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.2 Установка переменных для одной сессии

Моя копия Emacs для версии 19.23 имеет 392 настройки которые вы можете изменить с помощью команды edit-options. Эти `настройки' --- всего лишь переменные, которые мы уже видели раньше и определяли их с помощью defvar.

Emacs определяет будет ли переменная легко устанавливаемой, в зависимости от первого символа в ее строке документации; если первый символ звездочка `*', то эта переменная может быть переопределена пользователем. (See section Инициализация переменной с помощью defvar.)

Команда edit-options отображает все переменные в Emacs, которые люди, которые создавали библиотеки Emacs Lisp, посчитали, что они должны быть легко настраиваемые. Это обеспечивает легкий в использовании интерфейс для установки этих переменных.

С другой стороны, опции измененные с помощью edit-options устанавливаются только для вашей текущей текущей сессии редактирования. Новые значения не сохраняются между сессиями. Каждый раз, когда стартует Emacs, он считывает первоночальное значение defvar в исходной программе. Чтобы сохранить изменение от одной сессии к другой, вам нужно использовать выражение setq в вашем файле `.emacs' или в каком нибудь другом файле, который загружается каждый раз, когда вы запускаете сессию Emacs.

Я обычно использую команду edit-options для того, чтобы посмотреть какие переменные я могу установить в моем файле `.emacs'. Я настоятельно рекомендую вам исследовать этот список.

Для получения дополнительной информации See section `Editing Variable Values' in The GNU Emacs Manual.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.3 Начало файла `.emacs'

Когда вы запускаете Emacs при этом загружается и ваш файл `.emacs', конечно если вы не задали в командной строке опцию `-q'. (emacs -q даст вам ненастроенный Emacs).

В файле `.emacs' содержатся выражения на Emacs Lisp. Часто это не более чем выражения для установки некоторых значений; иногда это определения функций.

See section `The Init File `~/.emacs'' in The GNU Emacs Manual, для получения короткого описания файла инициализации.

В этой главе мы будет обсуждать тоже самое, но эти примеры взяты из полного, долго используюемого файла `.emacs' --- моего собственного файла.

Первая часть состоит из комментария; напоминании себе. Сейчас конечно я все это помню, но когда я начинал, то я часто это забывал.

 
;;;; Bob's .emacs file
; Robert J. Chassell
; 26 September 1985 

Взгляните на дату! Я начал этот файл уже довольно давно. И с тех пор я постоянно добавляю к нему что-то новое.

 
; Каждый раздел в этом файле начинается с четырех знаков точка с
; запятой и каждое вхождение начинается со строки с трех точек с
; запятой.

Это описывает обычные соглашения для комментариев в Emacs Lisp. Все на строке^ что следует за точкой с запятой --- это комментарий. Две, три и четыре точки с запятой используются как маркеры раздела и подраздела. (See section `Comments' in The GNU Emacs Lisp Reference Manual, для получения дополнительной информации о комментариях).

 
;;;; Клавиша Помощи
; Control-h это клавиша помощи; 
; после того как вы нажали control-h, нажмите какую-нибудь букву
; означающую тему о которой вы хотите узнать.
; Для получения обьяснений о возможностях помощи, 
; нажмите control-h три раза подряд.

Только напоминание: для получения помощи нажмите C-h три раза подряд.

 
; Чтобы получить информацию о каком-нибудь режиме нажмите control-h m
; если данный режим включен для этого буфера.  Например, чтобы
; получить информацию о режиме mail, запустите режим mail и нажмите
; control-h m

`Помощь о режиме', как я это называю --- очень полезная возможность. Обычно она говорит вам все^ что вам надо знать.

Конечно вам не обязательно включать подобные комментарии в ваш файл `.emacs'. Я включил их в мой, поскольку я постоянно забывал о помощи для режима и соглашениях о комментариях --- но я всегда мог вспомнить об этом если заглядывал сюда.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.4 Режимы Text и Auto Fill

Сейчас мы рассмотрим часть которая `включает' основной режим Text и вспомогательный режим Auto Fill.

 
;;; режим Text и режим Auto Fill
; Следующие две линии включают по умолчанию в Emacs режим Text 
; и режим Auto Fill --- это в самый раз для писателей, которые хотят
; писать прозу, а не программы.
(setq default-major-mode 'text-mode)
(add-hook 'text-mode-hook 'turn-on-auto-fill)

Это первая часть файла `.emacs' которая делает что-то реальное, кроме напоминания забывчивому человеку!

В первой строке выражение в скобках говорит Emacs, что надо включать режим Text когда он открывает файл и если там не надо включать какой-нибудь другой режим, например, режим C.

Когда Emacs открывает файл, то он смотрит на расширение файла, если оно существует. (Расширение --- это часть файла которое идет после знака `.'). Если файл имеет расширение `.c' или `.h', то тогда Emacs включает режим С. Также Emacs смотрит на первую не пустую строку файла; если там написано `-*- C -*-', то тогда Emacs включает режим С. Emacs автоматически обрабатывает список расширений и спецификаций, которые он использует. Кроме этого Emacs анализирует последнюю страницу в каждом буфере и ищет там "список локальных переменных", если он есть.

See section `How Major Modes are Chosen' in The GNU Emacs Manual.

See section `Local Variables in Files' in The GNU Emacs Manual.

Сейчас вернемся снова к нашему файлу `.emacs'.

Снова посмотрим на эту строку --- как же она работает?

 
(setq default-major-mode 'text-mode)

Эта строка --- короткое, но завершенное выражение Emacs Lisp.

Мы уже знакомы с setq. Это выражение присваивает переменной default-major-mode соответствующее значение, в нашем случае это text-mode. Апостроф перед text-mode заставляет Emacs не вычислять эту переменую, а взять ее как есть. See section Присваиваем Переменной Значение, для того, чтобы вспомнить как работает setq. Основное, что здесь можно отметить, так это то, что нет разницы между процедурой, которую вы используете для того, чтобы установить переменную в своем файле `.emacs' и процедурой где-то еще внутри Emacs.

Вот и вторая строка:

 
(add-hook 'text-mode-hook 'turn-on-auto-fill)

В этой строке команда add-hook, добавляет turn-on-auto-fill к переменной, которая называется text-mode-hook. turn-on-auto-fill --- это имя программы которая как вы уже наверное догадались включает режим Auto Fill (Автозаполнение).

Каждый раз, когда Emacs включает режим Text, Emacs запускает команды которые `прицеплены' к режиму Text. Поэтому, каждый раз, когда Emacs включает режим Text, то Emacs также включает и вспомогательный режим Auto Fill.

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

Режим Text, кроме других действий, также устанавливает таблицу синтаксиса для удобной работы писателей. В режиме Text Emacs считает апостроф такой-же частью слова как и букву; но Emacs не считает точку или пробел такой-же частью слова. То есть, M-f переместит курсор через слово `it's'. С другой стороны, в коде на языке C комбинацияM-f остановит курсор как раз после буквы `t' в слове `it's'.

Вторая строка заставляет Emacs включать режим Auto Fill, при включении режима Text. В режиме Auto Fill Emacs автоматически вставляет символ новой строки в том случае, когда строка слишком широка и переносит дополнительную часть строки вниз к следующей линии. Emacs разбивает строки между словами, а не внутри них.

Когда режим Auto Fill отключен, то строки продолжают расти вправо, по мере их набора. В зависимости от того, в какое значение вы установили переменную truncate-lines, набираемые вами слова либо будут теряться за правой стороной экрана, либо будут показаны в несколько неудобном формате, в виде продолжающейся строки экрана.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.5 Почтовые алиасы

Здесь приведено выражение a setq для `включения' почтовых алиасов, вместе с другими заметками.

 
;;; Режим Mail (почта)
; Для входа в режим mail, наберите `C-x m'
; Для запуска RMAIL (для чтения почты), 
; наберите `M-x rmail'

(setq mail-aliases t)

Данная команда setq устанавливает значение переменной mail-aliases равным t. Поскольку t обозначает истинное значение, то данная строка говорит, "Да, используйте почтовые алиасы".

Почтовые алиасы являются удобными сокращениями для длинных адресов электронной почты, или списков адресов электронной почты. Алиасы хранятся в файле `~/.mailrc'. Вы записываете алиасы примерно так:

 
alias geo george@foobar.wiz.edu

Когда вы пишете сообщение к George, то адресуете его к `geo'; а почтовая программа автоматически раскроет `geo' до полного адреса.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.6 Режим отступа по табуляции (Indent Tabs)

По умолчанию, Emacs при форматировании области вставляет табуляцию вместо нескольких пробелов. (Например, вы можете одновременно сделать отступ для множества строк с помощью команды indent-region). Табуляция выглядит прекрасно на терминале или при обычной печати, но дает плохой результат когда вы используете TeX или Texinfo, поскольку TeX игнорирует табуляцию.

Следующая строка отключает режим Indent Tabs:

 
;;; Предотвращение лишней табуляции
(setq-default indent-tabs-mode nil)

Заметьте, что эта строка использует команду setq-default, а не setq, которую мы видели раньше. Команда setq-default устанавливает значения только в тех буферах, которые не имеют своего собственного значения для переменной.

See section `Tabs vs. Spaces' in The GNU Emacs Manual.

See section `Local Variables in Files' in The GNU Emacs Manual.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.7 Некоторые привязки клавиш

Теперь рассмотрим некоторые мои любимые привязки клавиш:

 
;;; Сравнение окон
(global-set-key "\C-cw" 'compare-windows)

compare-windows --- это отличная команда, которая сравнивает текст в текущем окне, с текстом в следующем окне. Она начинает сравнение с точки в каждом окне, и перемещается по тексту в каждом из окон настолько, насколько они совпадают. Я постоянно использую эту команду.

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

Это делает команда global-set-key. За нею следует привязка клавиш. В файле `.emacs', привязки клавиш записываются так, как показано: \C-c обозначает `control-c', что означает `одновременно нажмите клавиши control и c'. Знак w означает, `нажмите клавишу w'. Привязка окружена двойными кавычками. Вы документации вы должны записывать это сочетание в виде C-c w. (Если вы хотите сделать привязку для клавиши META, например M-c, а не для клавиши CTL, то вы должны написать \M-c. Для ознакомления с подробной информацией See section `Rebinding Keys in Your Init File' in The GNU Emacs Manual.)

Командой, которая запускается данным сочетанием клавиш является compare-windows. Заметьте, что перед compare-windows стоит одинарная кавычка; в противном случае, Emacs сначала попытается оценить символ, чтобы определить его значение.

Эти три вещи --- двойные кавычки, обратный слеш перед `C' и одинарная кавычка являются необходимыми частями привязки клавиш, которые я постоянно забываю. К счастью я помню, что я могу заглянуть в мой файл `.emacs' и адаптировать имеющийся там код.

Теперь вернемся к самой привязке: C-c w. Это сочетание объединяет префиксную клавишу, C-c, с отдельным символом, в данном случае, w. Этот набор клавиш, C-c за которым следует одиночный символ, строго зарезервирован для использования пользователями. Если вы даже пишете расширение для Emacs, то пожалуйста избегайте использования любой из этих клавиш для публичного использования. Вместо этого создайте сочетание, подобное C-c C-w. В противном случае мы выйдем за пределы `собственных' клавиш.

Вот другая привязка, с комментарием:

 
;;; Привязка для `occur'
; Я часто использую команду occur, так что я связываю ее с клавишей:
(global-set-key "\C-co" 'occur)

Команда occur показывает все строки в текущем буфере, которые подпадают под регулярное выражение. Совпадающие строки показываются в буфере, называющемся `*Occur*'. Этот буфер работает как меню для перехода к совпадениям.

Вот как можно удалить привязку клавиш, так что она больше не будет работать:

 
;;; Удалить привязку `C-x f'
(global-unset-key "\C-xf")

Вот причина для удаления привязок: я обнаружил, что я регулярно набираю C-x f тогда, когда я хочу набрать C-x C-f. Вместо нахождения файла, что я хочу сделать, я случайно устанавливаю ширину для заполненого текста, почти всегда в значение, которое я не хочу иметь. Поскольку я очень редко устанавливаю ширину заполнения текста, то я просто удаляю привязку,

Следующая команда переопределяет существующую клавишу:

 
;;; Переопределяет `C-x C-b' для вызова `buffer-menu'
(global-set-key "\C-x\C-b" 'buffer-menu)

По умолчанию, сочетание C-x C-b запускает команду list-buffers. Эта команда выводит список ваших буферов в другом окне. Поскольку я почти всегда хочу что-то сделать в этом окне, то я предпочитаю использовать команду buffer-menu, которая не только выводит список буферов, но и перемещает точку в это окно.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.8 Загрузка файлов

Много людей из сообщества GNU Emacs написали расширения к Emacs. По ходу времени, эти расширения часто включаются в новые выпуски. Например, пакеты Calendar и Diary теперь являются частью стандартного дистрибутива Emacs версии 19; они не были частью стандартного дистрибутива Emacs версии 18.

(Calc, который я считаю важной частью Emacs, мог бы быть частью стандартного дистрибутива, за тем исключением, что он слишком большой и поставляется отдельно).

Вы можете использовать команду load для оценки всего файла и таким образом, установки всех функций и переменных из файла в Emacs. Например:

 
(load "~/emacs/kfill")

Эта команда оценивает, т.е. загружает файл `kfill.el' (или если существует, то более быстрый, откомпилированный файл `kfill.elc') из подкаталога `emacs' вашего домашнего каталога.

(файл `kfill.el' был переделан Бобом Вайнером (Bob Weiner) из пакета `filladapt.el', написанного Kyle E. Jones и "обеспечивает нормальный, ровный перенос слов и заполнение параграфов с обработкой отступов, включенного текста из сообщений почты и новостей, а также комментариев языков Lisp, C++, PostScript или командного процессора." Я постоянно его использую и надеюсь, что он будет включен в стандартный дистрибутив).

Если вы загружаете много расширений, как это делаю я, то вы вместо указания точного положения файла. как было показано выше, вы можете указывать этот каталог как часть списка load-path самого Emacs. Затем, когда Emacs загружает файл, то он будет производить поиск в этом каталоге, точно также как и в списке каталогов по умолчанию. (Значение по умолчанию указывается в файле `paths.h' при сборке Emacs).

Следующая команда добавляет ваш каталог `~/emacs' в существующий список путей загрузки:

 
;;; Emacs Load Path
(setq load-path (cons "~/emacs" load-path))

В данном случае, функция load-library является интерактивным интерфейсом к функции load. Полный текст функции выглядит так:

 
(defun load-library (library)
  "Загружает библиотеку с именем LIBRARY.
Это интерфейс к функции `load'."
  (interactive "sLoad library: ")
  (load library))

Имя функции, load-library, пришло от использования слова `библиотека (library)' в качестве общепринятого синонима для слова `файл (file)'. Исходный текст для команды load-library находится в библиотеке `files.el'.

Другой интерактивной командой, которая делает немного отличающуюся работу, является load-file. See section `Libraries of Lisp Code for Emacs' in The GNU Emacs Manual, для получения информации о различии между load-library и этой командой.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.9 Автозагрузка

Вместо установки функции путем загрузки файла, которые ее содержит, или путем оценки определения функции, вы можете сделать функцию доступной, но не устанавливать её до её первого вызова. Эта техника называется автозагрузкой (autoloading).

Когда вы выполняете автозагруженные функцию, то Emacs автоматически оценивает файл, который содержит ее определение, и затем вызывает саму функцию.

При использовании автозагружаемых функций Emacs запускается быстрее, поскольку библиотеки не загружаются сразу; но вам нужно будет подождать немного времени при первом использовании такой функции, поскольку оценивается файл, содержащий данную функцию.

Редко используемые функции часто делают автозагружаемыми. Библиотека `loaddefs.el' содержит сотни автозагружаемых функций, начиная с bookmark-set и до wordstar-mode. Конечно, вы можете часто использовать `редкие' функции. В этом случае вы должны загрузить файл с данной функцией, с помощью выражения load в вашем файле `.emacs'.

В моем файле `.emacs' для Emacs версии 19.23, я загружаю 17 библиотек, которые содержат функции, которые иначе были бы сделаны автозагружаемыми. (В действительности, было бы лучше включить эти файлы в мой `дампированный' Emacs при его сборке, но я просто забыл это сделать. Для получения дополнительной информации о дампировании See section `Building Emacs' in The GNU Emacs Lisp Reference Manual, и файл `INSTALL').

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

Вот типичный пример:

 
(autoload 'html-helper-mode
  "html-helper-mode" "Edit HTML documents" t)

Это выражение производит автоматическую загрузку функции html-helper-mode. Она берет ее из файла `html-helper-mode.el' (или, если он существует, из откомпилированного файла `html-helper-mode.elc'.) Файл должен находиться в каталоге указанном в load-path. Документация сообщает, что этот режим поможет вам редактировать документы написанные с использованием HTML. Вы можете запустить этот режим интерактивно, с помощью команды M-x html-helper-mode. (Вам нужно продублировать документацию из функции в выражении для автоматической загрузки, поскольку сама функция еще не загружена, так что ее документация еще не доступна).

Для получения дополнительной информации See section `Autoload' in The GNU Emacs Lisp Reference Manual.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.10 Простое расширение: line-to-top-of-window

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

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

Вот определение:

 
;;; Переместить строку в начало окна;  
;;; заменяем трехступенчатую комбинацию  C-u 0 C-l
(defun line-to-top-of-window ()
  "Move the line point is on to top of window."
  (interactive) 
  (recenter 0))

Теперь о привязке клавиш.

Хотя почти все содержимое файла `.emacs' для Emacs версии 18 работает и с версией 19, но все равно есть некоторые различия (также6 существуют новые возможности в Emacs 19).

В Emacs версии 19, вы можете записывать функциональные клавиши в виде `[f6]'. В 18-й версии, вы должны были указывать сочетания символов посылаемых клавиатурой когда вы нажимали функциональную клавишу. Например, клавиатура Zenith 29 посылалала ESC P когда я нажимал ее шестую функциональную клавишу; а клавиатура Ann Arbor Ambassador посылала сочетание ESC O F. Вы можете записывать эти сочетания как `\eP' и `\eOF'.

В моей файле `.emacs' для 18-й версии, я связывал line-to-top-of-window с клавишей, которая зависела от типа терминала:

 
(defun z29-key-bindings () 
  "Function keybindings for Z29 terminal."
  ;; ...
  (global-set-key "\eP" 'line-to-top-of-window))

(defun aaa-key-bindings () 
  "Function keybindings for Ann Arbor Ambassador"
  ;; ...
  (global-set-key "\eOF" 'line-to-top-of-window))

(Вы можете обнаружить, что посылают функциональные клавиши нажав на функциональную клавишу, а затем набрав C-h l (это функция view-lossage), которая отображает последние 100 введенных сочетаний клавиш).

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

 
;;; Отключаем предопределенное для терминала сочетание клавиш

; Следующий код отключает предопределенные, специфичные для терминала
; сочетания клавиш, такие как сочетания для vt100 в файле
; lisp/term/vt100.el.  
; Если нет предопределенных для терминала сочетаний клавиш, то
; вы можете закомментировать этот код.

(setq term-file-prefix nil)

Вот само выражение выбора:

 
(let ((term (getenv "TERM")))
  (cond 
   ((equal term "z29") (z29-key-bindings))
   ((equal term "aaa") (aaa-key-bindings))
   (t (message
       "No binding for terminal type %s."
       term))))

В Emacs версии 19, функциональные клавиши (также как и кнопки мыши, и не-ASCII символы) записываются в квадратных скобках, без знака вопроса. Я связываю line-to-top-of-window с клавишей F6 с помощью следующего выражения:

 
(global-set-key [f6] 'line-to-top-of-window)

Намного проще!

Для получения дополнительной информации, смотрите section `Rebinding Keys in Your Init File' in The GNU Emacs Manual.

Если вы используете и Emacs 18 и Emacs 19, то вы можете выбрать какой код оценивать, с помощью следующего условного оператора:

 
(if (string=
     (int-to-string 18)
     (substring (emacs-version) 10 12))
    ;; оцениваем код для версии 18
    (progn
       ... )
  ;; иначе, оцениваем код для версии 19
  ...


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.11 Таблицы ключей

Emacs использует таблицы ключей (keymaps) для записи того, какие клавиши вызывают какие команды. Отдельные режимы, такие как режим C или режим Text, имеют свои собственные таблицы ключей; специфические для режима таблицы ключей переопределяют глобальную таблицу ключей, которая делится между всеми буферами.

Функция global-set-key связывает, или переопределяет, ключ в глобальной таблице ключей. Наприме, следующий код связывает сочетание C-c C-l с функцией line-to-top-of-window:

 
(global-set-key "\C-c\C-l" 'line-to-top-of-window))

Специфические для режимов таблицы ключей связываются с использованием функции define-key, которая принимает в качестве аргументов нужную таблицу ключей, ключ и команду. Например, мой файл `.emacs' содержит следующее выражение для связывания команды texinfo-insert-@group с сочетанием C-c C-c g:

 
(define-key texinfo-mode-map "\C-c\C-cg"
  'texinfo-insert-@group)

Сама функция texinfo-insert-@group --- это небольшое расширение к режиму Texinfo, которое вставляет `@group' в файл Texinfo. Я использую эту команду все время и предпочитаю набирать три буквы C-c C-c g вместо шести --- @ g r o u p. (таг `@group' и соответствующий ему `@end group' являются командами, которые держат заключенный в них текст без разрывов между страницами; многие многостроковые примеры в этой книге окружены тагами `@group ... @end group'.)

Вот определение функции texinfo-insert-@group:

 
(defun texinfo-insert-@group ()
  "Insert the string @group in a Texinfo buffer."
  (interactive)
  (beginning-of-line)
  (insert "@group\n"))

(Конечно, я должен был использовать режим Abbrev для сокращения набора, вместо того, чтобы писать функцию для вставки слова; но я предпочитаю чтобы сочетания клавиш были похожими на привязки клавиш режима Texinfo).

Вы увидите множество выражений define-key в файле `loaddefs.el', а также в разных библиотеках, таких как `c-mode.el' и `lisp-mode.el'.

See section `Customizing Key Bindings' in The GNU Emacs Manual, для section `Keymaps' in The GNU Emacs Lisp Reference Manual, получения подробной информации о таблицах ключей.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.12 Цвета X11

Вы можете указывать цвета при использовании Emacs версии 19 вместе с оконной системой MIT X. (Все предыдущие примеры должны работать и в 18-й версии Emacs и в 19-й версии; а данный пример работает только с Emacs версии 19).

Я ненавижу цвета по умолчанию и указываю свои собственные.

Большинство моих настроек указаны в различных файлах инициализации X. Я пишу заметки для себя в моем файле `.emacs' для того, чтобы напомнить себе что я делал:

 
;; Я использую оконный менеджер TWM;
;; в моем файле ~/.xsession указано:
;    xsetroot -solid navyblue -fg white

В действительности корневое дерево X не является частью Emacs,но я все равно пишу себе напоминание.

 
;; В моем файле ~/.Xresources указано:
;     XTerm*Background:    sky blue
;     XTerm*Foreground:    white
;     emacs*geometry:      =80x40+100+0
;     emacs*background:    blue
;     emacs*foreground:    grey97
;     emacs*cursorColor:   white
;     emacs*pointerColor:  white

Вот выражения в моем файле `.emacs', которые устанавливают значения:

 
;;; Устанавливают цвета для isearch и протягивания
(set-face-foreground 'highlight "white" )
(set-face-background 'highlight "slate blue")
(set-face-background 'region    "slate blue")
(set-face-background
 'secondary-selection "turquoise")

;; Устанавливает цвета подсветки календаря
(setq calendar-load-hook
      '(lambda () 
         (set-face-foreground 'diary-face   "skyblue")
         (set-face-background 'holiday-face "slate blue")
         (set-face-foreground 'holiday-face "white")))

Различные оттенки голубого успокаивают мои глаза и не дают мне видеть блеск экрана.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.13 Разное для версии 19

Вот несколько настроек для Emacs версии 19:


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.14 Измененная строка режима

В заключение я расскажу о свойстве, которое я действительно люблю: об измененной строке режима.

Поскольку я работаю по сети, я заменил слово `Emacs: ', которое обычно написано на левой стороне строки режима, на имя системы --- в противном случае я забываю какой компьютер я использую. В дополнение я отображаю каталог по умолчанию, чтобы не забыть где я нахожусь и указываю строку на которой нахожусь, с помощью слова `Line'. Мой файл `.emacs' выглядит следующим образом:

 
(setq mode-line-system-identification  
  (substring (system-name) 0
             (string-match "\\..+" (system-name))))

(setq default-mode-line-format
      (list ""
            'mode-line-modified
            "<"
            'mode-line-system-identification
            "> "
            "%14b"
            " "
            'default-directory
            " "
            "%[(" 
            'mode-name 
            'minor-mode-alist 
            "%n" 
            'mode-line-process  
            ")%]--" 
             "Line %l--"
            '(-3 . "%P")
            "-%-"))

;; Установим новый формат по умолчанию.
(setq mode-line-format default-mode-line-format)

Я устанавливаю строку режима по умолчанию, так что это позволяет различным режимам, таким как Info, переопределить ее. Многие элементы списка объясняют сами себя: mode-line-modified --- это переменная, которая показывает был ли буфер изменен, а mode-name сообщает нам имя режима, ну и т.п.

Строка `"%14b"' отображает имя буфера (используя функцию buffer-name, с которой мы уже знакомы); число `14' указывает максимальное число символов, которое будет отображено. Когда имя имеет меньшую длину, то оно дополняется пробелами до нужной длины. `%[' и `%]' вызывают появление квадратных скобок на каждом рекурсивном уровне редактирования. `%n' вызывает появление слова `Narrow' при действии сужения текста. `%P' показывает размер буфера, который выше низа окна в процентах, или словами `Top' (самый верх), `Bottom' (самый низ) или `All' (весь буфер). (маленькая буква `p' сообщает вам процент выше верхней части окна). `%-' вставляет нужное количество знаков минус для заполнения строки.

В Emacs версии 19.29 и более поздних, вы можете использовать frame-title-format для установки заголовка окна Emacs. Эта переменная имеет ту же структуру, что и mode-line-format.

Формат строки режима описан в section `Mode Line Format' in The GNU Emacs Lisp Reference Manual.

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

С другой стороны, если вы хотите получить Emacs без единой настройки, то наберите:

 
emacs -q

Это запустит Emacs, который не загрузит ваш файл инициализации `~/.emacs'. Вы получите Emacs с настройками по умолчанию. И ничего больше.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on March, 10 2004 using texi2html