¿Cómo agregar una clave de prefijo a todas las combinaciones de teclas de un modo específico?

7

Estoy usando un modo, pero no estoy acostumbrado a sus combinaciones de teclas: algunas de ellas entran en conflicto con las globales de emacs. Por lo tanto, quiero agregar un enlace de teclas de prefijo a todas sus combinaciones de teclas existentes.

por ejemplo, si my-mode define la combinación de teclas M-]para my-mode-shot , estoy buscando algunas formas de la siguiente manera:

(define-prefix-for-mode 'my-mode (kbd "C-c m"))

entonces la combinación de teclas para my-mode-shot ahora es C-c m M-].

¿Cómo se debe agregar un enlace de teclas de prefijo a todos los enlaces de teclas disponibles de un modo específico?

象 嘉 道
fuente
1
Puede depender del tipo de modo. ¿Puedes dar detalles?
Stefan
@ Stefan, estoy buscando una solución general, no específica de modo.
象 嘉 道
Una solución que funcione de manera confiable para todos los modos es probablemente imposible. Probablemente pueda preparar una solución, utilizando el código que proporcioné, que funcionará para la mayoría de los modos principales, aunque.
Stefan

Respuestas:

4

Una forma de mover las combinaciones de teclas del modo podría ser con algo como

(let ((origmap <foo>-mode-map)
      (newmap (make-sparse-keymap)))
  (define-key newmap <prefix> origmap)
  (setq <foo>-mode-map newmap))  

Pero este código fallará si se ejecuta antes de que se ejecute el modo foo. Y no tendrá ningún efecto si se ejecuta después de ingresar el modo. Por lo tanto, probablemente tendrá que hacerlo dentro de `(with-eval-after-load '-mode ...).

Además, si se trata de un modo menor, el código anterior tampoco tendrá ningún efecto, ya que además debe hacer algo como (dentro de lo anterior let):

(setcdr (assq '<foo>-mode minor-mode-map-alist) newmap)
Stefan
fuente
2
  1. Defina una clave de prefijo para el mapa de teclas del modo.
  2. Define las otras teclas que te molestan, desde ese mapa de teclas.

Supongamos que el modo foo-modefundamental se une C-x oa foo-it, y no lo hace así.

(define-key foo-mode-map (kbd "C-x o") nil)

Y supongamos que desea foo-mode-mapen la clave de prefijo <f9>:

(define-prefix-command 'foo-mode-map)
(define-key global-map (kbd "<f9>") 'foo-mode-map)
Dibujó
fuente
Esto también hará que foo-itno esté disponible a través de <f9> C-x o, lo que podría ser contraproducente si el objetivo es mover las combinaciones de teclas fuera del camino mientras se mantiene accesible a través de la tecla de prefijo.
nispio
1

Puede modificar el mapa de teclas del modo directamente para mover todos los enlaces bajo el prefijo elegido:

(setcdr my-mode-map
  `(keymap (?\C-c keymap (?m keymap . ,(cdr my-mode-map)))))
Gilles 'SO- deja de ser malvado'
fuente