[содержание]   [назад]   [предыдущий]   [вверх]   [следующий]   [вперед]  


Фреймы и X Windows

При использовании X Window System вы можете создавать в одном сеансе Emacs несколько окон уровня оконной системы. Каждое принадлежащее Emacs X-окно показывает один фрейм, который может содержать одно или несколько окон Emacs. Изначально фрейм содержит одно окно Emacs общего назначения, которое вы можете поделить вертикально или горизонтально на меньшие. Обычно фрейм имеет собственную эхо-область и минибуфер, но вы можете сделать фреймы без них -- они будут использовать эхо-область и минибуфер другого фрейма.

Редактирование в одном фрейме затрагивает и другие фреймы. К примеру, если вы поместите текст в список уничтожений в одном фрейме, вы можете восстановить его в другом. Если вы выходите из Emacs через C-x C-c в одном фрейме, это удалит все фреймы. Чтобы удалить только один фрейм, используйте C-x 5 0.

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

Emacs, скомпилированный для MS-DOS, эмулирует некоторые аспекты оконной системы, так что вы сможете использовать многие возможности из описанных в этой главе. Смотрите раздел Клавиатура и мышь в MS-DOS, для дальнейшей информации.

Команды мыши для редактирования

Команды мыши для выделения и копирования области в основном совместимы с командами программы xterm. Вы можете пользоваться одними и теми же командами мыши для обмена текстом между Emacs другими X-клиентами.

Если вы выделите область с помощью любой из этих команд и сразу же после этого нажмете функциональную клавишу DELETE, она удалит выделенную область. Функциональная клавиша BACKSPACE или ASCII-знак DEL не делают этого; и если вы нажмете между командой мыши и DELETE какую-то другую клавишу, DELETE не подействует таким образом.

Mouse-1
Перемещает точку туда, где вы щелкнули (mouse-set-point). Обычно это левая кнопка.
Drag-Mouse-1
Устанавливает область вокруг текста, по которому вы провели, и копирует этот текст в список уничтожений (mouse-set-region). С помощью этой команды вы можете указать оба конца области. Если при проведении мышью вы переместите ее за верхний или нижний предел окна, это окно непрерывно прокручивается, пока вы не вернете в него мышь. Таким способом вы можете выделять области, не умещающиеся на экране. Число прокручиваемых за один шаг строк зависит от того, насколько далеко за край окна ушла мышь; минимальный размер шага определяет переменная mouse-scroll-min-lines.
Mouse-2
Восстанавливает последний уничтоженный текст в том месте, где вы щелкнули (mouse-yank-at-click). Обычно это средняя кнопка.
Mouse-3
Эта команда, mouse-save-then-kill, имеет несколько назначений в зависимости от того, где вы щелкнули, и от состояния области. Самый основной случай -- это когда вы щелкаете Mouse-1 в одном месте, а затем Mouse-3 в другом. Это выделяет текст между двумя этими позициями в качестве области. Это также копирует новую область в список уничтожений, чтобы вы могли скопировать его в другое место. Если вы щелкните в тексте Mouse-1, прокрутите окно с помощью полоски прокрутки и затем щелкните Mouse-3, Emacs запомнит, где была точка перед прокруткой (где вы поместили ее с помощью Mouse-1), и использует эту позицию как другой конец области. Это сделано, чтобы вы могли выделять области, которые не умещаются полностью на экране. В более общем виде, если у вас нет подсвеченной области, Mouse-3 выделяет в качестве области текст между точкой и местом щелчка. Она делает это, устанавливая метку там, где была точка, и перемещая точку к той позиции, где вы щелкнули. Если у вас есть подсвеченная область, или если область была установлена непосредственно перед этим с помощью проведения кнопкой 1, Mouse-3 подстраивает ближайший конец области, перемещая его к месту щелчка. Также, текст подстроенной области замещает в списке уничтожений текст старой области. Если вы изначально задали область, используя двойной или тройной щелчок Mouse-1, чтобы определить область как состоящую из целых слов или строк, то подстройка области с помощью Mouse-3 также проходит по целым словам или строкам. Если вы примените Mouse-3 два раз подряд на одном месте, вы уничтожите уже выделенную область.
Double-Mouse-1
Этот ключ устанавливает область вокруг слова, на котором вы щелкнули. Если вы щелкнули на знаке с синтаксической категорией "symbol" (например, на подчерке в режиме C), он устанавливает область вокруг символа, которому принадлежит этот знак. Если вы щелкнули на знаке с синтаксической категорией открывающей или закрывающей круглой скобки, область устанавливается вокруг группы (s-выражения), которая завершается или начинается на этом знаке. Если вы щелкнули на знаке с синтаксической категорией разделителя строк (таком как кавычка или двойные кавычки в Си), область будет установлена вокруг этой строковой константы (с использованием эвристики, чтобы выяснить, является ли этот знак начинающим или завершающим).
Double-Drag-Mouse-1
Этот ключ выделяет область, состоящую из слов, по которым вы провели.
Triple-Mouse-1
Этот ключ устанавливает область вокруг строки, на которой вы щелкнули.
Triple-Drag-Mouse-1
Этот ключ выделяет область, состоящую из строк, по которым вы провели.

Простейший способ уничтожить текст с помощью мыши -- нажать Mouse-1 в одном конце, а затем дважды нажать Mouse-3 на другом. Смотрите раздел Удаление и уничтожение. Чтобы скопировать текст в список уничтожений, не удаляя его из буфера, нажмите Mouse-3 только один раз или просто проведите по этому тексту с прижатой Mouse-1. Потом вы можете скопировать этот текст в другое место восстановлением.

Чтобы восстановить уничтоженный или скопированный текст в другое место, переведите туда мышь и нажмите Mouse-2. Смотрите раздел Восстановление. Однако, если mouse-yank-at-point не равна nil, Mouse-2 восстанавливает в точке. Тогда не имеет значения, где вы щелкаете, или даже в каком из окон фрейма вы щелкаете. Значение по умолчанию равно nil. Эта переменная влияет также на восстановление вторичного выделения.

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

Чтобы скопировать текст из другого X-окна, используйте в программе, работающей в другом окне, команды "вырезать" или "копировать", чтобы выделить нужный вам текст. Затем восстановите его в Emacs с помощью C-y или Mouse-2.

Эти команды вырезания и вставки работают также и в MS-Windows.

Когда Emacs помещает текст в список уничтожений или перекладывает текст на вершину списка уничтожений, он устанавливает первичное выделение X-сервера. Именно таким образом другие X-клиенты могут получить доступ к этому тексту. Emacs также сохраняет текст в буфере вырезок, но только если этот текст достаточно короткий (x-cut-buffer-max задает максимальное число знаков); помещение в буфер вырезок длинных строк может быть медленным.

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

Вторичное выделение

Вторичное выделение -- это другой способ выделения текста с использованием X Windows. Оно не использует точку или метку, поэтому вы можете использовать его для уничтожения текста без установки точки или метки.

M-Drag-Mouse-1
Устанавливает вторичное выделение с одним концом в том месте, где вы нажали кнопку, и другим -- в том, где вы ее отпустили (mouse-set-secondary). Когда вы проводите мышью, появляется и изменяется подсветка. Если при проведении мышью вы сдвинете ее за верхний или нижний предел окна, это окно непрерывно прокручивается, пока вы не вернете в него мышь. Таким способом вы можете выделять области, не умещающиеся на экране.
M-Mouse-1
Устанавливает одну из граничных точек вторичного выделения (mouse-start-secondary).
M-Mouse-3
Создает вторичное выделение, используя место, указанное с помощью M-Mouse-1 как его второй конец (mouse-secondary-save-then-kill). Второй щелчок на этом же месте уничтожает только что сделанное вторичное выделение.
M-Mouse-2
Вставляет в месте щелчка вторичное выделение (mouse-yank-secondary). Это помещает точку в конец восстановленного текста.

Двойные и тройные щелчки M-Mouse-1 действуют на слова и строки, во многом как для Mouse-1.

Если mouse-yank-at-point не равна nil, M-Mouse-2 восстанавливает в точке. Тогда не имеет значения, где вы щелкнули; главное, в каком окне. Смотрите раздел Команды мыши для редактирования.

Следование по ссылкам с помощью мыши

Некоторые буферы Emacs показывают различного рода перечни. Это перечни файлов, буферов, возможных завершений, совпадений с образцом и так далее.

Поскольку восстановление в этих буферах бессмысленно, в большинстве из них Mouse-2 определена особо, как команда для использования или просмотра пункта, на котором вы щелкнули.

Например, если вы щелкните Mouse-2 на имени файла в буфере Dired, вы обратитесь к этому файлу. Если вы щелкните Mouse-2 на сообщении об ошибке в буфере `*Compilation*', вы перейдете к исходному коду для этого сообщения. Если вы щелкните Mouse-2 на завершении в буфере `*Completions*', вы выберете это завершение.

Обычно вы можете судить о том, имеет ли Mouse-2 особое значение, по тому, что чувствительный текст подсвечивается, когда вы проводите над ним мышь.

Щелчки мыши для меню

Щелчки мыши, модифицированные с помощью клавиш CTRL и SHIFT, выводят меню.

C-Mouse-1
Это меню для выбора буфера.
C-Mouse-2
Это меню для задания начертаний и других свойств текста для редактирования форматированного текста. Смотрите раздел Редактирование форматированного текста.
C-Mouse-3
Это меню определяется режимом. Для большинства режимов данное меню имеет те же пункты, что содержатся во всех определяемых режимом меню из полоски меню. Некоторые режимы могут определять для этой кнопки другое меню.(3)
S-mouse-1
Это меню для задания основного шрифта фрейма.

Команды мыши для строки режима

Вы можете использовать мышь на строке режима для выбора окон и манипуляций с ними.

Mouse-1
Mouse-1 на строке режима выбирает окно сверху. Проводя мышью с нажатой на строке режима Mouse-1, вы можете перемещать эту строку режима, изменяя таким образом высоту окон сверху и снизу.
Mouse-2
Mouse-2 на строке режима раскрывает окно на весь фрейм.
Mouse-3
Mouse-3 на строке режима удаляет окно сверху.
C-Mouse-2
C-Mouse-2 на строке режима разбивает окно сверху по вертикали в том месте, где вы щелкнули.

C-Mouse-2 на полоске прокрутки разбивает соответствующее окно по горизонтали. Смотрите раздел Разделение окон.

Создание фреймов

Префиксный ключ C-x 5 аналогичен C-x 4, и на них определены параллельные подкоманды. Разница между ними в том, что команды с C-x 5 создают новый фрейм, а не просто новое окно в выбранном фрейме (смотрите раздел Изображение в другом окне). Если запрошенный материал уже показывается в существующем видимом или минимизированном фрейме, эти команды используют существующий фрейм после его поднимания или деминимизации по необходимости.

Команды на C-x 5 различаются по тому, как они находят или создают буфер для выбора:

C-x 5 2
Создает новый фрейм (make-frame-command).
C-x 5 b имя-буфера RET
Выбирает буфер имя-буфера в другом фрейме. Это запускает switch-to-buffer-other-frame.
C-x 5 f имя-файла RET
Обращается к файлу имя-файла и выбирает его буфер в другом фрейме. Это запускает find-file-other-frame. Смотрите раздел Обращение к файлам.
C-x 5 d каталог RET
Выбирает буфер Dired для каталога каталог в другом фрейме. Это запускает dired-other-frame. Смотрите раздел Dired, редактор каталогов.
C-x 5 m
Позволяет начать составление почтового сообщения в другом фрейме (mail-other-frame). Это вариант C-x m, работающий в другом фрейме. Смотрите раздел Посылка почты.
C-x 5 .
Обращается к тегу из текущей таблицы тегов в другом фрейме. Это запускает find-tag-other-frame, вариант M-., работающий с несколькими фреймами. Смотрите раздел Таблицы тегов.
C-x 5 r имя-файла RET
Обращается к файлу имя-файла в режиме только для чтения и выбирает его буфер в другом фрейме. Это запускает find-file-read-only-other-frame. Смотрите раздел Обращение к файлам.

Вы можете управлять видом вновь создаваемых фреймов, устанавливая параметры фрейма в default-frame-alist. Для задания параметров, относящихся только к начальному фрейму, вы можете использовать переменную initial-frame-alist. Смотрите раздел `Initial Parameters' в The Emacs Lisp Reference Manual, для дальнейшей информации.

Простейший способ указать основной шрифт для всех фреймов Emacs --- через X-ресурс (смотрите раздел Ключи для задания шрифта), но вы также можете сделать это, изменив default-frame-alist так, чтобы в нем задавался параметр font, как показано здесь:

(add-to-list 'default-frame-alist '(font . "10x20"))

Создание и использование фрейма Speedbar

Фрейм Emacs может иметь speedbar, то есть вертикальное окно, служащее как меню с возможностью прокрутки для файлов, к которым вы можете обратиться, и тегов внутри этих файлов. Чтобы создать speedbar, введите M-x speedbar; это создает окно speedbar для выбранного фрейма. После этого вы можете щелкнуть в speedbar на имени файла, чтобы обратиться к нему в соответствующем фрейме Emacs, или щелкнуть на имени тега, чтобы перескочить к нему соответствующем фрейме.

Изначально speedbar перечисляет непосредственное содержание текущего каталога по одному файлу на строке. В каждой строке также есть кнопка, `[+]' или `<+>', на которой вы можете щелкнуть Mouse-2, чтобы "открыть" содержимое данного элемента. Если на этой строке перечислен каталог, то при открытии к показанному в speedbar добавляется содержание этого каталога под его собственной строкой. Если на строке перечислен обычный файл, при его открытии к содержимому speedbar добавляется список тегов из этого файла. Когда файл открывается, `[+]' заменяется на `[-]'; вы можете щелкнуть на этой кнопке, чтобы "закрыть" этот файл (скрыть его содержание).

Некоторые основные режимы, включая режим Rmail, Info и GUD, имеют специализированные способы поместить в speedbar другие полезные вещи. Например, в режиме Rmail speedbar показывает перечень Rmail-файлов и позволяет вам перенести текущее сообщение в другой Rmail-файл, щелкнув на кнопке `<M>'.

Speedbar принадлежит одному фрейму Emacs и всегда работает с этим фреймом. Если вы используете несколько фреймов, вы можете сделать speedbar для некоторых или для всех из них; чтобы сделать speedbar для любого данного фрейма, наберите в нем M-x speedbar.

Множество дисплеев

Один Emacs может общаться более чем с одним дисплеем X Windows. Изначально Emacs использует только один дисплей -- тот, что указан в переменной среды `DISPLAY' или с помощью ключа --display (смотрите раздел Ключи запуска). Чтобы подсоединиться к другому дисплею, воспользуйтесь командой make-frame-on-display:

M-x make-frame-on-display RET дисплей RET
Создает новый фрейм на дисплее дисплей.

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

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

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

Фреймы специальных буферов

Вы можете сделать так, чтобы определенные буферы, для которых Emacs обычно создает второе окно, если у вас есть только одно, появлялись в особых собственных фреймах. Чтобы сделать это, установите переменную special-display-buffer-names равной списку имен буферов; любой буфер, чье имя содержится в этом списке, автоматически получает специальный фрейм, когда какая-нибудь команда Emacs хочет показать его "в другом окне".

Например, если вы установите эту переменную таким образом:

(setq special-display-buffer-names
      '("*Completions*" "*grep*" "*tex-shell*"))

то списки завершений, вывод grep и буфер оболочки режима TeX получат свои собственные фреймы. Эти фреймы и окна в них никогда не разбиваются автоматически и не используются для других буферов. Они продолжают показывать буферы, для которых были созданы, пока вы не измените их вручную. Уничтожение специального буфера автоматически удаляет его фрейм.

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

Переменная special-display-frame-alist задает параметры для этих фреймов. У нее есть значение по умолчанию, поэтому вам необязательно устанавливать ее.

Те, кто знает Лисп, могут также сделать элемент special-display-buffer-names или special-display-regexps списком. Тогда первый элемент -- это имя буфера или регулярное выражение, а остальные указывают, как создавать фрейм. Это может быть ассоциативный список, задающий значения параметров фрейма; эти значения имеют приоритет перед значениями параметров, указанных в special-display-frame-alist. Или же остальные элементы могут иметь такую форму:

(функция аргументы...)

где функция -- это символ. Тогда фрейм конструируется путем вызова функции; ее первым аргументом является буфер, а остальными аргументами -- аргументы.

Аналогичными средствами вы можете указать буферы, которые должны отображаться в выбранном окне. Смотрите раздел Принудительное изображение в том же окне. Показ в том же окне обладает приоритетом перед показом в специальном фрейме; следовательно, если вы добавили имя буфера к special-display-buffer-names, но это не возымело никакого эффекта, проверьте, не используется ли для этого же имени буфера средство показа в том же окне.

Установка параметров фрейма

Этот раздел описывает команды для изменения стиля отображения выбранного фрейма и его поведения в оконной среде.

M-x set-foreground-color RET цвет RET
Задает цвет для текста в выбранном фрейме.
M-x set-background-color RET цвет RET
Задает цвет для фона в выбранном фрейме. Также изменяет цвет текста в начертании modeline, чтобы оно оставалось инверсией начертания по умолчанию.
M-x set-cursor-color RET цвет RET
Задает цвет курсора в выбранном фрейме.
M-x set-mouse-color RET цвет RET
Задает цвет указателя мыши, когда он находится над выбранным фреймом.
M-x set-border-color RET цвет RET
Задает цвет рамки выбранного фрейма.
M-x list-colors-display
Выводит определенные имена цветов и показывает, как эти цвета выглядят. Это несколько медленная команда.
M-x auto-raise-mode
Переключает автоматическое поднятие выбранного фрейма. Автоматическое поднятие означает, что всякий раз, когда вы передвигаете мышь в этот фрейм, он поднимается. Обратите внимание, это средство автоматического поднятия реализовано самим Emacs. Некоторые программы управления окнами также реализуют автоподнятие. Если вы включите автоподнятие для фреймов Emacs в вашей программе управления X-окнами, это будет работать, но не под контролем Emacs, и следовательно, auto-raise-mode не будет играть роли.
M-x auto-lower-mode
Переключает автоматическое опускание выбранного фрейма. Автоматическое опускание означает, что всякий раз, когда вы передвигаете мышь за пределы этого фрейма, он переносится вниз стека X-окон. Команда auto-lower-mode не влияет на автоопускание, реализованное программой управления X-окнами. Чтобы контролировать это, вы должны использовать соответствующие средства своей программы управления окнами.
M-x set-frame-font RET шрифт RET
Определяет шрифт как основной шрифт в выбранном фрейме. Основной шрифт используется для всего отображаемого в этом фрейме текста, кроме случаев, когда для какого-то текста с помощью начертания (смотрите раздел Использование разных начертаний) определен другой шрифт. Смотрите раздел Ключи для задания шрифта, чтобы узнать о способах перечисления доступных в вашей системе шрифтов. Вы также можете установить основной шрифт фрейма через всплывающее меню. Чтобы вызвать это меню, нажмите S-Mouse-1.

В версиях Emacs, которые используют X toolkit, функции для установки цвета и шрифтов не влияют на меню, так как меню отображаются со своими собственными классами виджетов. Чтобы сменить вид меню, вы должны использовать X-ресурсы (смотрите раздел X-ресурсы). Смотрите раздел Параметры для задания цветов, сведения о цветах, а также раздел Ключи для задания шрифта, касающийся вопросов о выборе шрифта.

Для получения информации о параметрах и настройках фреймов смотрите раздел `Frame Parameters' в The Emacs Lisp Reference Manual.

Полоски прокрутки

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

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

Правая и левая кнопки мыши прокручивают на контролируемое число строк. Mouse-1 (обычно левая кнопка) перемещает строку, на уровне которой вы щелкнули, к верхнему краю окна. Mouse-3 (обычно правая кнопка) перемещает верхнюю строку окна вниз к тому уровню, где вы щелкнули. Щелкая последовательно на одном месте, вы можете прокручивать на одно и то же расстояние еще и еще.

Помимо прокрутки, вы также можете щелкнуть на полоске прокрутки с помощью C-Mouse-2, чтобы разбить окно по горизонтали. Разбиение делается в той строке, где вы щелкнули.

Вы можете включить или выключить режим Scroll Bar командой M-x scroll-bar-mode. Без аргумента, она переключает использование полосок прокрутки. С аргументом, она включает использование полосок прокрутки тогда и только тогда, когда аргумент положителен. Эта команда применяется ко всем фреймам, включая те, что еще будут созданы. Для управления начальной установкой режима Scroll Bar вы можете использовать X-ресурс `verticalScrollBars'. Смотрите раздел X-ресурсы.

Чтобы включить или выключить полоски прокрутки только для выбранного фрейма, воспользуйтесь командой M-x toggle-scroll-bar.

Полоски меню

Вы можете включить или выключить показ полосок меню с помощью команды M-x menu-bar-mode. Без аргументов, эта команда переключает режим Menu Bar; это второстепенный режим. С аргументом, эта команда включает режим Menu Bar, если аргумент положителен, и выключает, если аргумент неположителен. Для управления начальной установкой режима Menu Bar вы можете использовать X-ресурс `menuBarLines'. Смотрите раздел X-ресурсы. Профессиональные пользователи часто выключают полоску меню, особенно на текстовых терминалах, где это освобождает одну дополнительную строку для текста.

Смотрите раздел Полоска меню, для получения информации о том, как вызывать команды с помощью полоски меню.

Использование разных начертаний

Когда вы используете Emacs с системой X, вы можете настроить несколько стилей отображения знаков. Вы можете контролировать такие аспекты стиля: шрифт, цвет текста, цвет фона и подчеркивание. Emacs частично поддерживает начертания в MS-DOS, позволяя вам контролировать для каждого начертания цвета текста и фона (смотрите раздел Emacs и MS-DOS).

Вы управляете стилем отображения путем определения именованных начертаний. Каждое начертание может задавать шрифт, цвет текста, цвет фона и флаг подчеркивания; но оно не обязано задавать их все. Затем, указывая начертание или начертания для заданной части текста в буфере, вы управляете внешним видом этого текста.

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

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

Для изменения внешнего вида начернания используйте буфер настройки. Смотрите раздел Настройка начертаний. Для определения атрибутов конкретных начертаний вы также можете использовать X-ресурсы (смотрите раздел X-ресурсы).

Чтобы узнать, какие начертания определены в данный момент, и как они выглядят, наберите M-x list-faces-display. Одно начертание может выглядеть по-разному в разных фреймах; данная команда показывает его вид в том фрейме, где вы ее набрали. Вот перечень стандартных определенных начертаний:

default
Это начертание используется для обычного текста, для которого не определено другое начертание.
modeline
Это начертание используется для строк режима. По умолчанию оно устанавливается как инверсия начертания default. Смотрите раздел Переменные управления изображением.
highlight
Это начертание используется в различных режимах для подсветки частей текста.
region
Это начертание применяется для отображения выделенной области (когда включен режим Transient Mark -- смотрите ниже).
secondary-selection
Это начертание используется для отображения вторичного выделения (смотрите раздел Вторичное выделение).
bold
Это начертание использует жирный вариант шрифта по умолчанию, если он есть.
italic
Это начертание использует курсивный вариант шрифта по умолчанию, если он есть.
bold-italic
Это начертание использует жирный курсивный вариант шрифта по умолчанию, если он есть.
underline
Это начертание подчеркивает текст.

Если включен режим Transient Mark, текст области подсвечивается, когда метка активна. Для этого используется начертание с именем region; вы можете управлять стилем подсветки, меняя стиль этого начертания (смотрите раздел Настройка начертаний). Смотрите раздел Режим Transient Mark, для получения большей информации о режиме Transient Mark и активизации и деактивизации метки.

Один простой способ использовать разные начертания -- включить режим Font Lock. Этот второстепенный режим, всегда локальный для конкретного буфера, подбирает начертания в соответствии с синтаксисом редактируемого текста. Он может распознавать комментарии и строки в большинстве языков; в некоторых языках он умеет даже распознавать и правильно подсвечивать различные другие важные конструкции. Смотрите раздел Режим Font Lock, для получения большей информации о режиме Font Lock и синтаксической подсветке.

Вы можете распечатать буфер с подсветкой, какую вы видите на экране, с помощью команды ps-print-buffer-with-faces. Смотрите раздел Печать через Postscript.

Режим Font Lock

Режим Font Lock -- это второстепенный режим, всегда локальный для каждого буфера, который подсвечивает редактируемый вами текст, используя различные начертания в соответствии с синтаксисом текста. Он может распознавать комментарии и строки в большинстве языков; в некоторых языках он может также распознавать и правильно подсвечивать различные другие важные конструкции -- например, имена определяемых функций и зарезервированные ключевые слова.

Команда M-x font-lock-mode включает и выключает режим Font Lock в соответствии с аргументом и переключает, если аргумент не задан. Функция turn-on-font-lock безусловно включает режим Font Lock. Это полезно в функциях-ловушках режима. Например, чтобы задействовать режим Font Lock всякий раз, когда вы редактируете файл на Си, вы можете сделать так:

(add-hook 'c-mode-hook 'turn-on-font-lock)

Чтобы включить режим Font Lock автоматически во всех режимах, которые его поддерживают, используйте функцию global-font-lock-mode, как показано здесь:

(global-font-lock-mode 1)

Когда вы редактируете текст в режиме Font Lock, подсветка в измененной строке обновляется автоматически. Чаще всего изменения не оказывают влияния на подсветку последующих строк, но иногда все же влияют. Чтобы обновить подсветку нескольких строк, используйте команду M-g M-g (font-lock-fontify-block).

В некоторых основных режимах M-g M-g обновляет подсветку всей текущей функции. (Как именно можно найти текущую функцию, указывает переменная font-lock-mark-block-function.) В других основных режимах M-g M-g обновляет подсветку 16-ти строк над и под точкой.

С числовым аргументом n, M-g M-g обновляет подсветку n строк над и под точкой, независимо от режима.

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

Переменная font-lock-maximum-decoration задает предпочтительный уровень оформления для режимов, которые предоставляют несколько уровней. Уровень 1 -- это минимальное оформление; некоторые режимы поддерживают до трех уровней. Обычное значение по умолчанию обозначает "как можно больше". Вы можете указать целое число, которое применяется ко всем режимам, или задать разные числа для конкретных режимов; например, чтобы использовать уровень 1 для режимов C/C++ и уровень по умолчанию в остальных случаях, напишите так:

(setq font-lock-maximum-decoration
      '((c-mode . 1) (c++-mode . 1)))

В больших буферах подсветка может быть слишком медленной, поэтому вы можете подавить ее. Переменная font-lock-maximum-size задает размер буфера, сверх которого подсветка не делается.

Подсветка комментариев и строк (или "синтаксическая" подсветка) основывается на анализе синтаксической структуры текста буфера. В целях увеличения скорости некоторые режимы, включая режим C и режим Lisp полагаются на особое соглашение: открывающая скобка в самом левом столбце всегда обозначает начало определения функции и, таким образом, всегда находится вне любой строки или комментария. (Смотрите раздел Определения функций.) Если вы не следуете этому соглашению, режим Font Lock может сделать неправильную подсветку текста после открывающей скобки в левом столбце, которая попадает в строку или комментарий.

Переменная font-lock-beginning-of-syntax-function (всегда локальная для буфера) указывает, каким образом режим Font Lock может найти позицию, которая гарантированно находится вне любого комментария или строки. В режимах, использующих соглашение об открывающей скобке в левом столбце, значение этой переменной по умолчанию -- это beginning-of-defun, что велит режиму Font Lock применять это соглашение. Если вы установите эту переменную в nil, Font Lock больше не станет полагаться на это соглашение. Это позволяет избежать неверных результатов, но ценой этого будет то, что в некоторых случаях для подсветки придется проходить текст буфера с самого начала.

Образцы подсветки Font Lock уже существуют для многих режимов, но вы можете захотеть раскрасить что-то дополнительно. Чтобы добавить свои собственные образцы подсветки для определенного режима, вы можете использовать функцию font-lock-add-keywords. К примеру, чтобы выделить в комментариях Си слова `FIXME:', используйте это:

(font-lock-add-keywords
 'c-mode
 '(("\\<\\(FIXME\\):" 1 font-lock-warning-face t)))

Режимы поддержки Font Lock

Режимы поддержки убыстряют режим Font Lock в больших буферах. Есть два режима поддержки: режим Fast Lock и режим Lazy Lock. Они используют два разных метода ускорения режима Font Lock.

Режим Fast Lock

Чтобы сделать режим Font Lock более быстрым для буферов, обращающихся к большим файлам, вы можете использовать режим Fast Lock. Режим Fast Lock сохраняет информацию о шрифтах для каждого файла в отдельном файле кеша; всякий раз, когда вы обращаетесь к файлу, он заново считывает информацию о шрифтах из файла кеша вместо того, чтобы вычислять шрифты для текста с нуля.

Команда M-x fast-lock-mode включает и выключает режим Fast Lock в соответствии с аргументом (без аргумента, режим переключается). Вы также можете сделать так, чтобы режим Fast Lock включался всякий раз, когда вы используете режим Font Lock, следующим образом:

(setq font-lock-support-mode 'fast-lock-mode)

Записывать файл кеша для маленьких буферов не имеет смысла. Поэтому есть переменная, fast-lock-minimum-size, задающая наименьший размер файла, для которого информация о шрифтах кешируется.

Переменная fast-lock-cache-directories указывает, где нужно размещать файлы кеша. Ее значение -- это список каталогов, которые будут испробованы; "." означает тот же каталог, где файл редактируется. Значение по умолчанию равно ("." "~/.emacs-flc"), что велит использовать тот же каталог, если это возможно, иначе использовать каталог `~/.emacs-flc'.

Переменная fast-lock-save-others указывает, должен ли режим Fast Lock сохранять файлы кеша для файлов, чьим владельцем являетесь не вы. Отличное от nil значение говорит, что должен (и это значение по умолчанию).

Режим Lazy Lock

Чтобы ускорить режим Font Lock для больших буферов, вы можете использовать режим Lazy Lock, который уменьшает количество текста, подлежащего подсветке. В режиме Lazy Lock подсветка буфера делается по необходимости; она производится только для тех частей буфера, которые должны появиться на экране. И подсветка ваших изменений замедлена; она производится, только когда Emacs бездействовал определенный небольшой промежуток времени.

Команда M-x lazy-lock-mode включает и выключает режим Lazy Lock в соответствии с аргументом (без аргумента, режим переключается). Вы также можете сделать так, чтобы режим Lazy Lock включался всякий раз, когда вы используете режим Font Lock, следующим образом:

(setq font-lock-support-mode 'lazy-lock-mode)

Избегать подсветки маленьких буферов не имеет смысла. Минимальный размер буфера, для которого подсветка делается по необходимости, определяется переменной lazy-lock-minimum-size. Меньшие буферы расцвечиваются сразу, как в простом режиме Font Lock.

Когда вы изменяете буфер, режим Lazy Lock откладывает подсветку измененного текста. Переменная lazy-lock-defer-time задает число секунд, которое Emacs должен оставаться незанятым, прежде чем начать подсветку ваших изменений. Если ее значение равно 0, изменения подсвечиваются незамедлительно, как в простом режиме Font Lock.

Обычно режим Lazy Lock подсвечивает ставшие видимыми фрагменты буфера перед тем, как они впервые показываются на экране. Однако, если значение lazy-lock-defer-on-scrolling не равно nil, вновь видимый текст подсвечивается только после того, как Emacs бездействовал lazy-lock-defer-time секунд.

В некоторых режимах, включая режим C и режим Emacs Lisp, изменение содержимого одной строки изменяет контекст последующих строк и, следовательно, ту подсветку, которая должна для них использоваться. Обычно вы должны набрать M-g M-g, чтобы обновить подсветку последующих строк. Однако, если вы установите переменную lazy-lock-defer-contextually не равной nil, режим Lazy Lock делает это автоматически по истечении lazy-lock-defer-time секунд.

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

Переменная lazy-lock-stealth-time определяет, сколько минут Emacs должен оставаться незанятым, прежде чем начать скрытую подсветку. Значение nil означает отсутствие скрытой подсветки. Переменные lazy-lock-stealth-lines и lazy-lock-stealth-verbose задают диапазон и подробность скрытой подсветки.

Fast Lock или Lazy Lock?

Вот простые указания, которые помогут вам выбрать один из режимов поддержки Font Lock.

Переменная font-lock-support-mode указывает, какой из этих режимов поддержки следует использовать; например, чтобы сказать, что в режимах C/C++ используется режим Fast Lock, а в остальных случаях --- режим Lazy Lock, установите эту переменную так:

(setq font-lock-support-mode
      '((c-mode . fast-lock-mode) (c++-mode . fast-lock-mode)
        (t . lazy-lock-mode)))

Режим Highlight Changes

Используйте M-x highlight-changes-mode, чтобы включить второстепенный режим, который показывает с помощью разных начертаний (в основном цветов), какие части текста буфера изменялись недавно.

Другие возможности X Windows

Следующие команды позволяют вам создавать и удалять фреймы, а также делать другие операции над ними:

C-z
Минимизирует выбранный фрейм (iconify-or-deiconify-frame). Обычное значение C-z, приостановка Emacs, бесполезно под оконной системой, поэтому в данном случае у этого ключа другая привязка. Если вы введете эту команду в пиктограмме фрейма Emacs, она деминимизирует этот фрейм.
C-x 5 0
Удаляет выбранный фрейм (delete-frame). Это не допускается, если есть только один фрейм.
C-x 5 o
Выбирает другой фрейм, поднимает его и переносит в него мышь, чтобы он оставался выбранным. Если вы повторяете эту команду, она циклически проходит по всем фреймам на вашем терминале.

Неоконные терминалы

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

Чтобы создать новый фрейм и переключиться в него, используйте C-x 5 2; для кругового прохода по существующим фреймам используйте C-x 5 o; чтобы удалить текущий фрейм, используйте C-x 5 0.

Каждый фрейм имеет отличительный номер. Если ваш терминал может показывать в одно время только один фрейм, то около начала строки режима появляется номер n текущего фрейма в форме `Fn'.

`Fn' на самом деле -- это имя фрейма. Вы также можете указать другое имя, если хотите, и вы можете выбирать фреймы по именам. Чтобы задать новое имя для текущего фрейма, используйте команду M-x set-frame-name RET имя RET, а для выбора фрейма в соответствии с его именем используйте M-x select-frame-by-name RET имя RET. Указанное вами имя появляется в строке режима, когда этот фрейм становится выбранным.


[содержание]   [назад]   [предыдущий]   [вверх]   [следующий]   [вперед]