Використовуйте дві основні карти в одному буфері


11

Я зіткнувся з декількома ситуаціями, коли було б дуже зручно мати клавішну карти одного основного режиму як резервну клавішу для іншого основного режиму. Наприклад:

  • Я пишу багато LaTeX в деяких своїх документах OR, тому було б чудово, щоб latex-modeкоманди були легко доступними під час редагування org-mode.
  • Я часто відвідую IRC номер із підтримкою Markdown, тому було б непогано markdown-modeдодати клавіші erc-mode.

В обох випадках ця додаткова карта ключа повинна діяти як резервна (тому я не можу просто використовувати для цього мінорний режим). Я не хочу, щоб латексні команди змінювали будь-які org-modeклавіші. Що я хочу:
якщо ключ визначений у latex-mode-mapAND, він не визначений, org-mode-mapтоді використовуйте latex-mode-mapприв'язку .

Питання: Як я можу встановити карту клавіш як резервну клавішу для основного режиму?
АБО
Q: Як можна копіювати ключі з однієї основної карти в інший режим, не змінюючи нічого іншого?


Просто, щоб було зрозуміло. Я знаю, що міг би визначати ці ключі по черзі, але було б нескінченно зручніше автоматизоване рішення.


6
Використовуйте об'єднання клавіатури. Див make-composed-keymap.
Дрю

Відповіді:


12

Це виявилося простіше, ніж очікувалося. Як пропонується в коментарях тут і на запитання:

(with-eval-after-load 'erc
  (require 'markdown-mode)
  (require 'cl-lib)
  (setq erc-mode-map
        (make-composed-keymap (cl-copy-list erc-mode-map)
                              markdown-mode-map)))

Це створить карту ключів, яка є копією, erc-mode-mapале яка також успадковується markdown-mode-map. Таким чином, усі markdownклавіші будуть затіненими, коли вони стикаються з ercключами.

Якщо ви дійсно хочете , щоб деякі ключі від запасного варіанту розкладки клавіатури затьмарити головний kemap, просто відключити їх в основному.

(define-key erc-mode-map "\C-c\C-a" nil)

2
Я помітив, що використання define-keyповернутого значення make-composed-keymapможе мати несподівані побічні ефекти на оригінальних картах клавіш, і я підозрюю, що те саме може застосуватись до цієї appendedкарти вручну . Якщо ви хочете скористатися define-key, видається, що найбезпечніше створити нову ключову карту, батьківська клавішна карта якої є складеною.
Джон О.

@JonO. Власне, я був дуже здивований, дізнавшись, що цього не відбувається. Якщо я це зробити (define-key erc-mode-map "\C-c\C-s" nil), відповідна markdown-modeклавіша все ще буде доступна навіть у буферах erc.
Малабарба

Малабарба: Я вважаю, що ваш останній коментар більше не застосовується після цієї зміни коду. У make-composed-keymapдокументації йдеться про те, що "нульове прив'язування в MAPS переосмислює будь-яке відповідне прив'язування в PARENT, але воно не скасовує відповідні прив'язки в інших картах MAPS". Як у markdown-mode-mapPARENT у вашому прикладі, я б очікував, що таке nilзв'язування гальмує зв'язування відмітки?
філс

2
Моя інтерпретація є те , що (make-composed-keymap (list erc-mode-map markdown-mode-map)) буде мати ефект , який би Ви описали, однак?
філс

1
cl-copy-listнасправді не буде робити те, що ти хочеш. Якщо ви хотіли скопіювати карту клавіш, тоді вам слід було скористатися copy-keymap.
Стефан

3

Як згадував @Malabarba, ви можете використовувати make-composed-keymapдля цього. Але якщо ви дійсно хочете, щоб нова клавіатурна карта успадкувала обидві клавіші, така модифікація нової клавішної карти не вплине на жодну з двох інших макетів, вам потрібно зробити це в два етапи:

(make-composed-keymap
 nil (make-composed-keymap (list erc-mode-map markdown-mode-map)))

Це тому, що define-keyіноді можна змінювати передані карти як перший аргумент, make-composed-keymapале не ті, що передаються як другий. Я думаю, ви повинні M-x report-emacs-bugі попросити make-composed-keymapприйняти список ключових карт як другий аргумент, так що ви могли просто зробити

(make-composed-keymap nil (list erc-mode-map markdown-mode-map))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.