Emacs enlace de clave para mĂșltiples comandos
elisp key-bindings (4)
Defina un comando que llame a cada una de las funciones (comandos) que desee, condicionalmente. Usa el prefijo arg para distinguir a cual llamar. Entonces, si el nuevo comando de despacho está ligado a, por ejemplo, Co
, entonces Cu Co
llamaría a una de las funciones y Co
(sin un prefijo arg) llamaría a la otra.
Querrá hacer Chf Ch f interactive
, para ver cómo definir un comando que reconozca un argumento de prefijo, etc. Consulte también el manual de Elisp: use i interactive
para encontrar dónde se enseña esto.
Este es un ejercicio fácil y divertido. Aprender a definir sus propios comandos simples es una buena manera de comenzar a hablar con Emacs en su propio idioma.
Soy nuevo en emacs, y tengo una pregunta de novato. Puedo vincular una tecla a una función particular mediante (global-set-key (kbd "Cc abc") ''some-command)
, donde some-command
es una función. ¿Cómo puedo invocar dos funciones (digamos some-command
y some-other-command
) con un enlace de clave? ¡Muchas gracias!
Puede definir otra función con defun
en la que invoque a los demás con funcall
o apply
modo que cuando llame a esta tercera función (que también puede vincular) invocará a los demás.
Puede definir su propia función, que llama a las dos funciones y vincula la clave a su propia función. O usa una lambda simple:
(global-set-key (kbd "C-c a b c") (lambda () (interactive) (some-command) (some-other-command)))
Recomiendo nunca vincular las expresiones lambda a las claves, por la sencilla razón de que cuando le preguntas a Emacs qué hace esa clave, terminará diciéndote algo como esto (para usar el código aceptado, cuando se compila byte, como ejemplo):
C-c a b c runs the command #[nil "/300 /210/301 /207" [some-command
some-other-command] 1 nil nil], which is an interactive compiled Lisp
function.
It is bound to C-c a b c.
(anonymous)
Not documented.
Si nunca compila byte su código, es menos críptico, pero aún no está formateado:
C-c a b c runs the command (lambda nil (interactive) (some-command)
(some-other-command)), which is an interactive Lisp function.
Lo cual, aunque todavía es legible en el caso de una función pequeña como esta, se vuelve rápidamente incomprensible para funciones más grandes.
Comparado con:
C-c a b c runs the command my-run-some-commands, which is an
interactive compiled Lisp function in `foo.el''.
It is bound to C-c a b c.
(my-run-some-commands)
Run `some-command'' and `some-other-command'' in sequence.
Que obtendrá si nombra la función (lo que lo anima a documentarlo más de lo que lo hace una función anónima).
(defun my-run-some-commands ()
"Run `some-command'' and `some-other-command'' in sequence."
(interactive)
(some-command)
(some-other-command))
(global-set-key (kbd "C-c a b c") ''my-run-some-commands)
Finalmente, como abo-abo señala, esto también significa que puede visitar fácilmente la definición de esa función en cualquier momento, para ver o editar / reevaluar el código, ya sea siguiendo el enlace proporcionado en el búfer de ayuda (a foo.el
en mi ejemplo), o usando Mx find-function
(ingrese el nombre de la función), o Mx find-function-on-key
(escriba la secuencia de teclas a la que está vinculado).