W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
一如大多數(shù)編程語(yǔ)言,Vimscript支持函數(shù)。讓我們看看如何創(chuàng)建函數(shù),然后再討論它們的古怪之處。
執(zhí)行下面的命令:
:function meow()
你可能會(huì)認(rèn)為這將定義函數(shù)meow
。不幸的是,情況不是這樣的,我們已經(jīng)掉進(jìn)了Vimscript其中的一個(gè)坑。
沒(méi)有作用域限制的Vimscript函數(shù)必須以一個(gè)大寫(xiě)字母開(kāi)頭!
即使你_真的_給函數(shù)限定了作用域(我們待會(huì)會(huì)談到),你最好也用一個(gè)大寫(xiě)字母開(kāi)頭。 大多數(shù)Vimscript程序猿都是這么做的,所以不要破例。
ok,是時(shí)候認(rèn)真地定義一個(gè)函數(shù)了。執(zhí)行下面的命令:
:function Meow()
: echom "Meow!"
:endfunction
這次Vim愉快地定義了一個(gè)函數(shù)。讓我們?cè)囋囘\(yùn)行它:
:call Meow()
不出所料,Vim顯示Meow!
讓我們?cè)囋嚵钏祷匾粋€(gè)值。執(zhí)行下面的命令:
:function GetMeow()
: return "Meow String!"
:endfunction
現(xiàn)在執(zhí)行這個(gè)命令試試:
:echom GetMeow()
Vim將調(diào)用這個(gè)函數(shù)并把結(jié)果傳遞給echom
,顯示Meow String!
。
我們已經(jīng)看到,Vimscript里調(diào)用函數(shù)有兩種不同的方法。
當(dāng)你想直接調(diào)用一個(gè)函數(shù)時(shí),使用call
命令。執(zhí)行下面命令:
:call Meow()
:call GetMeow()
第一個(gè)函數(shù)輸出Meow!
,然而第二個(gè)卻沒(méi)有任何輸出。當(dāng)你使用call
時(shí),返回值會(huì)被丟棄, 所以這種方法僅在函數(shù)具有副作用時(shí)才有用。
第二種方法是在表達(dá)式里調(diào)用函數(shù)。這次不需要使用call
,你只需引用函數(shù)的名字。 執(zhí)行下面的命令:
:echom GetMeow()
正如我們見(jiàn)過(guò)的,這會(huì)調(diào)用GetMeow
并把返回值傳遞給echom
。
執(zhí)行下面的命令:
:echom Meow()
這將會(huì)顯示兩行:Meow!
和0
。第一個(gè)顯然來(lái)自于Meow
內(nèi)部的echom
。第二個(gè)則告訴我們, 如果一個(gè)Vimscript函數(shù)不返回一個(gè)值,它隱式返回0
。看我們可以利用這一點(diǎn)做什么。執(zhí)行下面命令:
:function TextwidthIsTooWide()
: if &l:textwidth ># 80
: return 1
: endif
:endfunction
這個(gè)函數(shù)涉及到我們之前學(xué)到的許多重要概念:
if
語(yǔ)句如果你對(duì)以上內(nèi)容感到陌生,最好翻到前幾章溫習(xí)一遍。
現(xiàn)在我們已經(jīng)定義了一個(gè)函數(shù),該函數(shù)告訴我們當(dāng)前緩沖區(qū)的textwidth
會(huì)不會(huì)設(shè)得‘太過(guò)寬’。 (因?yàn)?0字符的限制適用于除了HTML之外的任何代碼文件)
現(xiàn)在讓我們使用它。執(zhí)行下面的命令:
:set textwidth=80
:if TextwidthIsTooWide()
: echom "WARNING: Wide text!"
:endif
在這里我們做了什么?
textwidth
為80
。TextwidthIsTooWide()
是否為真。if
語(yǔ)句體(譯注:包括函數(shù)內(nèi)的和函數(shù)外的)不會(huì)被執(zhí)行。因?yàn)槲覀儧](méi)有顯式返回一個(gè)值,Vim從函數(shù)中返回代表'falsy'的0
。試試改變一下。運(yùn)行下面的命令:
:setlocal textwidth=100
:if TextwidthIsTooWide()
: echom "WARNING: Wide text!"
:endif
這次函數(shù)中的if
執(zhí)行了它的語(yǔ)句體,返回1
,并且我們手工輸入的if
語(yǔ)句也執(zhí)行了_它_的語(yǔ)句體。
閱讀:help :call
。目前先忽略關(guān)于"范圍"的內(nèi)容。你可以傳遞多少參數(shù)給一個(gè)函數(shù)?感到驚訝不?
閱讀:help E124
第一自然段并找出你可以用哪些字符來(lái)命名函數(shù)。可以用下劃線嗎?點(diǎn)(Dashes)呢? 重音符號(hào)(Accented characters)?Unicode符號(hào)?如果讀了文檔還是搞不清楚,試一下看看。
閱讀:help return
。這個(gè)命令的縮寫(xiě)("short form")是什么?(我說(shuō)了你千萬(wàn)不要用它) 在你的預(yù)期之內(nèi)嗎?如果不是,為什么?
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: