GNU emacs lisp: что делает макрос with-wrapper-hook? Не могли бы вы предоставить описание и примеры? - PullRequest
1 голос
/ 17 сентября 2011

Я нахожу онлайн-справку неинформативной для этого макроса. Возможно, Stackoverflow может работать лучше?

Я использую транк emacs (24.0.50.1) на случай, если что-то изменится.

Спасибо!

1 Ответ

1 голос
/ 17 сентября 2011

Сначала вы захотите прочитать в руководстве по hooks и, возможно, по совету , с которым документация сравнивает этот макрос. Макрос позволяет вам писать код, который можно обернуть каким-нибудь будущим кодом, чтобы изменить его работу.

(with-wrapper-hook hook-name ()
   your code here)

Тогда кто-нибудь еще может добавить функцию к hook-name, которая выглядит примерно так:

(defun my-hook (your-code)
   (let ((original-result (funcall your-code)))
      (modify original-result)))

Аргумент your-code обозначает your code here выше, инкапсулированный в функциональный объект. Оболочка может вызывать ваш исходный код с помощью (funcall your-code), но это не обязательно, в этом случае она полностью переопределяет ваш код. Хук может даже включать несколько функций, каждая из которых получает следующую функцию в качестве первого аргумента, поэтому может быть цепочка упаковщиков, каждая из которых изменяет результаты следующей. Также возможно определить некоторые дополнительные аргументы для каждой из этих функций (для этого предназначены пустые числа, указанные выше).

Чтобы найти примеры, вы можете поискать источник. Одно использование expand-abbrev:

(with-wrapper-hook abbrev-expand-functions () 
     ...)

Функция expand-abbrev используется для расширения сокращений , и имеет смысл, что у вас есть хук (abbrev-expand-functions) для настройки того, как это выполняется в разные режимы. Этот хук не может быть «нормальным», потому что он должен иметь возможность изменять результаты и должен иметь возможность возвращать некоторые результаты в вызывающий код. (Как объяснено в документации по перехватам, нормальный перехват вызывается без аргументов, а его возвращаемое значение игнорируется, поэтому он вызывается только из-за побочных эффектов для буфера.)

Функция на этом хуке может выполнить свое собственное расширение аббревиатуры и игнорировать упакованный код, либо вызывать упакованный код и изменять результаты, либо многократно вызывать упакованный код с разными входами. Примером использования этого хука является mail-abbrev-expand-wrapper, который проверяет, печатаете ли вы заголовок To: в электронном письме, и в этом случае расширяет ваши почтовые псевдонимы вместо стандартных сокращений. Функция изменяет различные части среды, которые влияют на раскрытие сокращений (таблица синтаксиса, таблица сокращений), а затем вызывает завернутую функцию с помощью (funcall expand), чтобы выполнить фактическую работу, и возвращает результаты напрямую.

...