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-hook
que se ejecuta cada vez que se magical-mode
convierte 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?
elisp
key-bindings
major-mode
nispio
fuente
fuente
C-n
yC-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.Respuestas:
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-key
está destinado principalmente a ser utilizado como un comando. Una vez que haya determinado que desea hacer algún cambio persistente, úselodefine-key
con 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íasM-x local-set-key RET C-i fancy-previous-line RET
porque quieres probar esa variante deprevious-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ó anteriormentelocal-set-key
.fuente
(eval-after-load 'magical '(progn (define-key magical-mode-map ...) ...))
.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 porquelocal-set-key
afecta 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.
fuente
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-key
que debas usar en un gancho de modo. Simplemente utilícelodefine-key
con 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-key
el 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.
fuente
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-keys
es una función de personalización del usuariomagical-mode
, veo una ventaja obvia. Es fácil de quitar (porremove-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.
fuente
my-magical-mode
. Sin embargo, si el uso delmy-
prefijo es confuso, ciertamente puedo editar la pregunta.my-
se agrega para las funciones del usuario.my-
para que nadie piense que estaba preguntando cómo configurar un modo real llamadomagical-mode
(si existe).