2011-08-01 10 views
3

私はVimにブール関数を実装しようとしていますが、何らかの問題があり、私には何か不足していると確信しています。Vimブール関数

私は、!で呼び出されたときに逆を行う関数を実装しようとしています。

Vimには、listpasteのような多くのブール関数があります。私が好き、と言う機能、バッファを開くを持っている場合は、私の場合は、:

:call MyFunction() 

それから私は、これは!と呼ばれるバッファをクローズしたいと思います:

:call MyFunction()! 

わかりませんこれが可能であれば、私はバッファのオープン方法やクローズ方法を探すのではなく、実際のブール値の実装を探しています。

編集:

私たちが同じように、ユーザー定義コマンドについて話す場合の方法より実現可能であると思われる:

:MyCommand action! 
+4

あなたは混乱している: '::MyCommandオプションbangがコマンド名の後に取得します!アクション '。 – Benoit

答えて

4
:としても呼び出すことができます

:MyCommand action 

コマンドを作成するときは、-bangオプションを指定してから、<bang>を使用してください。次に、これをあなたの関数にリダイレクトするには、特殊な引数を作成し、それを分析して、それがbangを含むかどうかを調べます。このような何か:私はa:bangは本当に強打であるかどうかを確認するために、ここで正しいテストをやっていないんだけど、あなたのアイデアを持って、もちろん

function! Bang(bang) 
    echo "With".((a:bang)?"":"out")." bang." 
endfunction 

command! -bang Bg call Bang(<bang>0) 

(ZYXが提案するものを含みます)。

:Bg 
Without bang. 

:Bg! 
With bang. 
+0

関数の引数に「 0」と書かれています。これは、「bang」のない「0」、または「1」を返します。 booleanコンテキストで 'len(...)'を使う代わりに '!empty(...)'を使います。 – ZyX

+0

ありがとうZyX!本当にうれしいです、私は引数を渡すより良い方法を探していました。しかし、ここでは 'empty()'が本当に必要ですか?条件としてa:bangの値を使うと十分だと思われます。 – sidyll

+0

* this *の場合に 'empty()'を使うべきではないと言いました。私はちょうど 'len(...)'を使う必要はないと言いました(文字列上では '!empty(...)'よりもはるかに遅いです)。 – ZyX