Mi configuración está llena de consejos, y sigo escuchando sobre el nuevo nadvice.el
paquete minimalista brillante .
He buscado en los manuales y he leído la fuente , pero admito abiertamente: todavía no tengo idea de cómo usarlo realmente.
¿Alguien aquí puede señalarme una guía o decirme cómo comenzar a portar mis consejos antiguos?
advice
emacs-internals
elisp
PythonNut
fuente
fuente
M-x report-emacs-bug
. Algunos desarrolladores a veces prefieren desarrollar en lugar de documentar. ;-) Es importante que Emacs se documente a sí mismo.nadvice
de mi config: : después , : filtro de retorno , : alrededor , : antes, hasta queRespuestas:
Se incluye toda la información que necesita en la
C-h f add-function
que se describe el mecanismo subyacente deadvice-add
.El nuevo sistema de consejos básicamente actúa como reemplazar la definición actual de una función por la función descrita en la tabla en
C-h f add-function
, dependiendo de su elección delWHERE
argumento, solo más limpio por el simple hecho de rastrear qué comportamiento se ha definido en qué archivo fuente.Un ejemplo con la
:around
opciónEl caso más general es la
:around
opción, así que doy un ejemplo para eso. (Probablemente sea mejor usarWHERE
parámetros dedicados cuando sea posible, pero puede reemplazarlos por una:around
función equivalente ).A modo de ejemplo, digamos que usted desea depurar algún uso de
find-file
y deseaprint
la lista de parámetros cada vez que se llama. Podrías escribirCon esta nueva implementación, todo lo que el consejo necesita se pasa como argumento.
ad-get-args
se vuelve innecesario, porque los argumentos se pasan a la función de asesoramiento como argumentos de función normal (paraWHERE
argumentos para los que tiene sentido).ad-do-it
se vuelve innecesario a medida que el:around
consejo obtiene como argumentos la función y los argumentos, por lo que(ad-do-it)
se reemplaza por la formao cuando hayas nombrado los argumentos
que es más limpio ya que no hay formas mágicas involucradas. La modificación de los argumentos simplemente sucede al pasar valores modificados a
OLD-FUNCTION
.Otros
WHERE
valoresLa cadena de documentos
add-function
contiene una tabla de todos los lugares de asesoramiento (o "combinadores"), y a qué son equivalentes, y explica la funcionalidad en términos de unlambda
comportamiento equivalente a la función recomendada:donde FUNCTION es la función de asesoramiento y OLDFUN la función donde se agrega el asesoramiento. No intente comprenderlos todos a la vez, solo seleccione un
WHERE
símbolo que suene apropiado e intente comprenderlo.O simplemente usar
:around
. Por lo que puedo decir, la única ventaja de usarWHERE
s especializados:around
para todo es que obtienes un poco más de información al buscarC-h f ADVISED-FUNCTION
antes de leer la cadena de documentación del consejo. A menos que planee publicar el código que contiene el consejo, probablemente no importe.Funciones de asesoramiento con nombre
Recomiendo usar funciones con nombre como consejo ya que proporciona muchas ventajas (algunas de ellas también se aplican al uso de funciones con nombre para ganchos):
Se muestra
C-h f find-file
comoenlace a la definición de la función de asesoramiento, que como siempre contiene un enlace al archivo donde se definió. Si el consejo se hubiera definido como un
lambda
formulario directamente en eladvice-add
formulario, la cadena de documentación se mostraría en línea (¿un desastre para cadenas de documentación largas?) Y nada indicaría dónde se definió.Puedes eliminar el consejo con
Puede actualizar la definición del consejo sin volver a ejecutar
advice-add
o arriesgarse para mantener activa la versión anterior (ya que la ejecuciónadvice-add
con un cambiolambda
será reconocido como un nuevo consejo, no como una actualización de la anterior).Comentario lateral La
#'function
notación es básicamente equivalente a'function
, excepto que ayuda al compilador de bytes a identificar símbolos como nombres de funciones y, por lo tanto, a identificar funciones que faltan (por ejemplo, debido a errores tipográficos).fuente
(advice-add 'find-file :around #'my-find-file-advice-print-arguments)
y de manera similar(advice-remove 'find-file #'my-find-file-advice-print-arguments)
.advice-add
es un caso fronterizo. Personalmente, considero que la' ↔ #'
distinción es principalmente una ayuda para identificar errores tipográficos en los nombres de funciones, por lo que aquí probablemente dependerá de si uno espera que la función se defina para el momento en que se agrega el consejo.add-function
). Deseo que los documentos lo aclaren más. Podría intentar hacer un parche para ello.C-h f find-file
, noC-x
?"