Como posso modificar uma macro que ligo com frequência?

7

Eu uso use-packagepara organizar o meu init.el. Percebi que todas as minhas declarações usam :ensure t. Um exemplo de declaração é:

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

Como todas as minhas use-packagedeclarações usam :ensure t, existe uma maneira de modificar use-packagepara incluir implicitamente :ensure tsem modificar diretamente o use-package.el? Idealmente, eu gostaria de não usar uma função com nome diferente.

Estou um pouco familiarizado com advice-add, mas minha impressão é que isso é usado para adicionar um gancho ou ambiente a uma função, não para modificar a função ou a macro em si.

bsamek
fonte
2
O conselho não vai ajudar aqui, como você observou: use-packagena verdade é uma macro Lisp. Provavelmente, você pode criar sua própria my-use-packagemacro, que se expande para use-packageas configurações padrão de sua preferência.
glucas
Macros também podem ser aconselhadas. Caso encerrado.
politza
@politza True - não tenho certeza do que eu estava pensando. :-) Você poderia fornecer um exemplo de como isso poderia funcionar nesse caso? Suponho que você poderia usar :filter-argsconselhos para adicionar palavras-chave como :ensure t?
glucas
Também não sabia disso antes de ler o site de informações sobre nadvice.el.
politza 5/03/2015
Entendo que a solução aqui funciona, mas acho que a mesma coisa a fazer seria escrever uma função de invólucro para o pacote de uso e apenas usar esse invólucro. É muito mais claro e parece que todo o código envolvido está sob seu controle.
Joseph Garvin

Respostas:

6

Com base no comentário do @ politza de que (é claro!) Os conselhos funcionam com macros, encontrei algo que parece funcionar.

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

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

Observe que este exemplo está usando as funções de orientação do Emacs 24.4. Ainda não descobri qual seria o equivalente para versões mais antigas do Emacs.

glucas
fonte
Não tenho muita certeza de como esse uso de conselhos afeta o comportamento dos arquivos de compilação de bytes que usam a macro recomendada ... Alguém pode comentar sobre isso?
glucas
11
As macros são avaliadas durante a compilação, portanto, o aconselhamento deve estar disponível no momento da compilação, seja por requireum recurso que o acompanha ou por um eval-when-compile.
5

A versão mais recente do use-packagepossui o seguinte para habilitar esse comportamento para todos os pacotes:

(setq use-package-always-ensure t) 

Apenas no caso de alguém ter a mesma pergunta.

Tianxiang Xiong
fonte