我想在我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 !'
有什么想法吗?
答案 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
。