毫無疑問,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ù)目的參數(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`。當(dāng)你在Vim中定義了一個接受可變參數(shù)的函數(shù),`a:0`將被設(shè)置為你額外給的參數(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"
第三行有些費解。當(dāng)一個函數(shù)可以接受可變參數(shù),`a:000`將被設(shè)置為一個包括所有傳遞過來的額外參數(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ù)變量重新賦值。現(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`。
- 前言
- 鳴謝
- 預(yù)備知識
- 打印信息
- 設(shè)置選項
- 基本映射
- 模式映射
- 精確映射
- Leaders
- 編輯你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 鍛煉你的手指
- 本地緩沖區(qū)的選項設(shè)置和映射
- 自動命令
- 本地緩沖區(qū)縮寫
- 自動命令組
- Operator-Pending映射
- 更多Operator-Pending映射
- 狀態(tài)條
- 負責(zé)任的編碼
- 變量
- 變量作用域
- 條件語句
- 比較
- 函數(shù)
- 函數(shù)參數(shù)
- 數(shù)字
- 字符串
- 字符串函數(shù)
- Execute命令
- Normal命令
- 執(zhí)行normal!
- 基本的正則表達式
- 實例研究:Grep 運算符(Operator),第一部分
- 實例研究:Grep運算符(Operator),第二部分
- 實例研究:Grep運算符(Operator),第三部分
- 列表
- 循環(huán)
- 字典
- 切換
- 函數(shù)式編程
- 路徑
- 創(chuàng)建一個完整的插件
- 舊社會下的插件配置方式
- 新希望:用Pathogen配置插件
- 檢測文件類型
- 基本語法高亮
- 高級語法高亮
- 更高級的語法高亮
- 基本折疊
- 高級折疊
- 段移動原理
- Potion段移動
- 外部命令
- 自動加載
- 文檔
- 發(fā)布
- 還剩下什么?
