我有一个包含简单文本行的文本文件。我想为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
答案 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
使用该命令后,所有行(除了提供单词的行)都将被删除。