Иногда мои глобальные сочетания клавиш переопределяются основным режимом. Простой пример - следующая настройка в моем файле инициализации
(global-set-key (kbd "C-j") 'newline-and-indent)
Но досадно, что эта связка клавиш скрыта основным режимом «Лисп взаимодействия», который является режимом по умолчанию для рабочего буфера.
Когда я нахожусь в ситуации, когда основной режим (или второстепенный режим) скрывает мою глобальную привязку клавиш, как я могу вернуть ее обратно?
Примечание: Мой вопрос не «Как я могу связать C-j
с newline-and-indent
„? Режим“в» Lisp Interaction Меня интересует гораздо более общий ответ о том, как обращаться с сопоставлениями клавиш, которые конфликтуют, или с сочетаниями клавиш пользователя, которые скрываются в каком-то основном / второстепенном режиме.
Ответы:
Для того же решения также существует «быстрый» подход, если вы не хотите определять свой собственный второстепенный режим (о котором я говорю в моем первом ответе).
Вы можете установить
use-package
пакет , доступный от Melpa и использование сделать изbind-key*
илиbind-keys*
макрос , который является частью изbind-key
пакета , который поставляется сuse-package
.Из документации
bind-key.el
:источник
emulation-mode-map-alists
для обеспечения приоритета).(bind-key* "C-M-&" 'override-global-mode)
к своей инициации, и вы можете быстро избавиться от привязок, если это необходимо. Посколькуoverride-global-mode
это не «глобальный» второстепенный режим, вам все равно придется деактивировать его для каждого буфера. Так что если вы часто деактивируете глобальные ключи переопределения, тогда это решение не удобно.Вы можете определить свой собственный второстепенный режим и его карту ключей, и он будет перекрывать все другие режимы (минорный + мажорный). Именно поэтому я решил написать свой собственный второстепенный режим.
Шаги, чтобы ваши привязки клавиш перекрывали все привязки:
(define-key my-mode-map (kbd "C-j") #'newline-and-indent)
Точно так же ваши другие привязки клавиш, установленные в вашем второстепенном режиме, будут переопределять их в других режимах.
Я настоятельно рекомендую прочитать сообщение в блоге Кристофера Уэллонса о том, как писать второстепенный режим. Этот блог плюс досадная необходимость установки нескольких привязок клавиш
nil
в нескольких основных и второстепенных режимах вдохновили меня на написание своего собственного второстепенного режима.Лучшая часть использования этого подхода заключается в том, что когда вы хотите проверить, что делают привязки клавиш в конфигурации по умолчанию в emacs, вы просто отключаете свой второстепенный режим; затем вы снова включаете его и возвращаете свои пользовательские привязки клавиш.
источник
Чтобы глобальная привязка переопределяла привязку основного режима, просто установите привязку
nil
в основном режиме:Глобальное связывание не может иметь приоритет над всеми режимами в целом (иначе было бы бессмысленно иметь основные режимы), но вы можете взломать его, создав собственный второстепенный режим с вашими наиболее важными привязками. Тогда вы, по крайней мере, будете иметь приоритет над большинством (хотя и не обязательно всеми) режимами.
источник
(define-key foo-mode (kbd "C-j") nil)
в свой файл .emacs и ожидать, что это сработает?foo-mode-map
(мой пример в ответе был плохим), но да, это отключит привязку клавиш в основном режиме, так что вместо этого будет использоваться глобальная привязка клавиш (если только не используется другой второстепенный режим).foo-mode
будет называться раскладка клавиатурыfoo-mode-map
?Вы можете использовать эти макросы:
РЕДАКТИРОВАТЬ :
Проверьте пример ниже:
Если раскладка X переопределяет вашу глобальную привязку Y, вы пишете:
(expose-bindings X '("Y"))
И тогда переопределение будет отменено.
источник
other map
, таким образом, выставляя привязку глобальной карты черезother map
. Второй просто позволяет применить первый для списка привязок.expose-bindings
сначала, а затем глобально связать эти клавиши с командами, которые я хочу? Может быть, вы могли бы показать пример того, что я мог бы поместить в мой файл инициализации, чтобы сделать эту работу.