Vimscript 比較

2018-02-24 16:02 更新

我們已經(jīng)學(xué)習(xí)了條件語(yǔ)句,但如果我們不能進(jìn)行比較,if語(yǔ)句并不怎么有用。 當(dāng)然Vim允許我們比較值的大小,只是不會(huì)像看上去那么一目了然。

執(zhí)行下面的命令:

:if 10 > 1
:    echom "foo"
:endif

顯然,Vim會(huì)顯示foo?,F(xiàn)在執(zhí)行下面的命令:

:if 10 > 2001
:    echom "bar"
:endif

Vim什么都不顯示,因?yàn)?code>10不比2001大。目前為止,一切正常。運(yùn)行下面命令:

:if 10 == 11
:    echom "first"
:elseif 10 == 10
:    echom "second"
:endif

Vim顯示second。沒(méi)什么好驚訝的。讓我們?cè)囋嚤容^字符串。執(zhí)行下面命令:

:if "foo" == "bar"
:    echom "one"
:elseif "foo" == "foo"
:    echom "two"
:endif

Vim輸出two。還是沒(méi)什么好驚訝的,所以我開頭說(shuō)的(譯注:Vim的比較不像看上去那么直白)到底是指什么呢?

大小寫敏感

執(zhí)行下面的命令:

:set noignorecase
:if "foo" == "FOO"
:    echom "vim is case insensitive"
:elseif "foo" == "foo"
:    echom "vim is case sensitive"
:endif

Vim執(zhí)行elseif分句,所以顯然Vimscript是大小寫敏感的。有道理,但沒(méi)什么好震驚的。 現(xiàn)在執(zhí)行下面命令:

:set ignorecase
:if "foo" == "FOO"
:    echom "no, it couldn't be"
:elseif "foo" == "foo"
:    echom "this must be the one"
:endif

啊!?就在這里停下來(lái)。是的,你所見(jiàn)屬實(shí)。

==的行為取決于用戶的設(shè)置。

我發(fā)誓我沒(méi)忽悠你。你再試試看看。我沒(méi)開玩笑,這不是我干的。

防御性編程

這意味著什么?意味著在為別人開發(fā)插件時(shí),你_不能_信任==。 一個(gè)不加包裝的==_不能_出現(xiàn)在你的插件代碼里。

這個(gè)建議就像是"nmap?VS?nnoremap"一樣。_永遠(yuǎn)不要_猜測(cè)你的用戶的配置。 Vim既古老,又博大艱深。在寫插件時(shí),你_不得不_假定用戶們的配置五花八門,千變?nèi)f化。

所以怎樣才能適應(yīng)這荒謬的現(xiàn)實(shí)?好在Vim有額外兩種比較操作符來(lái)處理這個(gè)問(wèn)題。

執(zhí)行下面的命令:

:set noignorecase
:if "foo" ==? "FOO"
:    echom "first"
:elseif "foo" ==? "foo"
:    echom "second"
:endif

Vim顯示first因?yàn)?code>==?是"無(wú)論你怎么設(shè)都大小寫不敏感"比較操作符?,F(xiàn)在執(zhí)行下面的命令:

:set ignorecase
:if "foo" ==# "FOO"
:    echom "one"
:elseif "foo" ==# "foo"
:    echom "two"
:endif

Vim顯示two因?yàn)?code>==#是"無(wú)論你怎么設(shè)都大小寫敏感"比較操作符。

故事的最后告訴我們一個(gè)道理:你應(yīng)該_總是_用顯式的大小寫敏感或不敏感比較。 使用常規(guī)的形式是_錯(cuò)的_并且它_終究_會(huì)出錯(cuò)。打多一下就能拯救你自己于焦頭爛額中。

當(dāng)你比較整數(shù)時(shí),這點(diǎn)小不同不會(huì)有什么影響。 不過(guò),我還是建議每一次都使用大小寫敏感的比較(即使不一定需要這么做),好過(guò)該用的時(shí)候_忘記_用了。

在比較整數(shù)時(shí)使用==#==?都可以,而且將來(lái)一旦你改成字符串間的比較,它還會(huì)正確工作。 如果你真想用==比較整數(shù)也不是不行,不過(guò)要銘記,一旦被改成字符串間的比較,你需要修改比較操作符。

練習(xí)

嘗試:set ignorecase:set noignorecase,看看在不同狀態(tài)下比較的表現(xiàn)。

閱讀:help ignorecase來(lái)看看為什么有的人設(shè)置了這個(gè)選項(xiàng)。

閱讀:help expr4看看所有允許的比較操作符。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)