Комментарий «немного быстрее» точен в том, что есть немного меньше бухгалтерии, но упор делается на «немного», а не на «быстрее». В принципе, как правило, материал, соответствующий \(pattern\)
, должен храниться так, чтобы вы могли использовать \3
(для соответствующего номера), чтобы ссылаться на него в замене. Обозначение %
означает, что vim
не должен следить за матчем - так что он делает немного меньше работы.
@SimpleQuestions спрашивает:
Что вы имеете в виду под "следить за матчем"? Как это влияет на скорость?
Вы можете использовать скошенные скобки для «захвата» частей совпадающего шаблона. Например, предположим, что мы не будем играть с простыми декларациями функций C - нет указателей на функции или других источников скобок - то мы могли бы иметь замену команды, такие как следующие:
[email protected]\<\([a-zA-Z_][a-zA-Z_0-9]*\)(\([^)]*\))@xyz_\1(int nargs) /* \2 */@
Учитывая входной линии, такие как:
int simple_function(int a, char *b, double c)
выход будет:
int xyz_simple_function(int nargs) /* int a, char *b, double c */
(Почему вы можете сделать, что я воображал, что мне нужно, чтобы обернуть функцию C simple_function
так что он может быть вызван с языка, скомпилированного в C, который использует другое соглашение об интерфейсе - он основан на Informix 4GL, если быть точным. Я использую его, чтобы получить пример - не потому, что вам действительно нужно знать, почему это было хорошее изменение.)
Теперь в примере \1
и \2
в тексте замены относятся к снятым частям регулярного выражения - имя функции (последовательность буквенно-цифровых символов, начинающихся с буквенного символа, - подсчет подчеркивания как «алфавитный») и список аргументов функции (все между круглыми скобками, но не включая круглые скобки).
Если бы я использовал обозначение \%(....\)
вокруг идентификатора функции, то \1
ссылался бы на список аргументов и не было бы \2
. Поскольку vim
не нужно было отслеживать одну из двух захваченных частей регулярного выражения, она имеет незначительно меньшую бухгалтерскую отчетность, чем если бы ей приходилось отслеживать две захваченные части. Но, как я уже сказал, разница крошечная; вы, вероятно, никогда не сможете измерить его на практике.Вот почему в руководстве говорится, что «он позволяет больше групп»; если вам нужно было группировать части вашего регулярного выражения, но не нужно было ссылаться на них снова, тогда вы могли бы работать с более длинными регулярными выражениями. Тем не менее, к тому времени, когда у вас будет более 9 запоминаемых (захваченных) частей регулярного выражения, ваш мозг обычно делает круговые движения, и ваши пальцы будут делать ошибки в любом случае - так что усилия обычно не стоят того. Но это, я думаю, аргумент для использования нотации \%(...\)
. Он соответствует нотации Perl (PCRE) '(?:...)
' для неконвертирующего регулярного выражения.
Что вы подразумеваете под "отслеживать матч"? Как это влияет на скорость? –
Я действительно проверил - и это работает, как указано. И я проверил версию \% (\\) - не показано выше - и это тоже сработало. Уф! Это происходит не каждый раз, когда все работает правильно. Я был уверен в концепции ... но по-прежнему хорошая идея проверить реальность. –