Vimscript 列表

2018-02-24 16:02 更新

目前為止我們已經(jīng)很熟悉Vimscript里的變量類型了,但我們壓根還沒(méi)講到集合(aggregates)呢! Vim有兩種主要的集合類型,現(xiàn)在我們將講到第一種:列表。

Vimscript列表是有序的,異質(zhì)的元素集合。執(zhí)行下面的命令:

:echo ['foo', 3, 'bar']

Vim輸出這個(gè)列表。列表里當(dāng)然可以嵌套列表。執(zhí)行下面的命令:

:echo ['foo', [3, 'bar']]

Vim會(huì)愉快地輸出這個(gè)列表。

索引

Vimscript列表的索引從0開(kāi)始,你可以用下標(biāo)得到對(duì)應(yīng)元素。執(zhí)行這個(gè)命令:

:echo [0, [1, 2]][1]

Vim顯示[1,2]。你也可以從列表結(jié)尾進(jìn)行索引,這很像Python。執(zhí)行這個(gè)命令:

:echo [0, [1, 2]][-2]

Vim顯示0。索引-1對(duì)應(yīng)列表的最后一個(gè)元素,-2對(duì)應(yīng)倒數(shù)第二個(gè),以此類推。

切割

Vim列表也可被切割。這_看上去_會(huì)讓Python程序員感到眼熟,但它_不_總是表現(xiàn)得跟Python中的一樣! 執(zhí)行這個(gè)命令:

:echo ['a', 'b', 'c', 'd', 'e'][0:2]

Vim顯示['a','b','c'](第1,2,3個(gè)元素)。越過(guò)列表索引上界也是安全的。試試這個(gè)命令:

:echo ['a', 'b', 'c', 'd', 'e'][0:100000]

Vim僅僅顯示整個(gè)列表。

可以用負(fù)數(shù)切割。試試這個(gè)命令:

:echo ['a', 'b', 'c', 'd', 'e'][-2:-1]

Vim顯示['d','e'](元素-2和-1)。

你可以忽略第一個(gè)索引以表示"開(kāi)頭"和/或最后一個(gè)索引以表示"結(jié)尾"。執(zhí)行下面的命令:

:echo ['a', 'b', 'c', 'd', 'e'][:1]
:echo ['a', 'b', 'c', 'd', 'e'][3:]

Vim顯示['a','b']['d','e']。

像Python,Vimscript也允許你索引和切割字符串。執(zhí)行下面命令:

:echo "abcd"[0:2]

Vim顯示abc??墒?,你不能使用負(fù)數(shù)來(lái)索引字符串。你卻_可以_使用負(fù)數(shù)切割字符串! 執(zhí)行下面的命令:

:echo "abcd"[-1] . "abcd"[-2:]

Vim顯示cd(使用負(fù)數(shù)索引會(huì)沒(méi)有報(bào)錯(cuò)地得到一個(gè)空字符串)。

連接

你可以用+連接Vim列表。試試這個(gè)命令:

:echo ['a', 'b'] + ['c']

Vim,一點(diǎn)也不奇怪地,顯示['a','b','c']。 沒(méi)什么好說(shuō)的——在奇怪的Vimscript世界里,列表是如此地正常,以至于讓人感到奇怪。

列表函數(shù)

Vim有著許許多多內(nèi)置列表函數(shù)。執(zhí)行這個(gè)命令:

:let foo = ['a']
:call add(foo, 'b')
:echo foo

Vim就地在列表foo末尾加上'b',并顯示['a','b']。

:echo len(foo)

Vim顯示2,即是列表的長(zhǎng)度。試試下面的命令:

:echo get(foo, 0, 'default')
:echo get(foo, 100, 'default')

Vim顯示adefault。get函數(shù)會(huì)返回給定索引對(duì)應(yīng)的給定列表的項(xiàng),如果索引超過(guò)列表范圍, 返回給定的默認(rèn)值。

執(zhí)行這個(gè)命令:

:echo index(foo, 'b')
:echo index(foo, 'nope')

Vim顯示1-1。index函數(shù)返回給定項(xiàng)在給定列表的第一個(gè)索引,如果不在列表中則返回-1

現(xiàn)在執(zhí)行這個(gè)命令:

:echo join(foo)
:echo join(foo, '---')
:echo join([1, 2, 3], '')

Vim顯示a b,a---b,和123。join先將給定列表的每一項(xiàng)強(qiáng)制轉(zhuǎn)換成字符串, 再以給定的分割字符串(或一個(gè)空格,如果沒(méi)有給的話)作為分割,連接成一個(gè)字符串。

執(zhí)行下面命令:

:call reverse(foo)
:echo foo
:call reverse(foo)
:echo foo

Vim先顯示['b','a'],接著是['a','b']。reverse_就地_轉(zhuǎn)置給定的列表。

練習(xí)

閱讀:help List??赐晁?。注意大寫(xiě)L

閱讀:help add().

閱讀:help len().

閱讀:help get().

閱讀:help index().

閱讀:help join().

閱讀:help reverse().

瀏覽:help functions來(lái)查找我沒(méi)有講過(guò)的其他列表函數(shù)。 執(zhí)行:match Keyword /\clist/來(lái)以大小寫(xiě)不敏感的方式高亮單詞list,以便于你的查找。

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)