Мой конфиг полон советов, и я продолжаю слышать о новом блестящем минималистском nadvice.el
пакете.
Я искал руководства, и я прочитал источник , но я открыто признаю: я все еще не знаю, как на самом деле его использовать.
Может ли кто-нибудь здесь указать мне на руководство или подсказать, как начать переносить мой совет в старом стиле?
advice
emacs-internals
elisp
PythonNut
источник
источник
M-x report-emacs-bug
. Некоторые разработчики иногда предпочитают разрабатывать, а не документировать. ;-) Важно, чтобы Emacs документировал сам.nadvice
из моей конфигурации: : после того, как , : фильтр обратного , : вокруг , : до того , покаОтветы:
Вся необходимая информация включена в
C-h f add-function
которые описывает основной механизмadvice-add
.Новая система рекомендаций в основном действует как замена текущего определения функции на функцию, описанную в таблице, в
C-h f add-function
зависимости от вашего выбораWHERE
аргумента, только для того, чтобы отслеживать, какое поведение было определено в каком исходном файле.Пример с
:around
опциейНаиболее общий случай - это
:around
вариант, поэтому я приведу пример для этого. (Возможно, лучше использовать выделенныеWHERE
параметры, когда это возможно, но вы можете заменить все остальные эквивалентными:around
функциями).В качестве примера, скажем, вы хотите отладить некоторое использование
find-file
и хотитеprint
каждый раз вызывать его список аргументов. Вы могли бы написатьВ этой новой реализации все, что нужно совету, передается в качестве аргумента.
ad-get-args
становится ненужным, потому что аргументы передаются в функцию совета как обычные аргументы функции (дляWHERE
аргументов, для которых это имеет смысл).ad-do-it
становится ненужным, так как:around
совет получает в качестве аргументов функцию и аргументы, поэтому(ad-do-it)
заменяется формойили когда вы назвали аргументы
который чище, так как в нем нет волшебных форм. Изменение аргументов просто происходит путем передачи измененных значений в
OLD-FUNCTION
.Другие
WHERE
ценностиСтрока документации
add-function
содержит таблицу всех советов (или «комбинаторов») и их эквивалентов, а также объясняет функциональность с точки зренияlambda
поведения, эквивалентного рекомендуемой функции:где FUNCTION - это функция рекомендации, а OLDFUN - функция, в которую добавляется рекомендация. Не пытайтесь понять их все сразу, просто выберите
WHERE
подходящий символ и попытайтесь понять его.Или просто использовать
:around
. Насколько я могу судить, единственным преимуществом использования специализированныхWHERE
s над:around
всем является то, что вы получаете немного больше информации от поиска доC-h f ADVISED-FUNCTION
прочтения строки документа. Если вы не планируете публиковать код, содержащий рекомендации, это, вероятно, не имеет значения.Названные функции совета
Я рекомендую использовать именованные функции в качестве совета, поскольку это дает много преимуществ (некоторые из них также применимы к использованию именованных функций для ловушек):
Это проявляется
C-h f find-file
какссылка на определение функции совета, которая, как обычно, содержит ссылку на файл, в котором она была определена. Если бы совет был определен как
lambda
форма непосредственно вadvice-add
форме, строка документа была бы показана встроенной (беспорядок для длинных строк документации?), И ничто не указывало бы, где это было определено.Вы можете удалить совет с
Вы можете обновить определение рекомендации, не повторяя
advice-add
и не рискуя сохранять старую версию активной (поскольку работаadvice-add
с измененной версиейlambda
будет распознаваться как новая рекомендация, а не как обновление старой).Боковое замечание
#'function
обозначение в основном эквивалентно'function
, за исключением того, что он помогает байтам компилятору определить символы, имена функций и , таким образом , чтобы выявить недостающие функции (например , из - за опечатки).источник
(advice-add 'find-file :around #'my-find-file-advice-print-arguments)
и аналогично(advice-remove 'find-file #'my-find-file-advice-print-arguments)
.advice-add
, это пограничный случай. Лично я считаю, что это' ↔ #'
различие в основном помогает идентифицировать опечатки в именах функций, поэтому здесь, вероятно, это будет зависеть от того, ожидается ли определение функции к моменту добавления рекомендации.add-function
). Я хотел бы, чтобы документы прояснили это. Я мог бы сделать патч для этого.C-h f find-file
, не такC-x
ли?