如何在vim的循环中获取变量的值

时间:2017-04-25 14:31:45

标签: vim

我正在尝试使用循环过滤多个单词,但是后续操作不起作用:

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

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

3 个答案:

答案 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_'