静静地激活vim命令然后在vim中回显

时间:2016-05-17 08:48:32

标签: bash shell vim

我想在我autocmd BufWrite的{​​{1}}上执行一个shell命令,然后回显(在vim中)一条消息,说明它已经完成而没有显示shell。

(基本上是.vimrc),然后回复一条信息消息,说“文件被触摸!”。

第一部分有效,但第二个命令在shell中执行而不是vim。

命令应该是这样的:

touch *.less

我想我需要一种方法来“结束”命令并允许其他命令。

我尝试了这个没有取得更多成功:

autocmd BufWritePost *.less silent! !touch '%:p:h'/*.less | echo 'file  '.expand('%:p:h').' touched !'

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果你通过一个函数过去它应该有效:

function! Cmd()
    silent! execute '! touch %:p:h/*.less'
    echo 'file '.expand('%:p:h').' touched !'
endfunction

autocmd BufWritePost *.less call Cmd()

答案 1 :(得分:1)

如果调用外部命令,前导!newline是命令的结尾,其他字符(如|)将成为外部命令的一部分,是的,它将是shell管道,它不会被传递给vim的命令。对于此部分,您可以查看:h :!了解详细信息。

A '|' in {cmd} is passed to the shell, you cannot use
        it to append a Vim command.  See |:bar|.

如果要组合两个命令,一个是外部的,一个是vim。您可以编写一个函数来包装命令,如果您更喜欢更短的单行,则可以编写以下内容:

:exec "!shell command|shell|shell"|exec "vimcommand"

通过这种方式,管道连接两个exec命令。

您可以尝试的示例:

:exec "!echo 'foo'"|exec "echo 'bar'"

你将在shell stdout中获得foo,在你的vim中获得bar