Есть ли хороший способ выделить все ошибки компиляции в emacs, особенно в режиме haskell?
Функция next-error
(Cx `) выделяет только одну ошибку, но она не устанавливает для match-data
соответствия значение ошибки, по крайней мере, в haskell-mode
, с ее haskell-interactive-mode-next-error
. Еще менее полезно то, что он вызывает (error "No more errors")
при последней ошибке, поэтому я думаю, что, возможно, он вызывается только в интерактивном режиме.
Я сделал следующее, чтобы создать оверлеи при каждой ошибке компиляции, но это действительно неуклюже и ненадежно. next-error-function
должна определяться режимом компиляции (в моем случае это haskell-interaction-mode
); по возвращении данные о совпадении указывают на некоторую строку. Я использую переменную compilation-highlight-overlay
чтобы получить оверлей, который создает next-error.
(let (buf (just-started t) errors overlays)
;; Ask next-error to create all the highlighting overlays, save
;; their locations, then delete them, use the locations to
;; create our own overlays.
(ignore-errors
(when (setq buf (next-error-find-buffer))
(save-match-data
(save-excursion
(dotimes (max-iter 10)
(with-current-buffer buf
(funcall next-error-function 1 just-started)
(setq just-started nil)
(let* ((o compilation-highlight-overlay)
(start (overlay-start o)) (end (overlay-end o)))
;; (message "Found (%s,%s)" start end)
(push (cons start end) errors)
(push o overlays))))))))
(mapc 'delete-overlay overlays)
(dolist (err errors)
(let ((o (make-overlay (car err) (cdr err))))
(overlay-put o 'category 'error-highlight))))
Есть ли какой-то канонический способ сделать это?