source - Vinculaciones de teclas personalizadas específicas para el modo emacs: local-set-key vs define-key
emacs source code (2)
Después de algunos años de personalizar mi archivo .emacs
, descubrí que usé dos tipos diferentes de construcciones para configurar enlaces de teclas específicos para el modo mayor:
1. usando un gancho y local-set-key
. Por ejemplo:
(defun my/bindkey-recompile ()
"Bind <F5> to `recompile''."
(local-set-key (kbd "<f5>") ''recompile))
(add-hook ''c-mode-common-hook ''my/bindkey-recompile)
Yo diría que esta construcción facilita el uso de los mismos enlaces de teclas para diferentes modos principales, agregando la misma función a todos los ganchos de modo mayor relevantes (en otras palabras, " qué tipo de combinaciones de teclas quiero " están claramente separadas de las " ¿Para qué modos los quiero ? Sin embargo, no me siento cómodo con el hecho de que dichas personalizaciones se realicen en el nivel del búfer, mientras que creo que pertenecen al modo principal.
2. usar define-key
(a menudo combinado con eval-after-load
para retrasar la evaluación hasta que se cargue el mapa define-key
correspondiente). Por ejemplo:
(eval-after-load "cc-mode"
''(progn
(define-key c-mode-map (kbd "C-c o") ''ff-find-other-file)
(define-key c++-mode-map (kbd "C-c o") ''ff-find-other-file)))
En contraste, esta construcción personaliza el modo mayor en sí mismo, pero es menos flexible: si quiero usar los mismos enlaces de teclas para otro modo, tendré que encontrar los archivos correctos y los nombres de mapas de teclado para este modo, y casi duplicar la eval-after-load
-expresión de eval-after-load
posterior (aunque esto probablemente podría automatizarse con una función / macro).
Pregunta: aunque ambos tipos de construcciones funcionan bien y producen el resultado que quiero, son técnicamente muy diferentes, configurando los enlaces de teclas en diferentes mapas de teclas en diferentes momentos. Entonces, mi pregunta es: ¿entre estos dos constructos, hay una manera "preferida / mejor" de hacer las cosas? (¿O tal vez la "mejor" construcción es una tercera que no conozco?)
Por "preferido / mejor" me refiero a cosas como:
- Menos propensos a romper con las nuevas versiones de emacs.
- menos propensos a perturbarse / ser perturbados por modos menores activos
- más idiomático / legible / compartible con otros
Creo que los dos enfoques que describe son menos diferentes de lo que piensa.
Observe que local-set-key
evalúa de hecho (define-key map key command)
donde map
es el valor de (current-local-map)
, que normalmente se establece en el modo mayor.
Así que aunque podrían estar haciendo cosas diferentes; la mayor parte del tiempo, la única diferencia real será que la función de enlace con la llamada local-set-key
establecerá esa misma tecla repetidamente / de forma redundante, mientras que el otro enfoque la establece solo una vez.
Puede demostrárselo a sí mismo utilizando local-set-key
en un gancho de modo, eliminando esa función de enganche después de haber sido utilizada, y luego creando un nuevo búfer en ese mismo modo principal, y probando el enlace.
Menos propensos a romper con las nuevas versiones de emacs.
Supongo que podría argumentar que el nombre de un mapa de teclas puede cambiar en el futuro y, por lo tanto, no es necesario saber que el nombre es una ventaja, pero también podría decir que el nombre del gancho de modo podría cambiar. No creo que ninguna de las dos preocupaciones sea suficiente para preocuparse.
Una cosa a tener en cuenta es que local-set-key
funcionará incluso si el modo mayor no estableció un current-local-map
, lo que creo que lo hace un poco más sólido en lo que respecta a los enfoques generalizados.
menos propensos a perturbarse / ser perturbados por modos menores activos
No hay diferencia. Todos los mapas de teclas de modo secundario tienen prioridad sobre todos los mapas de modo mayor, y ninguno de estos enfoques tendrá ningún efecto en el orden de minor-mode-map-alist
(que determina la prioridad de los mapas de teclas en modo secundario).
más idiomático / legible / compartible con otros
Ambos son completamente legibles para mi mente, por lo que tampoco puedo distinguirlos en este aspecto.
Digo que use el enfoque que le parezca mejor en cada contexto. Creo que es bueno tener un enfoque estándar para la mayoría de las cosas por coherencia en su código, pero dudo que sea importante cuál elija. Obviamente, se pueden ahorrar algunos ciclos de CPU al no evaluar el mismo código innecesariamente, pero eso debería importar muy poco como para no ser motivo de preocupación.
Creo que el caso más obvio para uno sobre el otro es el que ya mencionó, si desea aplicar el mismo enlace a múltiples modos usando un gancho común (pero no a todos los modos), recomiendo crear un personalizado modo menor ), entonces una local-set-key
dentro de ese gancho es definitivamente el camino a seguir.
Tengo muchos comandos de teclado personalizados y no puedo molestarme con varias formas de configurarlos en Emacs y todos estos mapas de teclas se anulan entre sí, así que simplemente instalé la clave de bind-key
John Wiegley según mi respuesta relevante .
(require ''bind-key)
(bind-key "C-l" ''goto-line)