Мне было весело добавить несколько советов к функции:
(advice-add 'executable-find :around
(lambda (f &rest args)
(apply g args)))
;;; ^
Ой, опечатка. Исправил и снова оценил приведенный выше код. Но теперь у меня есть и «исправленный», и «неправильный» совет по поводу этой функции.
Как мне избавиться от них? Учитывая, что advice-remove
нужен либо объект функции, либо совет вокруг (который здесь пуст)?
(Очевидно, я могу просто выйти и перезапустить, но есть другой способ, не так ли?)
eq
предыдущую, (2) advice-remove сравнивает функцию, которую вы передаете, с советами, пока не найдет один, которыйeq
к нему и удалите это, (3) даже если advice-remove использует другой тест, типаequal
, он все равно не будет работать, потому что разные оценки лямбда-формы не будутequal
друг с другом. Оказывается, (1) правильно, но (2) и (3) неверно: извлекаются рекомендации по удалениюequal
, и двойная оценкаlambda
даетequal
результаты!Есть
advice-mapc
, что давайте переберем все советы некоторой функции, применяя данную функцию к каждой. С его помощью легко удалить все советы:Это может быть расширено для удаления только тех советов, у которых нет
name
свойства, путем поиска во второмprops
аргументе () (который является списком) тех, у которых нет ничего связанного с ключомname
.источник
name
делает удаление легче.Вот некоторый код, который поможет сделать это интерактивно.
Это определяет две функции. Первая функция получает список всех советов по данному символу, вторая функция в интерактивном режиме запрашивает символ и совет по этому символу, а затем удаляет последний из первого. Поскольку все это происходит с завершением, это проще (для меня), чем копировать, вставляя лямбда-выражение.
источник