¿Cómo puedo modificar una macro que llamo con frecuencia?

7

Yo solía use-packageorganizar mi init.el. Me di cuenta de que todas mis declaraciones usan :ensure t. Un ejemplo de declaración es:

(use-package auto-complete
  :ensure t
  :diminish auto-complete-mode
  :init (global-auto-complete-mode t))

Dado que todas mis use-packagedeclaraciones usan :ensure t, ¿hay alguna forma de modificar use-packagepara incluir implícitamente :ensure tsin modificar use-package.el directamente? Idealmente, me gustaría no usar una función con un nombre diferente.

Estoy un poco familiarizado advice-add, pero mi impresión es que esto se usa para agregar un enlace o entorno a una función, no para modificar la función o la macro en sí.

bsamek
fuente
2
El consejo no ayudará aquí, como notó: en use-packagerealidad es una macro Lisp. Probablemente pueda crear su propia my-use-packagemacro que se expanda use-packagecon la configuración predeterminada que prefiera.
glucas
También se pueden aconsejar macros. Caso cerrado.
politza
@politza Cierto: no estoy seguro de lo que estaba pensando. :-) ¿Podría dar un ejemplo de cómo podría funcionar en este caso? Supongo que podría usar :filter-argsconsejos para agregar palabras clave como :ensure t?
glucas
Yo tampoco lo sabía antes de leer el sitio de información sobre nadvice.el.
politza
Entiendo que la solución aquí funciona, pero creo que lo mismo habría sido escribir una función de contenedor para use-package y simplemente usar ese contenedor en su lugar. Es mucho más claro y parece que todo el código involucrado está bajo su control.
Joseph Garvin

Respuestas:

6

Basado en el comentario de @ politza de que (¡por supuesto!) El consejo funciona con macros, encontré algo que parece funcionar.

(defun use-package-always-ensure (form)
  (append form '(:ensure t)))

(advice-add #'use-package :filter-args #'use-package-always-ensure)

Tenga en cuenta que este ejemplo está utilizando las funciones de asesoramiento de Emacs 24.4. No he descubierto cuál sería el equivalente para versiones anteriores de Emacs.

glucas
fuente
No estoy realmente seguro de cómo este uso de consejos afecta el comportamiento de los archivos de compilación de bytes que usan la macro recomendada ... ¿Alguien puede comentar sobre eso?
glucas
1
Las macros se evalúan durante la compilación, por lo tanto, el asesoramiento debe estar disponible en el momento de la compilación, ya sea mediante requireuna función que proporcione el asesoramiento o con eval-when-compile.
5

La versión más reciente de use-packagetiene lo siguiente para habilitar este comportamiento para todos los paquetes:

(setq use-package-always-ensure t) 

Por si alguien más tenía la misma pregunta.

Tianxiang Xiong
fuente