Vimscript 函數(shù)參數(shù)

2018-02-24 16:02 更新

毫無(wú)疑問(wèn),Vimscript函數(shù)可以接受參數(shù)。執(zhí)行下面的命令:

:function DisplayName(name)
:  echom "Hello!  My name is:"
:  echom a:name
:endfunction

執(zhí)行下面的函數(shù):

:call DisplayName("Your Name")

Vim將顯示兩行:Hello! My name is:?和?Your Name。

注意我們傳遞給echom命令的參數(shù)前面的a:。這表示一個(gè)變量的作用域,在前幾章(譯注:第20章)我們?cè)v過(guò)。

讓我們?cè)囈幌虏粠ё饔糜蚯熬Y會(huì)怎么樣。執(zhí)行下面的命令:

:function UnscopedDisplayName(name)
:  echom "Hello!  My name is:"
:  echom name
:endfunction
:call UnscopedDisplayName("Your Name")

這次Vim抱怨說(shuō)它找不到變量name。

在寫(xiě)需要參數(shù)的Vimscript函數(shù)的時(shí)候,你_總需要_給參數(shù)加上前綴a:,來(lái)告訴Vim去參數(shù)作用域查找。

可變參數(shù)

Vimscript函數(shù)可以設(shè)計(jì)為接受不定數(shù)目的參數(shù),就像Javascript和Python中的一樣。執(zhí)行下面命令:

:function Varg(...)
:  echom a:0
:  echom a:1
:  echo a:000
:endfunction

:call Varg("a", "b")

這個(gè)函數(shù)向我們展示了許多東西,讓我們來(lái)逐一審視。

函數(shù)定義中的...說(shuō)明這個(gè)函數(shù)可以接受任意數(shù)目的參數(shù)。就像Python函數(shù)中的*args

函數(shù)中的第一行為輸出消息a:0,結(jié)果顯示2。當(dāng)你在Vim中定義了一個(gè)接受可變參數(shù)的函數(shù),a:0將被設(shè)置為你額外給的參數(shù)數(shù)量(譯注:注意是額外的參數(shù)數(shù)量)。 剛才我們傳遞了兩個(gè)參數(shù)給Varg,所以Vim顯示2。(譯注:2 - 0 ==# 2)

第二行為輸出a:1,結(jié)果顯示a。你可以使用a:1,a:2等等來(lái)引用你的函數(shù)接受的每一個(gè)額外參數(shù)。 如果我們用的是a:2,Vim就會(huì)顯示"b"

第三行有些費(fèi)解。當(dāng)一個(gè)函數(shù)可以接受可變參數(shù),a:000將被設(shè)置為一個(gè)包括所有傳遞過(guò)來(lái)的額外參數(shù)的列表(list)。 我們還沒(méi)有講過(guò)列表,所以不要太糾結(jié)于此。你不能對(duì)列表使用echom,因而在這里用echo代替。

你也可以將可變參數(shù)和普通參數(shù)一起用。執(zhí)行下面的命令:

:function Varg2(foo, ...)
:  echom a:foo
:  echom a:0
:  echom a:1
:  echo a:000
:endfunction

:call Varg2("a", "b", "c")

我們可以看到Vim將"a"作為具名參數(shù)(named argument)a:foo的值,將余下的塞進(jìn)可變參數(shù)列表中。

賦值

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

:function Assign(foo)
:  let a:foo = "Nope"
:  echom a:foo
:endfunction

:call Assign("test")

Vim將拋出一個(gè)錯(cuò)誤,因?yàn)槟悴荒軐?duì)參數(shù)變量重新賦值?,F(xiàn)在執(zhí)行下面的命令:

:function AssignGood(foo)
:  let foo_tmp = a:foo
:  let foo_tmp = "Yep"
:  echom foo_tmp
:endfunction

:call AssignGood("test")

這次就可以了,Vim顯示Yep。

練習(xí)

閱讀:help function-argument的前兩段。

閱讀:help local-variables。

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)