Usa due mappe in modalità principale nello stesso buffer


11

Mi sono imbattuto in alcune situazioni in cui sarebbe molto conveniente avere la keymap di una modalità principale agire come una keymap di fallback per un'altra modalità principale. Per esempio:

  • Scrivo molto LaTeX in alcuni dei miei documenti dell'organizzazione, quindi sarebbe bello avere latex-modecomandi facilmente disponibili durante la modifica org-mode.
  • Frequento una stanza dell'IRC con il supporto di Markdown, quindi sarebbe anche bello avere delle markdown-modecombinazioni di tasti aggiunte erc-mode.

In entrambi i casi questa keymap aggiuntiva dovrebbe fungere da fallback (per questo non posso usare solo una modalità minore per questo). Non voglio che i comandi in lattice abbiano la precedenza su nessun org-modetasto. Quello che voglio è:
se una chiave è definita in latex-mode-mapAND in cui non è definita, org-mode-maputilizzare l' latex-mode-mapassociazione .

D: Come posso impostare una keymap come keymap di fallback per una modalità principale?
OPPURE
D: Come si possono copiare le chiavi da una mappa della modalità principale a un'altra, senza sovrascrivere nulla?


Giusto per essere chiari. So che potrei definire questi tasti uno per uno, ma sarebbe infinitamente più conveniente avere una soluzione automatizzata.


6
Usa un'unione keymap. Vedere make-composed-keymap.
Disegnò il

Risposte:


12

Questo si è rivelato più semplice del previsto. Come suggerito nei commenti qui e sulla domanda:

(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)))

Questo creerà una mappa di chiavi che è una copia di erc-mode-mapma che eredita anche da markdown-mode-map. Quindi tutte le markdownchiavi saranno ombreggiate ogni volta che si scontrano con le ercchiavi.

Se non desidera che alcuni tasti della mappa dei tasti fallback di eclissare il kemap principale, basta disabilitare in quello principale.

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

2
Ho notato che l'utilizzo define-keydel valore restituito di make-composed-keymappuò avere effetti collaterali imprevisti sulle appendedmappe dei tasti originali e sospetto che lo stesso potrebbe valere per questa mappa manuale . Se si desidera utilizzare define-key, sembra più sicuro creare una nuova keymap la cui keymap principale sia una keymap composta.
Jon O.

@JonO. In realtà, sono stato molto sorpreso di scoprire che questo non accade qui. In tal caso (define-key erc-mode-map "\C-c\C-s" nil), la markdown-modechiave corrispondente sarà comunque disponibile anche nei buffer erc.
Malabarba,

Malabarba: credo che il tuo ultimo commento non si applichi più dopo quel cambio di codice. La make-composed-keymapdocumentazione dice "un'associazione nulla in MAPS sovrascrive qualsiasi associazione corrispondente in PARENT, ma non ignora le associazioni corrispondenti in altre keymap di MAPS". Come markdown-mode-mapè PARENT nel tuo esempio, mi aspetto che l' nilassociazione inibisca l'associazione markdown?
phils,

2
La mia interpretazione è che (make-composed-keymap (list erc-mode-map markdown-mode-map)) avrebbe l'effetto che hai descritto, comunque?
phils,

1
cl-copy-listnon farà davvero quello che vuoi. Se volessi copiare la keymap, allora avresti dovuto usare copy-keymap.
Stefan

3

Come accennato da @Malabarba, puoi usarlo make-composed-keymap. Ma se vuoi davvero che la nuova keymap erediti da entrambe le keymap, tale modifica della nuova keymap non influisce su nessuna delle altre due keymap, devi farlo in due passaggi:

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

Questo perché a define-keyvolte è possibile modificare le mappe passate come primo argomento make-composed-keymapma non quelle passate come secondo. Immagino che dovresti M-x report-emacs-buge richiedere che make-composed-keymapaccetti un elenco di keymap come secondo argomento, quindi potresti semplicemente farlo

(make-composed-keymap nil (list erc-mode-map markdown-mode-map))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.