函数以递归方式搜索vim中的模式

时间:2017-04-23 11:44:56

标签: vim pattern-matching

我有一个包含简单文本行的文本文件。我想为vim(和gvim)文本编辑器创建一个函数

can be sent a variable number of patterns and 
it should find lines will all patterns (in any order) 
and keep only these lines 
while deleting the rest. 

我在网上搜索并发现了一些有用的链接,但没有一个可以做到以上所有:

以下将查找并删除所有不包含该模式的行:

 :v/pattern/d

可以使用MultipleSearch http://www.vim.org/scripts/script.php?script_id=479脚本进行多次搜索和突出显示。布尔逻辑搜索可以使用LogiPat脚本https://vim.sourceforge.io/scripts/script.php?script_id=1290完成。我也可以使用过滤包,但我无法使用:http://www.vim.org/scripts/script.php?script_id=2759

使用AND搜索并保留多个模式的行:

":v/.*pattern1\&.*pattern2/d"

但我每次都输入代码。

如何创建递归运行:v/pattern/d的函数以仅查找包含所有模式的行?我希望该函数可以运行:

:Myfn pattern1 pattern2 pattern3

编辑:我曾尝试为此函数编写以下代码,尝试在vim中使用Linux grep命令:

:function Myfn (Title, ...)
  : let outstr=""
  : for s in a:000
  :   outstr=!echo outstr | grep s
  : endfor
  : return outstr
 : endfunction

但我得到以下错误:

Not an editor command:   :   outstr=!echo outstr | grep s

2 个答案:

答案 0 :(得分:0)

带OR

:v/pattern1\|pattern2\|pattern3/d

与AND

:v/pattern1\&.*pattern2\&.*pattern/d

任何订单

:v/.*pattern1\&.*pattern2\&.*pattern3/d

(抱歉看起来你的解决方案已经有了这个)

答案 1 :(得分:0)

您可以创建命令Keepword

com! -nargs=* Keepword v/\v<args>/d

并称之为:

Keepword word1|word2|word3

使用该命令后,所有行(除了提供单词的行)都将被删除。