tutorial source para mac descargar code emacs elisp

source - emacs para mac



Emacs clave de enlace de reserva (3)

Esto es lo que uso para mi paquete de smart-tab que hace exactamente eso.

(defun smart-tab-default () "Indents region if mark is active, or current line otherwise." (interactive) (if mark-active (indent-region (region-beginning) (region-end)) (call-interactively (or ;; Minor mode maps for tab (without smart-tab-mode) (cdar (assq-delete-all ''smart-tab-mode (minor-mode-key-binding "/t"))) (cdar (assq-delete-all ''smart-tab-mode (minor-mode-key-binding [(tab)]))) (local-key-binding "/t") (local-key-binding [(tab)]) (global-key-binding "/t") (global-key-binding [(tab)])))))

Y en el comando smart-tab (que es el que está vinculado a la pestaña en el modo menor), tiene lo siguiente:

(if (smart-tab-must-expand prefix) ;; use smart tab (smart-tab-default))

Primero comprueba si hay enlaces de modos menores para tab (no incluye smart-tab-mode ), luego local, y finalmente combinaciones globales de teclas.

Tengo un modo menor. Si ese modo está activo y el usuario toca el DEL, quiero hacer algo, pero solo si se cumple alguna condición. Si la condición se cumple y la acción se ejecuta, no quiero hacer nada más después de eso. Pero si la condición falla, no quiero hacer nada y dejar que se ejecute la acción DEL predeterminada.

No estoy seguro de cómo podría resolver esto. Pero creo que podría hacerlo de dos maneras:

1) Podría volver a vincular la tecla DEL a una función en el modo menor y luego verificar si las condiciones no son así. Pero entonces, ¿cómo sé cuál es el comando predeterminado para DEL?

2) Podría agregar un gancho de precomandos como este. Ejecute el comando y luego rompa la cadena. ¿Pero cómo rompo la cadena?

(add-hook ''pre-command-hook (lambda() (when (equal last-input-event ''backspace) ;; Do something and then stop (do not execute the ;; command that backspace is bound to) )))

¿De qué manera lo resolverías? ¡Gracias!


La forma de hacerlo es desactivar temporalmente su modo secundario y luego buscar el enlace de la clave.

Imagina que has vinculado ''do-thingy a DEL . Entonces, esto haría el truco (suponiendo que la condición que desea desencadenar es (equal last-input-event ''backspace) :

(defun do-thingy () "Do something, unless last event was backspace." (interactive) (if (equal last-input-event ''backspace) (let* ((my-minor-mode nil) (original-func (key-binding (kbd "DEL")))) ;; original-func is whatever DEL would be if ;; my-minor-mode were disabled (call-interactively original-func)) (message "Here''s my minor mode behavior!")))

Nota: Este comportamiento asume que ha configurado sus enlaces de teclas de la manera estándar que haría un modo menor . Específicamente, debe agregar su minor-mode-map-alist a la variable minor-mode-map-alist agregando un elemento (my-minor-mode . my-minor-mode-keymap) . Así es como funciona la declaración de let anterior, busca el enlace que desea con su modo desactivado temporalmente.

Si usa define-minor-mode para definir su modo menor, el mapa de teclas se configura automáticamente de la "manera correcta".


No parece haber una manera de hacer lo que quieres de manera confiable. Si su nuevo comando está obligado a DEL, entonces lo que estaba obligado a DEL antes en el mapa de teclas actual ya no está allí. El otro enfoque que propuso no funcionará porque los pre-comandos-ganchos no impiden que se produzca la siguiente acción. También podría pensar en interrumpir la ejecución posterior con ^ G (Keyboard-Quit), pero esa es una interrupción no controlada que podría detener más cosas de las que desea.

Incluso si hace que el proceso de configuración de la nueva encuadernación sea un poco más sofisticado que solo volver a unirlo, y recuerda lo que estaba vinculado allí antes, para que pueda llamarlo después, realmente no tiene lo que está buscando. Si alguien desea volver a vincular la acción "predeterminada", tiene que hacerlo modificando su función en lugar de reemplazar la vinculación de la clave.

Lo que quiere hacer no se ajusta al modelo de Emacs de cómo funciona el enlace de claves.