Minha configuração está cheia de conselhos e continuo ouvindo sobre o novo nadvice.el
pacote minimalista brilhante .
Pesquisei os manuais e li a fonte , mas admito abertamente: ainda não faço ideia de como usá-lo.
Alguém aqui pode me indicar um guia ou me dizer como começar a incluir meus conselhos de estilo antigo?
advice
emacs-internals
elisp
PythonNut
fonte
fonte
M-x report-emacs-bug
. Alguns desenvolvedores às vezes preferem desenvolver do que documentar. ;-) É importante que o Emacs se documente.nadvice
do meu config: : depois , : filtro de retorno , : em torno de , : antes, atéRespostas:
Todas as informações necessárias estão incluídas,
C-h f add-function
descrevendo o mecanismo subjacente deadvice-add
.O novo sistema de aconselhamento basicamente age como substituir a definição atual de uma função pela função descrita na tabela em
C-h f add-function
, dependendo da sua escolha doWHERE
argumento, apenas mais limpa para rastrear qual comportamento foi definido em qual arquivo de origem.Um exemplo com a
:around
opçãoO caso mais geral é a
:around
opção, então eu dou um exemplo para isso. (Provavelmente é melhor usarWHERE
parâmetros dedicados quando possível, mas você pode substituir todos os outros por uma:around
função equivalente ).Apenas como exemplo, digamos que você queira depurar um pouco de uso
find-file
e queira aprint
sua lista de argumentos sempre que for chamada. Você poderia escreverCom esta nova implementação, tudo o que o conselho precisa é passado como argumento.
ad-get-args
torna-se desnecessário, porque os argumentos são passados para o conselho funcionam como argumentos de função normal (paraWHERE
argumentos para os quais faz sentido).ad-do-it
torna-se desnecessário à medida que o:around
conselho obtém como argumentos a função e os argumentos,(ad-do-it)
sendo substituído pelo formulárioou quando você nomeou os argumentos
o que é mais limpo, pois não há formas mágicas envolvidas. A modificação dos argumentos simplesmente acontece passando valores modificados para
OLD-FUNCTION
.Outros
WHERE
valoresA documentação de
add-function
contém uma tabela de todos os locais de aconselhamento (ou "combinadores") e o que eles equivalem e explica a funcionalidade em termos de umlambda
comportamento equivalente à função recomendada:onde FUNCTION é a função de aconselhamento e OLDFUN a função em que o conselho é adicionado. Não tente entender todos eles de uma só vez, basta selecionar um
WHERE
símbolo que pareça adequado e tentar entendê-lo.Ou apenas use
:around
. Tanto quanto posso dizer, a única vantagem de usarWHERE
s especializados:around
para tudo é que você obtém um pouco mais de informaçõesC-h f ADVISED-FUNCTION
antes de ler a documentação do conselho. A menos que você planeje publicar o código que contém os conselhos, provavelmente não importa.Funções de aconselhamento nomeadas
Recomendo o uso de funções nomeadas como orientação, pois oferece muitas vantagens (algumas também se aplicam ao uso de funções nomeadas para ganchos):
Ele aparece
C-h f find-file
comolink para a definição da função de aconselhamento, que normalmente contém um link para o arquivo em que foi definido. Se o conselho tivesse sido definido como um
lambda
formulário diretamente noadvice-add
formulário, a doutrina seria mostrada em linha (uma bagunça para longas doutrinas?) E nada indicaria onde foi definida.Você pode remover o aviso com
Você pode atualizar a definição do aviso sem executar novamente
advice-add
ou arriscar para manter a versão antiga ativa (a execução deadvice-add
uma alteraçãolambda
será reconhecida como novo aviso, não como uma atualização do antigo).Observação lateral A
#'function
notação é basicamente equivalente a'function
, exceto que ajuda o compilador de bytes a identificar símbolos como nomes de funções e, assim, a identificar funções ausentes (por exemplo, devido a erros de digitação).fonte
(advice-add 'find-file :around #'my-find-file-advice-print-arguments)
e da mesma forma(advice-remove 'find-file #'my-find-file-advice-print-arguments)
.advice-add
é um caso de fronteira. Pessoalmente, considero a' ↔ #'
distinção principalmente uma ajuda para identificar erros de digitação nos nomes das funções; portanto, aqui provavelmente dependeria de se esperar que a função seja definida no momento em que o conselho é adicionado.add-function
). Eu gostaria que os documentos deixassem isso mais claro. Eu posso tentar fazer um patch para isso.C-h f find-file
, não éC-x
?