我正在尝试使用循环过滤多个单词,但是后续操作不起作用:
function! Myfilter (...)
for s in a:000
v/s/d
endfor
endfunction
删除所有不包含字母s
的行,而不是s
的值。如何在声明s
中获得v/s/d
的价值?
答案 0 :(得分: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
答案 1 :(得分:0)
:execute
命令专为此任务而设计
评估表达式并将其作为 Ex 命令执行:
exec 'v/' . s . '/d'
答案 2 :(得分:0)
更有效的解决方案是从参数中组合正则表达式,并使用它来删除不匹配的行。
exe 'v/\('.join(a:000, '\|').'\)/d_'