2017-04-25 64 views
0

我试图使用循环多个单词过滤器,但下面不工作:如何获得变量的值在这个循环中,VIM

function! Myfilter (...) 
    for s in a:000 
    v/s/d 
    endfor 
endfunction 

它删除不包含字母s,而不是所有的行值为s。我如何在声明v/s/d中获得s的值?

回答

0

:execute命令被精确地用于 此任务计算表达式并执行它作为一个命令设计:

exec 'v/' . s . '/d' 
0

一种更有效的解决办法是从您的参数构成一个正则表达式,并用它来删除不匹配的行。

exe 'v/\('.join(a:000, '\|').'\)/d_' 
+0

这只保留包含* any *参数的行。我想他只想保留包含*全部*参数的行。 –

+0

@JimU。你是对的。一路上,我的逻辑倒过来了。 –

1

删除包含所有的函数的参数

function! Myfilter0 (...) 
    exec 'v/\(.*' . join(a:000, '\)\@=\(.*') . '\)\@=/d' 
endfunction 

实施例缓冲器

word1 beta word2 
a word1 b word2 c 
a word2 b word1 c word3 d 
a word2 b word3 c word1 d 
word1 delta 
epsilon 

实施例的函数调用比其他所有行

:call Myfilter("word1", "word2", "word3") 

实施例结果

a word2 b word1 c word3 d 
a word2 b word3 c word1 d 

使用正则表达式到先行以任何顺序相匹配的话。这是示例正则表达式在替换之后的样子,并且为了清晰起见没有转义字符:

:v/(.*word1)@=(.*word2)@=(.*word3)@=/d 
相关问题