2016-05-17 88 views
0

我想在我的.vimrcautocmd BufWrite上執行一個shell命令,然後在vim中回顯一條消息,告訴它已完成,而不顯示shell。靜默地執行vim命令,然後在vim中回顯

(基本上是touch *.less),然後回顯一個信息消息說「文件被觸摸!」。

第一部分工作,但第二個命令在shell而不是vim中執行。

的命令應該是這樣的:

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

我想我需要「結束」的命令,並允許其他命令的方式。

我想這個沒有更多的成功:

:silent !touch '%:p:h'/*.less && exit 0 | unsilent! | echo "file touched" 

任何想法?

回答

2

它應該工作,如果你過去的一個功能:

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

autocmd BufWritePost *.less call Cmd() 
+0

這工作幾乎就像我想要的(在一個小的語法修復後)。當我這樣做時,我有消息'按ENTER鍵或輸入命令繼續'這有點煩人。任何想法? (順便說一句,歡迎在stackoverflow :)) – Asenar

+1

謝謝! :) 有一些技巧來禁用它:[鏈接](http://vim.wikia.com/wiki/Avoiding_the_%22Hit_ENTER_to_continue%22_prompts) 但是,當你想打印和讀取觸發器的東西時,這是必要的。 – cchauviere

+0

是的,我找到了,並在兩行之間添加了'redraw!',並且在execute命令中移動了'silent!'。 – Asenar

1

如果調用外部命令,與領先的!newline是命令的末尾,其他字符,像|,將是你的外部命令的一部分,也就是說,這將是殼管,它不會傳遞給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'" 

您將獲得外殼標準輸出foo和你的vim的bar

+0

我剛剛發現,溶液中,並要回答這個問題,但由於您! ':執行'沉默! !touch「%:p:h」/ *。less'| echo「file touched」'。無聲部分丟失 – Asenar

+1

@Asenar是的,關鍵是使不可連接的命令「可連接」,把它放在'執行' – Kent