2011-08-01 72 views
3

我想在Vim中實現一個布爾函數,並且遇到了一些麻煩,並且我確信有一些我錯過了。Vim布爾函數

只是要清楚,我期待實現一個函數,當與!調用時,它會做相反的。

Vim有很多布爾函數,如listpaste。就我而言,如果我有說的功能,打開一個緩衝,如:

:call MyFunction() 

那麼我想這個關閉緩衝區被稱爲一個!時:

:call MyFunction()! 

不知道如果這甚至是可能的,並且我不想查找如何打開或關閉緩衝區,但實際的布爾實現。

編輯:

看來,這是方式更可行的,如果我們談論一個用戶定義的命令,如:

:MyCommand action 

這也可以被稱爲:

:MyCommand action! 
+4

你困惑:':mycommand的命令名稱後可選的一聲巨響得到! action'。請參閱':help:command'和':help:command-bang' – Benoit

回答

4

當創建你的命令時,給它-bang選項,然後使用<bang>,這將擴大到一個爆炸或沒有。然後,將其重定向到你的函數中,創建一個特殊的參數並對其進行分析,以確定它是否包含爆炸。事情是這樣的:(包括哪些ZYX建議)

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

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

當然,我不是在做正確的測試,在這裏,以檢查是否a:bang是真的砰的一聲,但你有這個想法。

:Bg 
Without bang. 

:Bg! 
With bang. 
+0

函數參數中的' 0'巧妙的技巧:在沒有爆炸或'1'的情況下,它變爲'0'。而不是在布爾上下文中使用'len(...)'使用'!empty(...)'。 – ZyX

+0

謝謝ZyX!真的很好,我正在尋找更好的方式來傳遞論據。但是這裏真的需要'空'()嗎?使用:爆炸值作爲條件似乎已經足夠。 – sidyll

+0

我從來沒有說過你應該在* this *中使用'empty()'。我只是說沒有必要使用'len(...)'(在字符串上它比'!empty(...)'慢得多)。 – ZyX