Почему Vims errorformat не принимает регулярные выражения? - PullRequest
4 голосов
/ 28 мая 2009

Vims errorformat (для анализа ошибок компиляции / сборки) использует тайный формат c для анализа ошибок.

Попытка настроить формат ошибки для nant кажется почти невозможной, я пробовал много часов и не могу его получить. Я также вижу из своих поисков, что многие люди, похоже, имеют ту же проблему. Регулярное выражение, чтобы решить это, заняло бы минуты, чтобы написать.

Так почему же Vim все еще использует этот формат? Вполне возможно, что синтаксический анализатор C работает быстрее, но вряд ли это актуально для того, что происходит максимум раз в несколько минут. Есть веская причина или это просто исторический артефакт?

Ответы [ 5 ]

7 голосов
/ 02 июня 2009

Дело не в том, что 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, такие как .* - на этом языке написано %.%#.

ОК, так что это не идеально. Но это не невозможно и имеет смысл по-своему. Застрявите, прочитайте помощь и перестаньте жаловаться! : -)

0 голосов
/ 08 мая 2017

С ними трудно работать, но, надо понимать: вы можете использовать регулярные выражения (в основном).

Из документов:

Pattern matching

The scanf()-like "%*[]" notation is supported for backward-compatibility
with previous versions of Vim.  However, it is also possible to specify
(nearly) any Vim supported regular expression in format strings.
Since meta characters of the regular expression language can be part of
ordinary matching strings or file names (and therefore internally have to
be escaped), meta symbols have to be written with leading '%':
    %\      The single '\' character.  Note that this has to be
            escaped ("%\\") in ":set errorformat=" definitions.
    %.      The single '.' character.
    %#      The single '*'(!) character.
    %^      The single '^' character.  Note that this is not
            useful, the pattern already matches start of line.
    %$      The single '$' character.  Note that this is not
            useful, the pattern already matches end of line.
    %[      The single '[' character for a [] character range.
    %~      The single '~' character.
When using character classes in expressions (see |/\i| for an overview),
terms containing the "\+" quantifier can be written in the scanf() "%*"
notation.  Example: "%\\d%\\+" ("\d\+", "any number") is equivalent to "%*\\d".
Important note: The \(...\) grouping of sub-matches can not be used in format
specifications because it is reserved for internal conversions.
0 голосов
/ 27 августа 2013

По :help quickfix,

также можно указать (почти) любой Vim, поддерживаемый обычным выражение в формате строки.

Однако документация сбивает с толку, и я не потратил много времени на проверку того, насколько хорошо это работает и насколько это полезно. Вам все равно придется использовать скан-подобные коды для извлечения имен файлов и т. Д.

0 голосов
/ 27 августа 2013

Я бы порекомендовал написать фильтр пост-обработки для вашего компилятора, который использует регулярные выражения или что-то еще и выводит сообщения в простом формате, который легко написать для него errorformat. Зачем изучать новый, барочный, специализированный язык, если вам не нужно?

0 голосов
/ 28 мая 2009

lol, попробуйте посмотреть на исходный код vim. Это гнездо кода на C, настолько старое и неясное, что вы подумали, что находитесь на археологических раскопках.

Что касается того, почему vim использует синтаксический анализатор C, есть много веских причин, начиная с того, что он довольно универсален. Но настоящая причина в том, что когда-то за последние 20 лет кто-то написал его для использования C-парсера, и он работает. Никто не меняет то, что работает.

Если это не сработает для вас сообщество vim предложит вам написать свое. Глупые ублюдки с открытым исходным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...