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

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

Я использую транк Emacs (24.0.50.1) в случае, если это имеет значение.

Спасибо!

1 ответ

Решение

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

(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) выполнять реальную работу и возвращать ее результаты напрямую.

Другие вопросы по тегам