Muchos comandos de Emacs alteran su comportamiento cuando se los llama con uno o más C-uprefijos. En algunos casos, el comportamiento predeterminado de un comando es menos útil para mí que el comportamiento que obtengo al prefijarlo C-u. Al mismo tiempo, no quiero deshacerme del comportamiento predeterminado por completo.
Para dar un ejemplo concreto, el quit-window
comando (ligado a q
en help-mode
) se cierra la ventana y entierra el buffer está representada en ella por defecto actual. Cuando se llama con C-uél, mata el búfer en su lugar. Me gustaría que el comando elimine el búfer de forma predeterminada y lo entierre cuando se lo llame con un C-uprefijo.
P: ¿Cómo puedo decirle a Emacs que haga que un comando se comporte como si fuera invocado con un C-u prefijo por defecto mientras mueve el comportamiento predeterminado al C-u prefijo ?
Sé que podría abordar esto redefiniendo el comando original o envolviéndolo en un comando personalizado que pasa los argumentos de prefijo de acuerdo con mis preferencias. Pero prefiero hacer algo como esto:
(swap-args 'quit-window)
fuente
:filter-args
lugar de:around
, creo.swap-args
funciona porque hace que elC-u
comportamiento sea el predeterminado al aplicarlo a un comando. Sin embargo, cuando llamo al comando conC-u
, no obtengo el comportamiento original. Tal vezcalled-interactively-p
es la culpa? Entiendo que con un argumento de'any
, esta función solo regresaránil
si el comando que contiene se llama desde Lisp, por lo que al invocar el comando recomendado a través de un enlace de teclas, no se puede alcanzar la rama else.'any
estaba bien, lo usé enfuncall
lugar deapply
por error.org-insert-subheading
) Verifican literalmente el argumento universal en bruto (aparentemente(4)
) en lugar de una verificación de coerción de verdad.Otro método basado en el hecho de que una
interactive-form
propiedad en el plist de la función anula la forma especificada en el código: ( ref )Utilizando
(interactive-form 'function)
para obtener la especificación actual, también es posible manejar especificaciones más complejas.Creo que la mejor solución (si es posible) es envolver la función con
(let ((prefix-arg (not current-prefix-arg)))
pesarfuente
No es tan fácil como el pensamiento. Sin embargo, como es trivial tener el comando intercambiado:
fuente
quit-window
comando.C-u
comportamiento, ¡y estoy seguro de que otras personas que se encuentren con tu publicación recibirán ayuda! Personalmente, no lo voy a usar porque tengo varios comandos cuyo comportamiento quiero cambiar, y me gustaría evitar tener que definir varios contenedores.