Как я могу фильтровать вывод компиляции только для определенного режима или буфера в Emacs?

У меня есть HTML-страница с включенным html-mode. Я вызываю функцию sgml-validate для проверки ошибок разметки. Он основан на compilation-mode. Я хочу удалить некоторые предупреждения из вывода компиляции, поэтому я написал функцию и подключил ее к compilation-filter-hook (эта переменная не документирована, но compilation-filter вызывает ее). Все работает. Моя проблема в том, как я могу гарантировать, что моя функция фильтра вызывается только тогда, когда я начал процесс компиляции на HTML-странице (через sgml-validate)?

Я вижу два метода, но ни один из них не сработал:

  • Во-первых, я могу проверить значение major-mode. Но он всегда возвращает compilation-mode, так как это разрешено для буфера *compilation*. (Я нашел функцию фильтра в исходном коде grep+, и они проверили значение major-mode. Я не могу понять, как это может работать правильно.)
  • Другая идея заключалась в том, чтобы подключить мою функцию фильтра только к буферу HTML-файла, но по тем же причинам она не могла работать, поскольку вывод процесса компиляции идет в отдельный буфер.

person viam0Zah    schedule 13.05.2009    source источник


Ответы (2)


Похоже, вы можете посоветовать smgl-validate, чтобы он выполнял фильтрацию перед выполнением всех других операций. Например:

(defadvice sgml-validate (around fix-filtering command activate)
    (let ((return-value ad-do-it))
      (filter-function return-value))))
person Nathaniel Flath    schedule 13.05.2009
comment
Спасибо, посмотрю. В моем случае я думаю, что мне следует использовать обходной совет, потому что я хочу отфильтровать сгенерированный вывод, и мне все еще нужно имя буфера компиляции, которое возвращается sgml-validate. - person viam0Zah; 13.05.2009
comment
В этом случае вам может понадобиться after-advisor, а не around-advention, если только вам не нужно выполнять операции как до, так и после вызова sgml-validate. - person Nathaniel Flath; 13.05.2009
comment
Но могу ли я получить возвращаемое значение of sgml-validate` при использовании after-advise? Он сообщает мне имя буфера компиляции, иначе я не смогу запустить функцию фильтра на выходе. - person viam0Zah; 13.05.2009
comment
Ах, это правда. Тогда совет вокруг, вероятно, то, что вы хотите. - person Nathaniel Flath; 13.05.2009
comment
Последнее замечание к этому ответу. В функции фильтра мне пришлось установить inhibit-read-only в t, потому что буфер компиляции становится доступным только для чтения после завершения процесса компиляции. - person viam0Zah; 13.05.2009

Тем временем я обнаружил, что compilation-start принимает необязательный аргумент mode, который будет основным режимом буфера компиляции. Таким образом, я могу создать основной режим, производный от compilation-mode, и определить там мою функцию фильтра, которая теперь подключена к соответствующему буферу.

Единственная проблема сейчас в том, что sgml-validate не позволяет мне установить аргумент mode на compilation-start, но это уже другой вопрос.

(Конечно, я не считаю это окончательным решением.)

person viam0Zah    schedule 13.05.2009