微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vim – Multiple:g和:v命令在一个语句中

我有这个文件
foo
foo bar
foo bar baz
bar baz
foo baz
baz bar
bar
baz
foo 42
foo bar 42 baz
baz 42

我要

>选择包含foo并且不包含栏的行
>删除包含foo并且不包含栏的行

我读了某个地方(找不到链接),我必须使用:exec with |为了这.

我试过以下,但它不工作

:exec "g/foo" # works
:exec "g/foo" | exec "g/bar" -- first returns lines with foo,then with bar
:exec "g/foo" | :g/bar -- same as above

而如果我不能选择一行,我就不能执行正常的dd.

有任何想法吗?

编辑

赏金注意事项:

我正在寻找一个使用正确的:g和:v命令的解决方案,并且不使用正则表达式黑客,因为条件可能不一样(我可以有2个包含,3个不包括).

还要注意,最后2个不起作用的例子,它们只能删除行,但是当我们运行它们而不删除(即查看所选行)时它们返回不正确的信息,它们的行为如上所述.

这可能仍然是你的黑客,但你可以编写一些vimscript来为这个功能和专门的命令.例如:
command! -nargs=* -range=% G <line1>,<line2>call MultiG(<f-args>)
fun! MultiG(...) range
   let pattern = ""
   let command = ""
   for i in a:000
      if i[0] == "-"
         let pattern .= "\\(.*\\<".strpart(i,1)."\\>\\)\\@!"
      elseif i[0] == "+"
         let pattern .= "\\(.*\\<".strpart(i,1)."\\>\\)\\@="
      else
         let command = i
      endif
   endfor
   exe a:firstline.",".a:lastline."g/".pattern."/".command
endfun

这将创建一个命令,允许您自动执行“正则表达式黑客”.你可以这样做

:G +foo -bar

以foo而不是bar来获取所有行.如果一个参数不是以 – 开头,那么它被认为是添加到:g命令结尾的命令.所以你也可以做

:G d +foo -bar

删除行,甚至

:G norm\ foXp +two\ foos -bar

如果你逃避你的空间.它还需要一个像1,3G等等的范围,你可以在搜索字词里使用正则表达式,但你必须逃避你的空间.希望这可以帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐