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