Режим компиляции 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