Функция флагов Vim substitute () изменяет свое поведение? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть следующая строка из строк, разделенных табуляцией; У меня иногда несколько последовательных <Tab>:

zer<Tab><Tab>abc<Tab>def<Tab><Tab>iop<Tab><Tab>

Я хочу вставить пустую строку между двумя последовательными <Tab>; Я запускаю следующую команду:

:s/\t\(\t\)\@=/\tnull/eg

, что дает мне, как я ожидал:

zer<Tab>null<Tab>abc<Tab>def<Tab>null<Tab>iop<Tab>null<Tab>

Эквивалентная функция замены для приведенной выше команды (я повторил ее результат):

:echo substitute(getline('.'),'\t\(\t\)\@=','\tnull','eg')

, который вставляет <Tab> только между первыми двумя <Tab> s:

zer<Tab>null<Tab>abc<Tab>def<Tab><Tab>iop<Tab><Tab>

, тогда как если I изменить порядок замещающих флагов при вызове замещающей функции ('eg' заменяется на 'ge'):

    :echo substitute(getline('.'),'\t\(\t\)\@=','\tnull','ge')

Тогда я получаю ожидаемый результат:

zer<Tab>null<Tab>abc<Tab>def<Tab>null<Tab>iop<Tab>null<Tab>

Похоже, что порядок флагов в функции substitute () меняет свое поведение, но не влияет на команду substitute. У кого-нибудь есть идеи, почему?

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Команда :substitute может принимать много флагов, но функция substitute() поддерживает только флаг g. Флаги типа c (для интерактивности) или e (для подавления ошибок) не применяются к функции низкого уровня.

0 голосов
/ 18 мая 2018

Из моего ограниченного понимания C, он выглядит как будто Vim заботится об аргументе {flags}, только если его первый символ g:

do_all = (flags[0] == 'g');
[…]
if (!do_all)
    break;

Это может объяснитьтот факт, что :help substitute() упоминает только g при объяснении {flags}:

When {flags} is "g", all matches of {pat} in {expr} are
replaced.  Otherwise {flags} should be "".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...