毫無疑問,Vimscript函數可以接受參數。執行下面的命令:
~~~
:function DisplayName(name)
: echom "Hello! My name is:"
: echom a:name
:endfunction
~~~
執行下面的函數:
~~~
:call DisplayName("Your Name")
~~~
Vim將顯示兩行:`Hello! My name is:`?和?`Your Name`。
注意我們傳遞給`echom`命令的參數前面的`a:`。這表示一個變量的作用域,在前幾章(譯注:第20章)我們曾講過。
讓我們試一下不帶作用域前綴會怎么樣。執行下面的命令:
~~~
:function UnscopedDisplayName(name)
: echom "Hello! My name is:"
: echom name
:endfunction
:call UnscopedDisplayName("Your Name")
~~~
這次Vim抱怨說它找不到變量`name`。
在寫需要參數的Vimscript函數的時候,你_總需要_給參數加上前綴`a:`,來告訴Vim去參數作用域查找。
## 可變參數
Vimscript函數可以設計為接受不定數目的參數,就像Javascript和Python中的一樣。執行下面命令:
~~~
:function Varg(...)
: echom a:0
: echom a:1
: echo a:000
:endfunction
:call Varg("a", "b")
~~~
這個函數向我們展示了許多東西,讓我們來逐一審視。
函數定義中的`...`說明這個函數可以接受任意數目的參數。就像Python函數中的`*args`
函數中的第一行為輸出消息`a:0`,結果顯示`2`。當你在Vim中定義了一個接受可變參數的函數,`a:0`將被設置為你額外給的參數數量(譯注:注意是額外的參數數量)。 剛才我們傳遞了兩個參數給`Varg`,所以Vim顯示`2`。(譯注:2 - 0 ==# 2)
第二行為輸出`a:1`,結果顯示`a`。你可以使用`a:1`,`a:2`等等來引用你的函數接受的每一個額外參數。 如果我們用的是`a:2`,Vim就會顯示"b"
第三行有些費解。當一個函數可以接受可變參數,`a:000`將被設置為一個包括所有傳遞過來的額外參數的列表(list)。 我們還沒有講過列表,所以不要太糾結于此。你不能對列表使用`echom`,因而在這里用`echo`代替。
你也可以將可變參數和普通參數一起用。執行下面的命令:
~~~
:function Varg2(foo, ...)
: echom a:foo
: echom a:0
: echom a:1
: echo a:000
:endfunction
:call Varg2("a", "b", "c")
~~~
我們可以看到Vim將`"a"`作為具名參數(named argument)`a:foo`的值,將余下的塞進可變參數列表中。
## 賦值
試試執行下面的命令:
~~~
:function Assign(foo)
: let a:foo = "Nope"
: echom a:foo
:endfunction
:call Assign("test")
~~~
Vim將拋出一個錯誤,因為你不能對參數變量重新賦值。現在執行下面的命令:
~~~
: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`。
- 前言
- 鳴謝
- 預備知識
- 打印信息
- 設置選項
- 基本映射
- 模式映射
- 精確映射
- Leaders
- 編輯你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 鍛煉你的手指
- 本地緩沖區的選項設置和映射
- 自動命令
- 本地緩沖區縮寫
- 自動命令組
- Operator-Pending映射
- 更多Operator-Pending映射
- 狀態條
- 負責任的編碼
- 變量
- 變量作用域
- 條件語句
- 比較
- 函數
- 函數參數
- 數字
- 字符串
- 字符串函數
- Execute命令
- Normal命令
- 執行normal!
- 基本的正則表達式
- 實例研究:Grep 運算符(Operator),第一部分
- 實例研究:Grep運算符(Operator),第二部分
- 實例研究:Grep運算符(Operator),第三部分
- 列表
- 循環
- 字典
- 切換
- 函數式編程
- 路徑
- 創建一個完整的插件
- 舊社會下的插件配置方式
- 新希望:用Pathogen配置插件
- 檢測文件類型
- 基本語法高亮
- 高級語法高亮
- 更高級的語法高亮
- 基本折疊
- 高級折疊
- 段移動原理
- Potion段移動
- 外部命令
- 自動加載
- 文檔
- 發布
- 還剩下什么?