Gibt es eine gute Möglichkeit, alle Kompilierungsfehler in Emacs hervorzuheben, insbesondere im Haskell-Modus?
Die Funktion next-error
( C-x `) hebt nur einen einzigen Fehler hervor, setzt match-data
den Fehler aber nicht auf , zumindest nicht in haskell-mode
, mit ihrem haskell-interactive-mode-next-error
. Noch weniger hilfreich ist, dass sie (error "No more errors")
beim letzten Fehler aufruft, daher denke ich, dass sie vielleicht nur für den interaktiven Aufruf gedacht ist.
Ich habe Folgendes getan, um bei jedem Kompilierungsfehler Hervorhebungs-Overlays zu erstellen, aber es ist wirklich umständlich und unzuverlässig. next-error-function
sollte durch den Kompilierungsmodus definiert werden ( haskell-interaction-mode
in meinem Fall); bei der Rückgabe scheinen die Match-Daten auf eine Zeichenfolge zu verweisen. Ich verwende die Variable, compilation-highlight-overlay
um das Overlay abzurufen, das der nächste Fehler erstellt.
(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))))
Gibt es eine kanonische Möglichkeit, dies zu tun?
Antwort1
Es ist sehr schwierig, es auszunutzen, next-error-function
um alle Fehler zu finden, da es sehr imperativer Weise implementiert ist.
Ich habe ein kleines Projekt gestartet, complation-highlight-el
das es uns ermöglicht, mehr als einen Fehler gleichzeitig zu sehen.
https://github.com/m2ym/compilation-highlight-el
Es befindet sich noch in der experimentellen Phase. Sie können gerne Probleme melden.