Vimscript 函數(shù)

2018-02-24 16:02 更新

一如大多數(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!。

調(diào)用函數(shù)

我們已經(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

在這里我們做了什么?

  • 一開始我們設(shè)置全局的textwidth80。
  • 接著我們運行一個if語句判斷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)嗎?如果不是,為什么?

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號