Пользовательские привязки клавиш для конкретного режима в emacs: local-set-key против define-key - PullRequest
22 голосов
/ 22 марта 2012

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

1. с использованием ловушкии local-set-key.Например:

(defun my/bindkey-recompile ()
  "Bind <F5> to `recompile'."
  (local-set-key (kbd "<f5>") 'recompile))
(add-hook 'c-mode-common-hook 'my/bindkey-recompile)

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

2. с использованием define-key (часто в сочетании с eval-after-load для задержки оценки до загрузки соответствующей таблицы ключей).Например:

(eval-after-load "cc-mode"
  '(progn
     (define-key c-mode-map   (kbd "C-c o") 'ff-find-other-file)
     (define-key c++-mode-map (kbd "C-c o") 'ff-find-other-file)))

В отличие от этого, эта конструкция настраивает сам основной режим, но менее гибка: если я хочу использовать те же привязки клавиш для другого режима, мне нужно будет найти правильный файли имена клавиш для этого режима и почти дублируют выражение eval-after-load (хотя, возможно, это можно автоматизировать с помощью функции / макроса).

Вопрос: , хотя оба типа конструкций работают хорошо ирезультат, который я хочу, они технически очень разные, настраивая привязки клавиш в разных раскладках в разное время.Итак, мой вопрос: есть ли среди этих двух конструкций «предпочтительный / лучший» способ сделать что-то?(Или, может быть, «лучшая» конструкция - третья, о которой я не знаю?)

Под «предпочтительным / лучшим» я подразумеваю такие вещи как:

  1. меньшесклонен ломать с новыми версиями emacs
  2. меньше склонен беспокоить / быть потревоженным активными второстепенными режимами
  3. более идиоматично / читаемо / доступно для других

Ответы [ 2 ]

21 голосов
/ 22 марта 2012

Я полагаю, что два описанных вами подхода менее различны, чем вы думаете.

Обратите внимание, что local-set-key на самом деле оценивает (define-key map key command), где map - это значение (current-local-map), которое обычноустанавливается основным режимом.

Таким образом, хотя они могут делать разные вещи;Большую часть времени единственное реальное отличие будет в том, что функция ловушки с помощью вызова local-set-key будет устанавливать тот же ключ повторно / избыточно, тогда как другой подход устанавливает его только один раз.

Вы можете продемонстрировать этосамостоятельно, используя local-set-key в перехватчике режима, удаляя эту функцию перехвата после ее использования, а затем создавая новый буфер в том же основном режиме и проверяя привязку.

менее подверженпорвать с новыми версиями emacs

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

Следует отметить, что local-set-key будет работать, даже если основной режим не установил current-local-map, что, я думаю, делает егонемного более устойчивый, чем обобщенные подходы.

менее подвержен беспокойству / потревоженным активными второстепенными режимами

Нет никакой разницы.Все второстепенные комбинации клавиш имеют приоритет над всеми основными клавишами режима, и ни один из подходов не окажет никакого влияния на порядок minor-mode-map-alist (который определяет приоритет второстепенных комбинаций клавиш).

более идиоматический/ readable / поделиться с другими

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

Я говорю, просто используйте тот подход, который кажетсялучшее для вас в каждом контексте.Я думаю, что хорошо иметь стандартный подход для большинства вещей для согласованности в вашем коде, но я сомневаюсь, что имеет значение, какой из них вы выберете.Очевидно, что можно сэкономить несколько циклов ЦПУ, если не оценивать один и тот же код без необходимости, но это должно иметь столь малое значение, чтобы вообще не волноваться.

Я думаю, что наиболее очевидный случай для одного над другим - это тот, который вы уже упомянули - если вы хотите применить одну и ту же привязку к нескольким режимам, используя общий хук (но не к all режимы - для этого я настоятельно рекомендую создать собственный второстепенный режим ), тогда local-set-key в этом хуке - определенно правильный путь.

0 голосов
/ 24 февраля 2015

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

(require 'bind-key)
(bind-key "C-l" 'goto-line)
...