如何在vim中获取该循环中的变量值
我尝试使用循环筛选多个单词,但以下操作不起作用:如何在vim中获取该循环中的变量值,vim,Vim,我尝试使用循环筛选多个单词,但以下操作不起作用: function! Myfilter (...) for s in a:000 v/s/d endfor endfunction 它删除所有不包含字母s而不是s值的行。如何在语句v/s/d中获取s的值?该命令正是为以下任务而设计的: 计算表达式并将其作为Ex命令执行: 一个更有效的解决方案是根据参数组合一个正则表达式,并使用它删除不匹配的行 exe 'v/\('.join(a:000, '\|').'\)/d_' 删除
function! Myfilter (...)
for s in a:000
v/s/d
endfor
endfunction
它删除所有不包含字母s而不是s值的行。如何在语句v/s/d中获取s的值?该命令正是为以下任务而设计的:
计算表达式并将其作为Ex命令执行:
一个更有效的解决方案是根据参数组合一个正则表达式,并使用它删除不匹配的行
exe 'v/\('.join(a:000, '\|').'\)/d_'
删除除包含函数所有参数的行以外的所有行
示例缓冲区
函数调用示例
示例结果
注
使用regex lookahead以任意顺序匹配单词。这是示例正则表达式在替换后的样子,为了清晰起见,没有转义字符:
:v/(.*word1)@=(.*word2)@=(.*word3)@=/d
这只保留包含任何参数的行。我想他只想保留包含所有论点的行。@JimU。你说得对。一路上我的逻辑颠倒了。
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