Diferencias entre configurar teclas de modo principal con un gancho versus agregarlas al mapa de modo


13

Supongamos que he descargado un modo principal llamado magical-mode, y tiene su propio mapa de teclas mágico llamado magical-mode-map. Este modo también proporciona un enlace magical-mode-hookque se ejecuta cada vez que se magical-modeconvierte en el modo principal de un búfer. Ahora quiero modificar mi archivo init para agregar algunas asociaciones de teclas personalizadas para usar en ese modo.

Parece que hay (al menos) dos formas de configurar enlaces de teclas personalizados para magical-mode. El que veo más comúnmente es este:

(defun my-magical-keys ()
  (local-set-key (kbd "C-i") 'previous-line)
  (local-set-key (kbd "C-k") 'next-line)
  (local-set-key (kbd "C-j") 'backward-char)
  (local-set-key (kbd "C-l") 'forward-char))
(add-hook 'magical-mode-hook 'my-magical-keys)

Pero también es posible hacerlo de esta manera:

(define-key magical-mode-map (kbd "C-i") 'previous-line)
(define-key magical-mode-map (kbd "C-k") 'next-line)
(define-key magical-mode-map (kbd "C-j") 'backward-char)
(define-key magical-mode-map (kbd "C-l") 'forward-char)

El segundo método en realidad me parece más limpio. ¿Hay alguna ventaja en hacerlo de una manera sobre la otra?


Yo uso las mismas teclas para los comandos básicos de movimiento. Tenga cuidado: esta es una batalla cuesta arriba y es posible que desee aprender un poco más sobre las combinaciones de teclas antes de comenzar a hacer esto.
tarsius

@tarsius Una batalla cuesta arriba de hecho. He ido por ese camino antes, pero ahora estoy de vuelta a good ol' C-ny C-p. El ejemplo es solo código ficticio. Quería crear algunos modos de ejemplo y enlaces de ejemplo muy simples, precisamente para que los enlaces en sí mismos no distraigan el propósito real de la pregunta.
nispio

Respuestas:


15

El segundo enfoque es preferible ya que modifica el mapa de teclas del modo solo una vez.

Si lo hace utilizando el gancho del modo, se llamará cada vez que ese modo esté habilitado en algún búfer. Hacerlo de nuevo por lo general no tendrá un efecto porque las teclas están nuevamente vinculadas a lo que ya están vinculadas. Los mapas de teclas del modo principal son "locales" para el modo principal, no los búferes individuales que usan ese modo, por lo que si cambia un enlace en uno de estos búferes local-set-key, eso afecta a todos los búferes con el mismo modo mayor.

local-set-keyestá destinado principalmente a ser utilizado como un comando. Una vez que haya determinado que desea hacer algún cambio persistente, úselo define-keycon el mapa de teclas de modo como primer argumento.

Si usa un gancho para modificar el mapa de teclas una y otra vez, eso podría entrar en conflicto con el uso previsto de local-set-key. Digamos que solías M-x local-set-key RET C-i fancy-previous-line RETporque quieres probar esa variante de previous-line. Si ahora abre un nuevo búfer que usa el mismo modo principal, el gancho se ejecutará nuevamente y anulará su enlace temporal, en todos los búferes que usen ese modo principal, incluido el búfer en el que utilizó anteriormente local-set-key.


Me gusta esta respuesta, pero ¿qué pasa si el modo se carga automáticamente?
remvee

2
Puede retrasar la carga de cualquier código hasta después de alguna biblioteca se ha cargado: (eval-after-load 'magical '(progn (define-key magical-mode-map ...) ...)).
tarsius

4

Usar (define-key my-magical-mode-map …)es la forma normal.

Cuando usa un gancho y local-set-key, las teclas se agregan cada vez que ingresa al modo My Magical en algún buffer. Esto es extraño porque local-set-keyafecta a todos los buffers que están en el mismo modo (más generalmente, todos los buffers que usan el mismo mapa de teclas). Entonces, si ha realizado algún cambio en el mapa de teclas, se anulará cada vez que ingrese al modo Mi Magia en un búfer.

El segundo método también puede ser confuso si personaliza el mapa de teclas en diferentes lugares. Los ganchos se ejecutan en orden inverso al orden en que se agregaron, y hasta la primera vez que se ejecutan, no verá ningún rastro de sus personalizaciones.


2

Aparentemente, no está preguntando sobre la definición de un mapa de teclas en modo principal, sino sobre el código de usuario para agregar o cambiar algunas asociaciones de teclas en un mapa de teclas en modo mayor existente . Usted dice "personalizado", lo que sugiere esto, pero también podríamos dejarlo claro.

Sin duda, lo que dice que ve más comúnmente para esto no es lo que se usa generalmente para definir un mapa de teclas de modo mayor. Es no lo que se encuentra en el código fuente de Emacs, por ejemplo. Y no es lo que se recomienda en el manual de Elisp (nodo Major Mode Conventions).

Solo quería sacar eso del camino, para que quede claro para los demás: generalmente no desea usar el gancho de modo para definir el mapa de modo mayor.


A su pregunta sobre personalizaciones de clave de usuario:

En cualquier caso, no es local-set-keyque debas usar en un gancho de modo. Simplemente utilícelo define-keycon el mapa de teclas del modo principal, exactamente como en su primer ejemplo. @tarsius ya lo ha explicado bien.

Aparte de eso, la respuesta es: hace poca diferencia, en general , si vincula las teclas (usando define-keyel mapa de modo) de una vez por todas o si usa el gancho para vincularlas cada vez que ingresa al modo.

Pero puede hacer una diferencia si los enlaces en el mapa cambian, por ejemplo, al cargar algún otro código que los cambie. En ese caso, poner enlaces en el enlace de modo mayor asegura que cuando se ingrese el modo, se establecerán los enlaces. Es decir, asegura que se realizarán, pero no garantiza que nada más los cambie después (por ejemplo, otra función en el mismo gancho, invocada después). Recuerda que tienes poco control sobre lo que se ejecuta en un gancho y cuándo, a menos que, por supuesto, estés seguro de que solo tu propio código se mete con él.

Esa es la única diferencia en efecto, que se me ocurre. Para que usted decida cuándo considera que esa diferencia es una ventaja de uno u otro enfoque. FWIW, mirando mi propio código, no creo que alguna vez asocie las teclas en un gancho de modo.


Gracias. He modificado la pregunta para aclarar con suerte el hecho de que no estoy creando un modo principal, simplemente agregando mis propias asociaciones de teclas y el modo principal existente .
nispio

0

Su nombre es un poco confuso (creo que debería eliminar my en su segunda parte de la pregunta).

De todos modos, suponiendo que my-magical-keyses una función de personalización del usuario magical-mode, veo una ventaja obvia. Es fácil de quitar (por remove-hook) gancho de una sola vez.

La segunda ventaja es para qué están destinadas las funciones. Quiero decir que son reutilizables. puedes conectarlos a otros modos.

Editar:

Como ha señalado @tarsius, quitar el gancho no restaurará el comportamiento original y cambiar la función a un modo menor puede ser mejor.


Estoy personalizando un hipotético modo principal llamado my-magical-mode. Sin embargo, si el uso del my-prefijo es confuso, ciertamente puedo editar la pregunta.
nispio

Sí, eso sería mejor, generalmente (al menos como veo en la naturaleza) my-se agrega para las funciones del usuario.
kindahero

1
Convenido. Acabo de aplicar el my-para que nadie piense que estaba preguntando cómo configurar un modo real llamado magical-mode(si existe).
nispio

1
No, quitar el gancho no restaurará los enlaces anteriores. Al menos no hasta que se reinicie Emacs, y luego no veo tener que comentar solo una línea en lugar de cuatro como una gran mejora.
tarsius

2
En cuanto a la segunda ventaja que mencionas: aquí sería preferible crear un modo menor que luego podría habilitarse para varios modos principales y / o solo algunos de los búferes que usan un modo mayor en particular.
tarsius
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.