2016-05-17 21 views
0

autocmd BufWriteでシェルコマンドを実行して、.vimrcに入れて、シェルを表示せずにdonemというメッセージをエコーし​​ます(vimで)。vimコマンドを静かに実行してからvimでエコーする

(基本的にはtouch *.less)、「file touched!」という情報メッセージをエコーし​​ます。

最初の部分は機能しますが、2番目のコマンドは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

これは(小さな構文修正の後に)私が望むのとほとんど同じです。私がそれをすると、私は 'Press Enterを押すか、コマンドを入力して続行するというメッセージが表示され、ちょっと面倒です。それのための任意のアイデア? (ところで、stackoverflowで歓迎:)) – Asenar

+1

ありがとう! :) それを無効にするトリックがあります:[リンク](http://vim.wikia.com/wiki/Avoiding_the_%22Hit_ENTER_to_continue%22_prompts) これは、トリガーで何かを印刷して読みたい場合に必要です。 。 – cchauviere

+0

はいそれを見つけて、2行の間に '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|. 

2つのコマンドを組み合わせたい場合は、1つは外部、もう1つはvimです。あなたは短いワンライナーを好む場合は、コマンドをラップする関数を書くか、以下のことができます。

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

このように、パイプは2つのexecコマンドを接続しています。

たとえば、あなたが試すことができます:

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

あなたはシェルstdoutとあなたのvimの中barfooを取得します。

+0

を私はちょうどその解決策を発見し、それに答えるつもりだったが、あなたのおかげ! ':execute 'サイレント! !touch "%:p:h"/*。less '| echo "ファイルtouch" "。無音部分がありません – Asenar

+1

@Asenarはい、鍵は接続不可能なコマンドを「接続可能」にして、それを 'exec'に入れます。 – Kent

関連する問題