我有以下由制表符分隔的字符串组成的行;我有时会有多个连续的<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命令没有影响。 有谁知道为什么?
答案 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
(用于错误抑制)之类的标志不适用于低级功能。