Use dos mapas de modo mayor en el mismo búfer


11

Me he encontrado con algunas situaciones en las que sería muy conveniente que el mapa de teclas de un modo principal actúe como un mapa de teclas alternativo para otro modo principal. Por ejemplo:

  • Escribo mucho LaTeX en algunos de mis documentos de organización, por lo que sería genial tener latex-modecomandos fácilmente disponibles durante la edición org-mode.
  • Frecuenta una sala de IRC con soporte de Markdown, por lo que también sería bueno tener markdown-modeteclas agregadas erc-mode.

En ambos casos, este mapa de teclas adicional debería actuar como una reserva (por eso no puedo usar un modo menor para esto). No quiero que los comandos de látex anulen ninguna org-modetecla. Lo que quiero es:
si una clave está definida en latex-mode-mapY no está definida, org-mode-mapentonces use el latex-mode-mapenlace .

P: ¿Cómo puedo configurar un mapa de teclas como un mapa de teclas alternativo para un modo mayor?
O
P: ¿Cómo puedo copiar claves de un mapa de modo principal a otro, sin anular nada?


Solo para aclarar. Sé que podría definir estas claves una por una, pero sería infinitamente más conveniente tener una solución automatizada.


66
Use una combinación de mapas de teclas. Ver make-composed-keymap.
Dibujó el

Respuestas:


12

Esto resultó ser más simple de lo esperado. Como se sugiere en los comentarios aquí y sobre la pregunta:

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

Esto creará un mapa de teclas que es una copia erc-mode-mappero que también hereda de markdown-mode-map. Por lo tanto, todas las markdownteclas se sombrearán cada vez que choquen con las ercteclas.

Si no desea algunas de las claves del mapa de teclas retroceso a eclipsar a la kemap principal, justo desactivarlas en la principal.

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

2
Me di cuenta de que usar define-keyel valor de retorno de make-composed-keymappuede tener efectos secundarios inesperados en los mapas de teclas originales, y sospecho que lo mismo podría aplicarse a este appendedmapa manual . Si desea utilizar define-key, parece más seguro crear un nuevo mapa de teclas cuyo mapa de teclas principal sea ​​un mapa de teclas compuesto.
Jon O.

@JonO. En realidad, me sorprendió mucho descubrir que esto no sucede aquí. Si lo hago (define-key erc-mode-map "\C-c\C-s" nil), la markdown-modeclave correspondiente seguirá estando disponible incluso en los buffers erc.
Malabarba

Malabarba: Creo que su último comentario ya no se aplica después de ese cambio de código. La make-composed-keymapdocumentación dice que "un enlace nulo en MAPS anula cualquier enlace correspondiente en PADRE, pero no anula los enlaces correspondientes en otros mapas de teclas de MAPS". Como markdown-mode-mapes PADRE en su ejemplo, ¿esperaría que ese nilenlace inhiba el enlace de rebajas?
phils

2
Sin embargo, mi interpretación es que (make-composed-keymap (list erc-mode-map markdown-mode-map)) tendría el efecto que usted describió.
phils

1
cl-copy-listRealmente no hará lo que quieres. Si quería copiar el mapa de teclas, entonces debería haberlo usado copy-keymap.
Stefan

3

Como mencionó @Malabarba, puede usarlo make-composed-keymappara eso. Pero si realmente desea que el nuevo mapa de teclas herede de ambos mapas de teclas, por lo que modificar el nuevo mapa de teclas no afecta a ninguno de los otros dos mapas de teclas, debe hacerlo en dos pasos:

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

Esto se debe a define-keyque a veces se pueden modificar los mapas pasados ​​como primer argumento make-composed-keymappero no aquellos pasados ​​como segundo. Supongo que deberías M-x report-emacs-bugy solicitar que make-composed-keymapaceptes una lista de mapas de teclas como segundo argumento, para que puedas hacer

(make-composed-keymap nil (list erc-mode-map markdown-mode-map))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.