3

一些 Vim 函数在一个范围内工作:

:'<,'>TOhtml

第一个命令采用范围的语法是什么,后面的命令通过管道传递结果?

wiki上的评论中,它建议使用一个插件来允许所有命令在该范围上运行;但在这里我只需要第一个参数来处理范围。

# These are the commands I am attempting to chain
:'<,'>TOhtml
:w! ~/mylink
:q!

# The last two can chain or be one command
:w! ~/mylink | q!
:wq! ~/mylink

# But these fail
:'<,'>TOhtml | wq! ~/mylink
:execute "'<,'>TOhtml" | "wq! ~/mylink"
4

2 回答 2

5

使用execute是要走的路,但你只需要引用命令:execute,而不是第二个。

也就是说,替换:

:execute "'<,'>TOhtml" | "wq! ~/mylink"

有了这个:

:execute "'<,'>TOhtml" | wq! ~/mylink
于 2013-08-23T10:53:53.580 回答
2

ClothSword,你离目标不远了。根据您的 VIM 设置,可能会使用三个表达式在一行中链接多个命令:和|,如下所示:\|<bar>

:echom "test 1" | echom "OK"
:echom "test 2" \| echom "OK"
:echom "test 3" <bar> echom "OK"

测试其中一个对您有用的方法是运行上述所有三个命令,然后运行:messages​​. 在输出中,您应该看到无效命令的错误消息:无效的 exprecion、未定义的变量等......实际的错误消息是无关紧要的。同时,对于确实有效的命令,您将看到两行输出,类似于:

test [number]
OK

使用命令链时需要注意几个陷阱:

  1. |当用于链接多个系统命令时,其行为与我上面描述的不同,例如::read !ls | wc
  2. :g与,:s和命令一起使用时必须小心,:map因为它可能不符合您的预期,例如:%g/foo/p|>:%s/foo/bar/|>:nmap 10\| map \ l

注意:您也可以<NL>以与使用相同的方式使用|(可以插入Ctrl-V Ctrl-J,将输出^@)。但是,不建议使用这种用法,因为它更适合链接外部命令。

还请参见:如果您想全面了解命令链在 VIM 中的工作原理,那么我建议您阅读 VIM 的 :bar ( :help :bar) 手册并查看bcpoption ( :help cpoption) 的标志。

于 2013-08-23T10:59:49.513 回答