Как реализовать трассировку ошибок в Emacs? - PullRequest
4 голосов
/ 18 июня 2011

Я пишу компилятор в Ocaml. Трассировка работает хорошо, когда я компилирую и тестирую ее с make в терминале, например:

export OCAMLRUNPARAM=b
./Simpler-Basic test.sib
Fatal error: exception Match_failure("interp.ml", 45, 21)
Called from file "interp.ml", line 97, characters 72-86
Called from file "list.ml", line 74, characters 24-34
Called from file "interp.ml", line 108, characters 9-35
Called from file "main.ml", line 54, characters 4-17
make: *** [all] Error 2

Но когда я компилирую и тестирую его в моем Emacs с помощью Meta-x compile, за которым следует make, он не показывает часть трассировки в буфере:

make
export OCAMLRUNPARAM=b
./Simpler-Basic test.sib
Fatal error: exception Match_failure("interp.ml", 45, 21)
make: *** [all] Error 2

Compilation exited abnormally with code 2 at Sat Jun 18 19:03:04

В моем .emacs есть часть для отслеживания, которую я скопировал у друга: http://paste.ubuntu.com/628838/

Может кто-нибудь сказать мне, как изменить мой .emacs, чтобы он отображал трассировку, как в терминале? Большое спасибо

1 Ответ

6 голосов
/ 18 июня 2011

Где вы написали export OCAMLRUNPARAM=b?

Если вы написали это в make-файле (↹ означает вкладку):

↹export OCAMLRUNPARAM=b
↹./Simpler-Basic test.sib

тогда это не сработает, потому что каждая команда makefile выполняется в отдельной оболочке, поэтому назначение переменной среды исчезает после завершения первой строки. Вместо этого вы можете объединить две строки в одну логическую строку:

↹export OCAMLRUNPARAM=b; \
↹./Simpler-Basic test.sib

Если вам всегда нужны обратные пути при запуске программы Ocaml из Emacs, установите переменную окружения в вашем .emacs:

(setenv "OCAMLRUNPARAM" "b")

Чтобы Emacs распознал сообщения обратной трассировки как сообщения об ошибках с указанием местоположения, вам необходимо зарегистрировать их в compilation-regexp-alist. Поместите что-то вроде этого в свой .emacs (не проверено):

(eval-after-load "caml"
  (add-to-list 'compilation-regexp-alist
               '("\\(^Raised at\\|Called from\\) file \"\\([^"\n]+\\)\", line \\([0-9]+\\)"
                 2 3)))
...