Примитивы для манипулирования советами
- Макрос: add-function где место функции &опциональные свойства
-
Этот макрос является удобным способом добавить совет функция к функции, хранящейся в месте (см. Обобщенные переменные).
где определяет, как функция комбинируется с существующей функцией, например, вызывается ли функция до или после исходной функции. См. Комбинаторы советов для списка доступных способов комбинирования двух функций.
При модификации переменной (название которой обычно заканчивается на
-function), вы можете выбрать, используется ли функция глобально или только в текущем буфере: если место — просто символ, то функция добавляется к глобальному значению место. В то время как если место имеет вид(local symbol), где символ — выражение, возвращающее имя переменной, то функция будет добавлена только в текущем буфере. Наконец, если вы хотите изменить лексическую переменную, вам необходимо использовать(var variable).Каждая функция, добавленная с помощью
add-function, может сопровождаться списком свойств свойства. В настоящее время только два из этих свойств имеют специальное значение:name-
Это присваивает имя совету, которое
remove-functionможет использовать для идентификации функции, которую нужно удалить. Обычно используется, когда функция — анонимная функция. depth-
Это определяет порядок совета, если присутствует несколько советов. По умолчанию глубина равна 0. Глубина 100 указывает, что этот совет должен быть как можно глубже, а глубина -100 указывает, что он должен оставаться внешним элементом. Когда два совета указывают одну и ту же глубину, последним добавленный будет внешним.
Для
:beforeсовета, быть внешним означает, что этот совет будет выполнен первым, прежде чем любой другой совет, а быть внутренним означает, что он будет выполнен непосредственно перед исходной функцией, без выполнения других советов между ним и исходной функцией. Аналогично, для:afterсовета, быть внутренним означает, что он будет выполнен непосредственно после исходной функции, без выполнения других советов между ними, а быть внешним означает, что он будет выполнен в самом конце после всех других советов. Внутренний:overrideсовет будет переопределять только исходную функцию, а другие советы будут к ней применяться, тогда как внешний:overrideсовет будет переопределять не только исходную функцию, но и все другие примененные к ней советы.
Если функция не интерактивна, то комбинированная функция унаследует интерактивные характеристики исходной функции, если таковые имеются. В противном случае комбинированная функция будет интерактивной и будет использовать интерактивные характеристики функция. Одно исключение: если интерактивные характеристики функция — функция (т.е., выражение
lambdaили символfbound, а не выражение или строка), то интерактивные характеристики комбинированной функции будут вызовом этой функции с интерактивными характеристиками исходной функции в качестве единственного аргумента. Для интерпретации полученного спецификации в качестве аргумента используйтеadvice-eval-interactive-spec.Примечание: интерактивные характеристики функция будут применяться к комбинированной функции и должны поэтому подчиняться соглашениям о вызове комбинированной функции, а не функция. Во многих случаях это не имеет значения, поскольку они идентичны, но это имеет значение для
:around,:filter-args, и:filter-return, где функция получает разные аргументы, чем исходная функция, хранящаяся в месте.
- Макрос: remove-function место функция
-
Этот макрос удаляет функцию из функции, хранящейся в месте. Это работает только если функция была добавлена к место с помощью
add-function.функция сравнивается с функциями, добавленными к место с использованием
equal, чтобы попытаться сделать это работающим и с лямбда-выражениями. Она дополнительно сравнивается также со свойствомnameдобавленных к место функций, что может быть более надежным, чем сравнение лямбда-выражений с использованиемequal.
- Функция: advice-function-member-p совет функция-определение
Возвращает не-
nilесли совет уже присутствует в функция-определение. Как и дляremove-functionвыше, вместо того, чтобы совет был фактической функцией, он также может бытьnameчасти совета.
- Функция: advice-function-mapc f функция-определение
Вызывает функцию f для каждого совета, который был добавлен к функция-определение. f вызывается с двумя аргументами: функцией совета и ее свойствами.
- Функция: advice-eval-interactive-spec спецификация
-
Оценивает интерактивную спецификацию так же, как интерактивный вызов функции с такой спецификацией, и затем возвращает соответствующий список аргументов, который был создан. Например,
(advice-eval-interactive-spec "r\nP")вернёт список из трёх элементов, содержащих границы области и текущий префиксный аргумент.Например, если вы хотите сделать команду C-x m (
compose-mail) приглашением для заголовка 'От:', вы можете сказать что-то вроде этого:(defun my-compose-mail-advice (orig &rest args) "Read From: address interactively." (interactive (lambda (spec) (let* ((user-mail-address (completing-read "From: " '("one.address@example.net" "alternative.address@example.net"))) (from (message-make-from user-full-name user-mail-address)) (spec (advice-eval-interactive-spec spec))) ;; Put the From header into the OTHER-HEADERS argument. (push (cons 'From from) (nth 2 spec)) spec))) (apply orig args)) (advice-add 'compose-mail :around #'my-compose-mail-advice)
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Core-Advising-Primitives.html