Vim substitute()函数标志顺序改变它的行为?

时间:2018-05-17 20:55:23

标签: vim

我有以下由制表符分隔的字符串组成的行;我有时会有多个连续的<Tab>

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

我想插入&#39; null&#39;连续2 <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> s之间插入<Tab>

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

如果我更改替换函数调用中的替换标记的顺序( '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 :(得分:1)

根据我对C的有限理解,如果{flags}的第一个字符是g,那么looks就像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 "". 的事实:

for (int r = 0; r < mnumRows; ++r)
    for (int c = 0; c < mnumCols; ++c)
        Temps[r][c] = original.Temps[r][c];  // or second.Temps[r][c]

答案 1 :(得分:0)

:substitute 命令可以带有许多标志,但是substitute() 功能仅支持g标志。 c(用于交互性)或e(用于错误抑制)之类的标志不适用于低级功能。