Разнообразные команды – ЧАСТЬ 13

Для изменения локальных привязок основного режима вы должны изменить локальную таблицу ключей этого режима. Обычно вы должны дождаться первого использования режима, поскольку до того момента большинство режимов не создают свои таблицы ключей. Если вы хотите  указать что-нибудь в вашем файле ‘~/.emacs’  для изменения привязок основного режима, то вы должны использовать ловушку этого режима, чтобы задержать изменения до его первого использования.

Например, команда texinfo-mode  для выбора режима Texinfo  запускает ловушку texinfo-mode-hook.   Продемонстрируем,  как  можно использовать  эту ловушку для добавления локальных привязок (мы признаем, не слишком полезной) для клавиш C-c n и C-c p в режиме Texinfo:

(add-hook  ’texinfo-mode-hook

’(lambda  ()

(define-key texinfo-mode-map

"\C-cp"

’backward-paragraph) (define-key texinfo-mode-map

"\C-cn"

’forward-paragraph)

))

См. Раздел 31.2.3 [Ловушки], с. 349.

31.4.4  Таблицы ключей минибуфера

Минибуфер имеет свой собственный набор локальных таблиц ключей; они содержат разные команды завершения и выхода.

•  minibuffer-local-map используется для обыкновенного  ввода (без завершения).

minibuffer-local-ns-map  похожа, но hSPCi  выходит, точно так  же,  как  hRETi.   Это используется главным образом для совместимости с Mocklisp.

minibuffer-local-completion-map для свободного завершения.

minibuffer-local-must-match-map для строгого и осторожного завершения.

31.4.5  Интерактивное изменение  привязок ключей

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

M-x global-set-key hRETключ кмд hRETi

Глобально определяет ключ для запуска команды кмд.

M-x local-set-key hRETключ кмд hRETi

Локально определяет ключ (в текущем основном режиме) для запуска команды

кмд.

M-x global-unset-key hRETключ

Делает ключ неопределенным в глобальной таблице ключей.

M-x local-unset-key hRETключ

Делает ключ неопределенным в локальной таблице ключей (в текущем основ-

ном режиме).

Допустим например, что вы хотите выполнять команды в подоболочке внутри буфера Emacs, а не приостанавливать  Emacs и выполнять команды в вашей входной оболочке. Обычно C-z привязан к функции suspend-emacs (когда не используется  система X Windows), но вы можете изменить C-z на запуск интерактивной подоболочки внутри Emacs, привязав  ее к команде shell, как показано:

M-x global-set-key hRETi  C-z shell hRETi

global-set-key считывает имя команды после клавиши. После того как вы нажмете клавишу, появится примерно такое сообщение, так что вы сможете убедиться, что назначаете ту клавишу, которую хотите:

Set  key C-z to  command:

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

Вы можете перепривязать ключ, который содержит больше одного события, тем же самым способом. Emacs продолжает  считывать ключ для перепривязки до тех пор, пока он не станет полным ключом (то есть непрефиксным).  Таким образом, если вы нажмете C-f как ключ, то на этом все закончится; вы сразу попадете в минибуфер для считывания команды кмд. Но если вы нажмете C-x, считывается  еще один знак; если это 4, считывается еще один, и так далее. Например,

M-x global-set-key hRETi  C-x 4 $ spell-other-window hRETi

переопределяет C-x 4 $ для запуска команды (фиктивной) spell-other-window.

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

Вы можете убрать глобальное  определение ключа с помощью команды global-unsetkey.  Это делает ключ неопределенным; если вы наберете его, Emacs просто подаст звуковой сигнал. Сходным образом local-unset-key делает ключ неопределенным в таблице ключей текущего основного режима, и в этом основном режиме вступает в действие определение (или отсутствия определения) из глобальной таблицы ключей.

Если вы переопределили (или сделали неопределенным) какой-то ключ и затем хотите отказаться от изменения,  то отмена определения  не будет работать — вам необходимо переопределить ключ, используя стандартное определение.  Чтобы найти имя стандартного определения ключа, перейдите в буфер с режимом Fundamental и примените  C-h c. Описания ключей в данном руководстве также сообщают имена соответсвующих  команд.

Если вы хотите обезопасить  себя от ошибочного вызова команды, то лучше блокировать команду, а не отменять  определение ключа. Блокированную команду проще вызвать, когда вы на самом деле захотите этого. См. Раздел 31.4.11 [Блокирование  команды], с. 364.

31.4.6  Перепривязка ключей в файле инициализации

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

Простейший  способ работает только со знаками ASCII и их Meta-вариантами. Этот метод использует для представления перепривязываемой последовательности ключей строку. Например, как привязать C-z к команде shell:

(global-set-key "\C-z" ’shell)

Этот пример использует строковую константу, содержащую один знак, C-z.  Одинарная кавычка перед именем команды, shell,  отмечает ее  как  константный символ, а не как переменную. Если вы опустите  кавычку, Emacs попытается сразу вычислить shell как переменную. Это вероятно вызовет ошибку; это явно не то, что вы хотите.

Вот другой пример, который привязывает последовательность ключей из двух знаков:

(global-set-key "\C-xl"  ’make-symbolic-link)

Когда последовательность ключей включает в себя функциональные  клавиши, или со-

бытия от кнопок мыши или не входящие в ASCII знаки, такие как C-= или H-a, вы должны

использовать  более общий метод перепривязки, в котором для указания последовательно-

сти ключей используется вектор.

Для того чтобы записать вектор в Emacs Lisp, необходимо заключить элементы вектора в квадратные скобки.   Для разделения  элементов  используйте  пробелы.  Если элемент является символом, то просто напишите имя символа — никаких других разделителей или пунктуации не нужно. Если элемент вектора является знаком, то пишите его как знаковую константу Лиспа: ‘?’, за которым следует сам знак в том виде, как он появился бы в строке.

Вот примеры использования векторов для перепривязки C-= (управляющий знак, не входящий в ASCII),  H-a (Hyper-знак; в ASCII вообще нет Hyper); hF7(функциональная клавиша) и C-Mouse-1 (модифицированная с клавиатуры кнопка мыши):

(global-set-key [?\C-=] ’make-symbolic-link) (global-set-key [?\H-a] ’make-symbolic-link) (global-set-key [f7] ’make-symbolic-link)

(global-set-key [C-mouse-1]  ’make-symbolic-link)

Вы также можете использовать вектор и для простых случаев. Вот как можно перепи-

сать первые два примера, приведенные выше, с использованием векторов:

(global-set-key [?\C-z] ’shell)

(global-set-key [?\C-x ?l]  ’make-symbolic-link)

31.4.7  Перепривязка функциональных клавиш

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

left, up, right, down

Курсорные стрелки.

begin, end, home, next, prior

Другие клавиши перемещения курсора.

select, print, execute, backtab insert, undo, redo, clearline

insertline, deleteline, insertchar, deletechar,

Различные функциональные клавиши.

f1, f2,  . . . f35

Нумерованные функциональные клавиши (расположенные сверху клавиатуры).

kp-add, kp-subtract, kp-multiply, kp-divide kp-backtab,  kp-space, kp-tab,  kp-enter

kp-separator, kp-decimal,  kp-equal

Клавиши дополнительной клавиатуры (справа от основной клавиатуры), с име-

нами или знаками пунктуации.

kp-0, kp-1, . . . kp-9

Клавиши дополнительной клавиатуры с цифрами.

kp-f1, kp-f2, kp-f3, kp-f4

Функциональные клавиши дополнительной клавиатуры.

Эти имена являются общепринятыми, но некоторые системы (особенно при использовании X  Windows) могут  использовать другие имена.  Чтобы убедиться,  какой символ используется для определенной функциональной  клавиши на вашем терминале,  наберите C-h c и затем нужную клавишу.

Последовательность ключей, которая содержит символы функциональных клавиш (или что-то  другое кроме  ASCII-знаков),  должны быть вектором, а не  строкой.   Синтаксис векторов использует пробел между элементами и квадратные скобки вокруг всего вектора. Таким образом, для привязки функциональной клавиши ‘f1’  к команде rmail, напишите следующее:

(global-set-key [f1] ’rmail)

Для привязки клавиши с правой стрелкой к команде forward-char, вы можете использо-

вать такое выражение:

(global-set-key [right] ’forward-char)

Здесь используется  лисповский синтаксис для вектора, содержащего символ right.  (Эта привязка существует по умолчанию в Emacs).

См. Раздел 31.4.6 [Перепривязка  при старте], с. 360, для дополнительной информации об использовании векторов для перепривязки.

В последовательности ключей вы можете смешивать функциональные клавиши и знаки.

Этот пример привязывает C-x hNEXTк команде forward-page.

(global-set-key [?\C-x next] ’forward-page)

где ?\C-x — это знаковая константа Лиспа для знака C-x. Элемент вектора next является лисповским символом, и поэтому к нему не приписан вопросительный знак.

Вы можете использовать клавиши-модификаторы  hCTRLi, hMETAi, hHYPERi, hSUPERi, hALTi и hSHIFTi  вместе с функциональными клавишами. Для представления этих модификаторов добавьте строки ‘C-’, ‘M-’, ‘H-’, ‘s-’,  ‘A-’ и ‘S-’ в начало имени символа. Таким образом, чтобы Hyper-Meta-hRIGHTперемещал вперед на слово, нужно сделать так:

(global-set-key [H-M-right]  ’forward-word)

31.4.8  Именованные управляющие ASCII-знаки

hTABi, hRETi, hBSi, hLFDi, hESCи hDELначали свою жизнь как имена определенных управляющих знаков ASCII, использовавшихся так часто, что для них были сделаны специальные клавиши. Позднее, пользователи сочли удобным различать в Emacs эти клавиши и “те же самые” управляющие знаки, набранными с помощью клавиши hCTRLi.

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий