2012-03-20 15 views
1

vimが外部コマンドを実行中に表示されているvimのステータス行を変更したいと思います。 私はvimからのテキスト行を "!"を使っていくつかの外部プログラムにパイプするvimスクリプトを持っています。実行後、vimはコマンドの出力が行を置き換えるのを待つ。待っている間、ステータスラインに外部コマンドのステータスを表示したいと思います。 これは可能ですか?コマンドを実行中にvimのステータス行を変更する

答えて

1

私は一時グローバル変数を使用してこれを解決します。ここでは、それが存在する場合は、変数g:temp_varの値を返す単純な関数は、それ以外の場合は空の文字列を返し、次のとおりです。

function! TemporaryStatus() 
    if exists("g:temp_var") 
     return g:temp_var 
    else 
     return "" 
    endif 
endfunction 

あなたはこのように、この関数の戻り値を使用するようにステータスラインを設定することができます。

set statusline=%!TemporaryStatus() 

次に、slow externalコマンドを呼び出すときは、(表示したいメッセージを使って)あらかじめテンポラリ変数を設定してから、unletを設定してください。 redraw!コマンドは必ずVimが表示を更新(したがって、ステータスラインにg:temp_varの更新された値を使用しています)を作成するために必要であることを

... 
let g:temp_var = "I am calling a slow external command" 
redraw! 
call SlowExternalCommand() 
unlet g:temp_var 
redraw! 
... 

注:たとえば。もちろん

EDIT

このように、それをエコーし​​、その後表示をクリアすることでメッセージを表示するためにはるかに簡単になります。メッセージは、上に表示されます

... 
redraw! 
echo "I am calling a slow external command" 
call SlowExternalCommand() 
redraw! 
... 

この方法ステータスラインではなくVimコマンドライン。上で定義した関数は必要ありません。

+0

です。しかし私が必要とするのは更新されたステータスラインです。例えば。 5%10%15%(プログレス情報自体は外部コマンドによって生成され、パイプやファイルに書き込むことができますが、そこから読み込むことができます)。しかし、重要な問題は、ステータス行が外部コマンドを実行している間に更新を許可するかどうかです。 – highsciguy

+0

これを '!'を使って行うことはできません。恐れ入ります。 '!'はシステムコール中にVimを一時停止します。あなたはVimを停止しないと主張する '!start'(':help:!start'参照)を試してみることができます。それがうまくいけば、コマンド実行中に 'g:temp_var'を更新することができます。 –

+0

これはおそらく、私はファイルにコマンドの出力を挿入することができないことを意味しますか? – highsciguy

関連する問題