Как я могу фильтровать выходные данные компиляции только для определенного режима или буфера в Emacs?
-
21-08-2019 - |
Вопрос
У меня есть HTML-страница, с html-mode
включен.Я вызываю функцию sgml-validate
чтобы проверить, нет ли каких-либо ошибок разметки.Это основано на compilation-mode
.Я хочу удалить некоторые предупреждения из выходных данных компиляции, поэтому я написал функцию и подключил ее к compilation-filter-hook
(эта переменная не задокументирована, но compilation-filter
вызывает его).Все работает.Моя проблема в том, как я могу гарантировать, что моя функция фильтра вызывается только тогда, когда я запустил процесс компиляции на HTML-странице (через sgml-validate
)?
Я вижу два метода, но ни один из них не сработал:
- Во-первых, я могу проверить значение
major-mode
.Но это всегда возвращаетсяcompilation-mode
, поскольку это включено на*compilation*
буфер.(Я нашел функцию фильтрации в исходный кодgrep+
, и они действительно проверили значениеmajor-mode
.Я не могу понять, как это может работать правильно.) - Другая идея заключалась в том, чтобы подключить мою функцию filter только к буферу HTML-файла, но по аналогичным причинам она не могла работать, поскольку выходные данные процесса компиляции отправляются в отдельный буфер.
Решение
Похоже, вы можете посоветовать smgl-validate, чтобы он выполнял фильтрацию, прежде чем выполнять все другие операции.Например:
(defadvice sgml-validate (around fix-filtering command activate) (let ((return-value ad-do-it)) (filter-function return-value))))
Другие советы
Между тем, я обнаружил, что compilation-start
принимает необязательный аргумент mode
, который будет основным режимом для буфера компиляции.Таким образом, я могу создать основной режим, производный от compilation-mode
, и определите там мою функцию фильтра, которая теперь подключена к соответствующему буферу.
Единственная проблема сейчас заключается в том, что sgml-validate
не позволяет мне устанавливать mode
аргумент о compilation-start
, но это уже другой вопрос.
(Конечно, я не считаю это окончательным решением.)