如何将两个Vim命令合并为一个(命令不进行键盘绑定)

时间:2018-10-08 13:11:41

标签: unix vim text-editor neovim

我发现很少有Stack Overflow问题在谈论这个问题,但是它们都只涉及:nmap:noremap命令。 我想要一个命令,而不仅仅是键绑定。有什么办法可以做到这一点?

用例:

运行:make时,不会自动保存。因此,我想结合使用:make:w。我想创建一个命令:Compile / :C:Wmake来实现这一目标。

3 个答案:

答案 0 :(得分:5)

有关通过|连接Ex命令的一般信息,可以在:help cmdline-lines上找到。

您可以将其应用于交互式命令,映射以及自定义命令中。

请注意,您只需要在映射中使用特殊的<bar>(以避免过早得出映射定义并立即执行其余的操作,这是一个常见的初学者错误::nnoremap <F1> :write | echo "This causes an error during Vim startup!"<CR>)。对于自定义命令,您只需编写|,但请记住哪些命令本身会将其视为其参数。

:help line-continuation将有助于处理过长的命令定义。将多个命令移至单独的:help :function也会有所帮助(但请注意,这会巧妙地改变错误处理)。

参数

如果要传递自定义命令行参数,可以将-nargs=*添加到:command定义中,然后通过<args>在右侧指定插入点。例如,要允许您的:write命令使用命令,可以使用

:command -nargs=* C w <args> | silent make | redraw!

答案 1 :(得分:4)

您可以将命令与|结合使用,请参见:bar的帮助:

command! C update | silent make | redraw!

但是,有一种更清洁的方法来实现您想要的。 只需启用'autowrite'选项即可自动写入 :make之前修改的文件:

                                 'autowrite' 'aw' 'noautowrite' 'noaw'
'autowrite' 'aw'        boolean (default off)
                        global
        Write the contents of the file, if it has been modified, on each
        :next, :rewind, :last, :first, :previous, :stop, :suspend, :tag, :!,
        :make, CTRL-] and CTRL-^ command; and when a :buffer, CTRL-O, CTRL-I,
        '{A-Z0-9}, or `{A-Z0-9} command takes one to another file.
        Note that for some commands the 'autowrite' option is not used, see
        'autowriteall' for that.

:make的帮助中提到了此选项。

答案 2 :(得分:2)

经过反复试验,我找到了解决方案。

我的用例解决方案

command C w <bar> silent make <bar> redraw!

这是使用make进行编译的,并且仅当输出为非零时才打印输出。

一般解决方案

command COMMAND_NAME COMMAND_TO_RUN

COMMAND_TO_RUN可以使用以下命令使用多个命令构造的地方。

COMMAND_1_THAN_2 = COMMAND_1 <bar> COMMAND_2

您可以多次使用它,它与Shell中的管道非常相似。