Я столкнулся с несколькими ситуациями, когда было бы очень удобно иметь раскладку клавиш одного основного режима в качестве запасной раскладки клавиш для другого мажорного режима. Например:
- Я пишу много LaTeX в некоторых моих документах org, поэтому было бы здорово иметь
latex-mode
команды, легко доступные во время редактированияorg-mode
. - Я часто посещаю IRC-комнату с поддержкой Markdown, так что было бы неплохо
markdown-mode
добавить привязки клавишerc-mode
.
В обоих случаях эта дополнительная раскладка клавиш должна действовать как запасной вариант (поэтому я не могу просто использовать дополнительный режим для этого). Я не хочу, чтобы латексные команды переопределяли какие-либо org-mode
ключи. То, что я хочу:
если ключ определен в latex-mode-map
AND, он не определен,
org-mode-map
тогда используйте latex-mode-map
привязку .
Q: Как я могу установить раскладку клавиатуры как запасную раскладку для основного режима?
ИЛИ В
: Как можно копировать ключи из одной карты основного режима в другую, не переопределяя ничего?
Просто быть чистым. Я знаю, что мог бы определять эти ключи один за другим, но было бы бесконечно удобнее иметь автоматизированное решение.
источник
make-composed-keymap
.Ответы:
Это оказалось проще, чем ожидалось. Как предлагается в комментариях здесь и по вопросу:
Это создаст карту ключей, которая является копией,
erc-mode-map
но также наследуется отmarkdown-mode-map
. Таким образом, всеmarkdown
ключи будут затенены всякий раз, когда они сталкиваются сerc
ключами.Если вы хотите, чтобы некоторые ключи резервной таблицы ключей затмили основную карту, просто отключите их в основной.
источник
define-key
возвращаемого значенияmake-composed-keymap
может иметь неожиданные побочные эффекты для исходных таблиц ключей, и я подозреваю, что то же самое может относиться к этойappended
карте вручную . Если вы хотите использоватьdefine-key
, кажется, безопаснее всего создать новую раскладку, родительская раскладка которой является составной раскладкой.(define-key erc-mode-map "\C-c\C-s" nil)
, соответствующийmarkdown-mode
ключ будет по-прежнему доступен даже в буферах erc.make-composed-keymap
документации говорится, что «нулевая привязка в MAPS переопределяет любую соответствующую привязку в PARENT, но она не переопределяет соответствующие привязки в других таблицах ключей MAPS». Какmarkdown-mode-map
и PARENT в вашем примере, я ожидал бы, чтоnil
привязка будет препятствовать привязке уценки?(make-composed-keymap (list erc-mode-map markdown-mode-map))
что это будет иметь эффект, который вы описали, однако?cl-copy-list
на самом деле не будет делать то, что вы хотите. Если вы хотите скопировать карту ключей, то вам следовало бы использоватьcopy-keymap
.Как уже упоминалось @Malabarba, вы можете использовать
make-composed-keymap
для этого. Но если вы действительно хотите, чтобы новая раскладка ключей наследовала от обеих раскладок, то изменение этой раскладки не влияет ни на одну из двух других раскладок, вам нужно сделать это в два этапа:Это потому, что
define-key
иногда можно изменить карты, переданные в качестве первого аргумента,make-composed-keymap
но не карты, переданные в качестве второго. Я думаю , вы должныM-x report-emacs-bug
и проситьmake-composed-keymap
принять список из раскладок в качестве второго аргумента, так что вы можете просто сделатьисточник