Дело не в том, что Vim использует тайный формат из C. Скорее он использует ideas из scanf
, который является функцией C. Это означает, что строка, соответствующая сообщению об ошибке, состоит из 3 частей:
- пробельные
- символы
- спецификации преобразования
Пробелы - это ваши табуляции и пробелы. Символы - это буквы, цифры и другие нормальные вещи. Спецификации преобразования - это последовательности, начинающиеся с символа «%» (процентов). В scanf вы обычно сопоставляете входную строку с% d или% f для преобразования в целые числа или числа с плавающей точкой. В формате ошибок Vim вы ищете во входной строке (сообщении об ошибке) файлы, строки и другую информацию, относящуюся к компилятору.
Если бы вы использовали scanf для извлечения целого числа из строки «99 бутылок пива», то вы бы использовали:
int i;
scanf("%d bottles of beer", &i); // i would be 99, string read from stdin
Теперь с форматом ошибок Vim становится немного сложнее, но он пытается легко сопоставить более сложные шаблоны. Такие вещи, как многострочные сообщения об ошибках, имена файлов, изменение каталога и т. Д. И т. Д. Один из примеров в справке для errorformat полезен:
1 Error 275
2 line 42
3 column 3
4 ' ' expected after '--'
The appropriate error format string has to look like this:
:set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
Здесь% E сообщает Vim, что это начало многострочного сообщения об ошибке. % n - это номер ошибки. % C является продолжением многострочного сообщения,% l - номер строки, а% c - номер столбца. % Z отмечает конец многострочного сообщения, а% m соответствует сообщению об ошибке, которое будет отображаться в строке состояния. Вам нужно выходить из пробелов с обратной косой чертой, что добавляет немного странности.
Хотя с регулярным выражением на первый взгляд может показаться проще, этот мини-язык специально разработан, чтобы помочь с соответствующими ошибками компилятора. Там много ярлыков. Я имею в виду, что вам не нужно думать о таких вещах, как сопоставление нескольких строк, нескольких цифр, сопоставление имен путей (просто используйте% f).
Еще одна мысль: как бы вы отобразили числа для обозначения номеров строк или строки для обозначения файлов или сообщений об ошибках, если бы вы использовали обычное регулярное выражение? По групповой позиции? Это может сработать, но это не будет очень гибко. Другим способом было бы назвать группы захвата, но тогда этот синтаксис все равно выглядит как короткая рука для этого. На самом деле вы можете использовать подстановочные знаки regexp, такие как .*
- на этом языке написано %.%#
.
ОК, так что это не идеально. Но это не невозможно и имеет смысл по-своему. Застрявите, прочитайте помощь и перестаньте жаловаться! : -)