Есть ли Emacs-хук, который запускается после создания каждого буфера? - PullRequest
19 голосов
/ 26 октября 2011

Я хочу запускать некоторый код каждый раз, когда Emacs создает буфер. Есть ли крюк для этого? Что-то с именем вроде after-make-buffer-functions?

Редактировать: Если кто-то хочет знать, для чего я это хотел, вы можете прочитать соответствующую часть моей конфигурации Emacs здесь: https://github.com/DarwinAwardWinner/dotemacs/blob/master/site-lisp/settings/tempbuf-settings.el

По сути, я хочу, чтобы режим tempbuf был включен во всех буферах с некоторыми основными режимами. Так что ответ Линдидансера на самом деле более уместен, чем то, что я искал изначально.

Я знаю, что уже мог включить режим tempbuf в определенных режимах, добавив хук режима tempbuf ко всем этим хукам основного режима, но я хотел сделать его редактируемым через M-x customize, и это был самый простой способ.

Ответы [ 2 ]

15 голосов
/ 26 октября 2011

К сожалению, нет. Emacs использует низкоуровневую функцию «get-buffer-create» для создания буферов, и она не предоставляет никакого механизма подключения.

Вы можете использовать advice , чтобы принять все вызовы этой функции, хотя я бы не рекомендовал этот метод, поскольку он довольно навязчив. ( Обновление : ловушка подсказок будет видеть звонки только от elisp, а не звонки от основных частей Emacs C.)

Есть несколько альтернатив, которые вы можете использовать, в зависимости от того, что вы реализуете:

  • change-major-mode-hook - вызывается до смены основного режима.
  • after-change-major-mode-hook - вызывается, когда основной режим начинает меняться.
4 голосов
/ 06 июля 2015

Вы можете использовать buffer-list-update-hook

buffer-list-update-hook

Это обычный запуск перехвата при изменении списка буферов

Вы можете определитьфункция, которая делает все, что вы хотите.

 (defun awesome-foo ()
     ;;  do awesome things
   )

Подключите эту функцию к списку буфера

 (add-hook 'buffer-list-update-hook 'awesome-foo)
...