代码之家  ›  专栏  ›  技术社区  ›  René Nyffenegger

我如何在vim中使用一系列子任务来实现a:g?

vim
  •  1
  • René Nyffenegger  · 技术社区  · 15 年前

    我有一个文件,其内容大致是

    insert into FooBar values (13, 19, 220, 108);
    // some text,
    // some more text
    insert into MixMax values (22,  5, 87, 1);
    // and so on
    insert into HooHoo values (8, 37, 222, 51);
    // etc ...
    

    现在,我想把第一个数字拉到绳子后面 values ( 变成一个变量,最好一次完成。

    我想到了 :g/values (\(\d\+\)/let @a .= ', ' . submatch(1) 然后会期望登记册 a 成为 ,13,22,8 .

    不幸的是,使用这个方法,我只得到逗号,而不得到子匹配,即寄存器的内容是 ,,,

    我能做些什么来解决这个问题?

    3 回复  |  直到 15 年前
        1
  •  2
  •   graywh    15 年前

    首先,submatch()只适用于:substitute。

    认为 这就是你想要的。结尾将有一个额外的逗号。

    :let @a=''
    :g/values (/normal f(l"Ayf,
    :let @a=substitute(@a, ',', ', ', 'g')
    
        2
  •  1
  •   DrAl    15 年前

    如果你想在一条线上做,你可以这样做:

    let @a = '' | g/^/let @a .= matchstr(getline('.'), 'values (\zs\d\+, \ze')
    

    这个 :g 部件在每一行上运行其余部分(如果需要,可以过滤,但是 matchstr 无论如何都是这样的)。 匹配器 返回当前行中的匹配字符串。这个 \zs \ze 分隔实际匹配,这样就不会得到“values”(位)。

    参见:

    :help matchstr()
    :help getline()
    :help \zs
    :help \ze
    :help :bar
    
        3
  •  0
  •   rossipedia    15 年前

    有什么问题吗 yi( ?