Vinculaciones de teclas específicas de un búfer

13

¿Es posible establecer enlaces de teclas específicos para el búfer?

Tengo lo siguiente en uno de mis archivos de organización:

# Local Variables:
# eval: (local-set-key (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)
# End:

Pero este enlace persiste también para otros archivos de modo org. Si abro un archivo con un modo principal diferente, entonces se inicia mi enlace de teclas predeterminado.

Parece que local-set-keyestá estableciendo enlaces específicos para el modo mayor no específicos para el búfer.

¿Cómo puedo tener enlaces que se activan solo en un búfer en particular?

Kaushal Modi
fuente
2
Oh wow, tienes razón: "El enlace va en el mapa local del búfer actual, que en la mayoría de los casos se comparte con todos los demás búferes en el mismo modo principal". Nunca lo supe.
shosti
Ahora que lo pienso, local-unset-keyenganchado org-mode-hookpodría funcionar si se ejecuta antes de la Local Variables:sección.
Kaushal Modi
O podría hacer un modo menor con un mapa de teclas semi disperso y alternarlo usandoLocal Variables:
Vamsi
@Vamsi ¡Gracias! ¡Esta es una solución elegante! He actualizado tu solución.
Kaushal Modi

Respuestas:

17

Para el cierre, aquí hay una respuesta que amplía mi comentario. Defino un modo menor con la combinación de teclas requerida y lo alterno en el búfer requerido usando variables locales de archivo.

  (define-minor-mode my-org-buffer-local-mode
    "Minor mode to simulate buffer local keybindings."
    :init-value nil)
  (define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)

Puede alternarlo en los archivos necesarios configurando la sección de variables locales al final del archivo de la siguiente manera. También puede cambiar o agregar la combinación de teclas aquí. Aún necesitará definir diferentes modos menores para cada búfer que asigne la misma secuencia de teclas a diferentes comandos.

 # Local Variables:
 # my-org-buffer-local-mode: t
 # eval:(define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-other-custom-defun-specific-to-this-buffer)
 # End:
Vamsi
fuente
@kaushalmodi: es posible que desee desglosar sus ediciones en una respuesta separada, ya que es más completa. Además, no podrá asignar la misma secuencia de teclas a dos funciones diferentes simultáneamente a menos que use un nombre específico de búfer.
Vamsi
Me sale este error: eval-buffer: Symbol's value as variable is void: my-org-buffer-local-mode-mapcuando intento ejecutar esto(define-minor-mode my-org-buffer-local-mode "Minor mode to simulate buffer local keybindings." :init-value nil) (define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)
incandescentman
También recibo el mismo error. ¿alguna idea?
zeltak
@incandescentman call (make-keymap) con :keymappalabra clave, consulte nullprogram.com/blog/2013/02/06
nichijou
5

Aquí hay una forma genérica de establecer enlaces de teclas específicos del búfer.

  • Cree un modo menor temporal (guarde el fragmento a continuación temp-mode.ely requireen su init.el.
  • Habilite ese temp-modemodo menor y defina el mapa de teclas de ese modo menor solo en el búfer (s) que necesita.

Coloque el Local Variablesfragmento a continuación en el búfer donde desea el enlace de clave personalizado. Debajo hay ejemplos de org-modearchivos.

En buffer ONE

# Local Variables:
# eval: (temp-mode 1)
# eval: (define-key temp-mode-map (kbd "<f10>") 'function-ONE)
# End:

Si algún otro búfer redefine la misma combinación de teclas usando,

En el buffer DOS

# Local Variables:
# eval: (temp-mode 1)
# eval: (define-key temp-mode-map (kbd "<f10>") 'function-TWO)
# End:

entonces el nuevo enlace se hace efectivo al hacerlo M-x revert-buffer.

Esto es lo que haría si necesito cambiar entre estos dos buffers con mucha frecuencia y si tengo que usar el F10enlace en ambos:

  • Trabajar en el búfer UNO C-x C-s(guardar) y cambiar al búfer DOS
  • revert-buffer(actualizar enlaces), trabajar en el búfer DOS C-x C-sy cambiar al búfer UNO
  • revert-buffer(actualizar enlaces), trabajar en el buffer UNO C-x C-sy cambiar al buffer DOS

Pero prefiero vincular los diferentes comandos específicos del búfer a diferentes teclas.


Modo menor temporal

;; temp-mode.el
;; Temporary minor mode
;; Main use is to enable it only in specific buffers to achieve the goal of
;; buffer-specific keymaps

(defvar temp-mode-map (make-sparse-keymap)
  "Keymap while temp-mode is active.")

;;;###autoload
(define-minor-mode temp-mode
  "A temporary minor mode to be activated only specific to a buffer."
  nil
  :lighter " Temp"
  temp-mode-map)

(provide 'temp-mode)
Kaushal Modi
fuente