Spec-Zone.ru › Elisp

Примитивы для манипулирования советами

Макрос: 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API