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

2018-02-24 16:02 更新

毫無疑問,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:。這表示一個變量的作用域,在前幾章(譯注:第20章)我們曾講過。

讓我們試一下不帶作用域前綴會怎么樣。執(zhí)行下面的命令:

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

這次Vim抱怨說它找不到變量name

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

可變參數(shù)

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

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

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

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

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

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

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

第三行有些費解。當一個函數(shù)可以接受可變參數(shù),a:000將被設置為一個包括所有傳遞過來的額外參數(shù)的列表(list)。 我們還沒有講過列表,所以不要太糾結(jié)于此。你不能對列表使用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的值,將余下的塞進可變參數(shù)列表中。

賦值

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

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

:call Assign("test")

Vim將拋出一個錯誤,因為你不能對參數(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

練習

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

閱讀:help local-variables。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號