Режим компиляции emacs, помечающий неправильные строки как ошибки

У меня проблема с дефолтом compilation-error-regexp-* сопоставление любой строки с двумя отдельными столбцами в качестве кода ошибки

пример: file:15: будет ссылаться на линию 15 в пути file

Но к сожалению # file:15: теперь ссылка на путь # file который не существует

Пожалуйста, попробуйте скомпилировать следующее в режиме Perl или Python (это действует на обоих языках), и вы поймете мою проблему:

print "# file:15:";

Я не могу игнорировать это, потому что я активировал compilation-auto-jump-to-first-error что очень удобно, но теперь появляется файл-браузер, пытающийся открыть этот несуществующий файл # file:15:,

Я уже проверил compilation-error-regexp-alist а также compilation-error-regexp-alist-alist но мои настройки perl не содержат такого регулярного выражения, и у меня даже нет никаких настроек для python.

Я проверил с помощью "emacs -Q", чтобы убедиться, что это не какая-либо из моих настроек.

M-x compile RET python /tmp/py.py RET

с приведенным выше кодом выделит # file:15: как строку ошибки

Вопрос: как я могу переопределить это регулярное выражение или избавиться от него?

ура LanX

2 ответа

ОБНОВЛЕНИЕ: нет настройки grep-regexp-alist в пустой список не решил.

ОК, я думаю, что нашел проблему.

Глядя на compile.el показал, что grep-regexp-alist также оценивается " (почему???).

И кто-то изменил первую запись на

 (("^\\(.+?\\)\\(:[       ]*\\)\\([0-9]+\\)\\2" 1 3)
   ...

.+ Означает, что все, что находится между началом и первым двоеточием, принимается за имя файла, включая пробелы и хэши.

Пока не знаю, как отключить регулярное выражение для вывода grep при компиляции скрипта, обновлю, как только я знаю.

Хорошо

Я копался в источниках режима компиляции, но не смог определить происхождение этого жадного регулярного выражения по умолчанию.

Но я нашел обходной путь!

Нужно определить собственное регулярное выражение, которое совпадает с теми же строками, прежде чем стандартное регулярное выражение может сделать это, и должно исправить соответствующие группы, чтобы избежать странных символов.

Это доказательство концепции

(add-to-list 'compilation-error-regexp-alist-alist '(perl "^.*?\\([a-zA-Z/][^ \n#]+\\):\\([0-9]+\\):" 1 2))

Теперь сопоставляются только пути, начинающиеся с символа или косой черты и без пробелов или # между ними. Любые другие ведущие символы игнорируются.

Конечно, вам все еще нужно будет добавить старое регулярное выражение для типичных сообщений об ошибках Perl, я оставил это для удобства чтения.

И вам придется делать это для каждого режима программирования...

HTH LanX

Другие вопросы по тегам