This page was created by www.chinacode.com on 03/15/08 10:09:52.
Address: http://man.chinacode.com/VIM/eval.html
Title: VIM: eval  •  Size: 505321  •  Last Modified: Thu, 20 Sep 2007 19:58:51 GMT

EVAL

*eval.txt*      For Vim version 7.1.  最近更新: 2007年5月


                  VIM å‚考手册    by Bram Moolenaar
                                译者: Willis
                                http://vimcdoc.sf.net


è¡¨è¾¾å¼æ±‚值                              *expression* *expr* *E15* *eval*

用户手册第 41 ç«  |usr_41.txt| 有使用表达å¼çš„介ç»ã€‚

注æ„: è¡¨è¾¾å¼æ±‚值å¯ä»¥åœ¨ç¼–译时关闭。如果你这么åšï¼Œæœ¬æ–‡æ¡£ä»‹ç»çš„特性就ä¸å¤å­˜åœ¨ã€‚è§
|+eval| 和 |no-eval-feature|。

1.  å˜é‡                |variables|
    1.1 å˜é‡ç±»åž‹
    1.2 函数引用                |Funcref|
    1.3 列表                    |Lists|
    1.4 å­—å…¸                    |Dictionaries|
    1.5 å˜é‡çš„æ›´å¤šç»†èŠ‚          |more-variables|
2.  表达å¼è¯­æ³•          |expression-syntax|
3.  内部å˜é‡            |internal-variables|
4.  内建函数            |functions|
5.  定义函数            |user-functions|
6.  花括å·åå­—          |curly-braces-names|
7.  命令                |expression-commands|
8.  ä¾‹å¤–å¤„ç†            |exception-handling|
9.  示例                |eval-examples|
10. ä¸åŒ…å« +eval 特性   |no-eval-feature|
11. 沙盘 (sandbox)      |eval-sandbox|
12. æ–‡æœ¬é”              |textlock|

{Vi 无此功能}


1. å˜é‡ *variables*

1.1 å˜é‡ç±»åž‹ *E712* 有五ç§ç±»åž‹çš„å˜é‡: 数值 32 ä½å¸¦ç¬¦å·æ•´æ•°ã€‚ 示例: -123 0x10 0177 字符串 NUL 结尾的 8 使— ç¬¦å·å­—符 (å³å­—节) 的串。 示例: "ab\txx\"--" 'x-z''a,c' 函数引用 指å‘一个函数的引用 |Funcref|。 示例: function("strlen") 列表 项目的有åºçš„åºåˆ— |List|。 示例: [1, 2, ['a', 'b']] å­—å…¸ å…³è”çš„æ— åºæ•°ç»„: æ¯ä¸ªé¡¹ç›®åŒ…å«ä¸€ä¸ªé”®å’Œä¸€ä¸ªå€¼ã€‚|Dictionary| 示例: {'blue': "#0000ff", 'red': "#ff0000"} 数值和字符串类型之间会根æ®ä½¿ç”¨çš„æƒ…况自动转æ¢ã€‚ 数值到字符串的转æ¢ä½¿ç”¨æ•°å€¼çš„ ASCII 表示。例如: 数值 123 --> 字符串 "123" 数值 0 --> 字符串 "0" 数值 -1 --> 字符串 "-1" 字符串到数值的转æ¢åˆ™æŠŠå­—符串开头的一系列数字ä½è½¬æ¢æˆæ•°å€¼ã€‚å六进制 "0xf9" 和八 进制 "017" å½¢å¼çš„æ•°å€¼å¯ä»¥è¯†åˆ«ã€‚如果字符串ä¸ä»¥æ•°å­—开始,则结果为零。例如: 字符串 "456" --> 数值 456 字符串 "6bar" --> 数值 6 字符串 "foo" --> 数值 0 字符串 "0xf1" --> 数值 241 字符串 "0100" --> 数值 64 字符串 "-8" --> 数值 -8 字符串 "+8" --> 数值 0 è¦å¼ºåˆ¶ä»Žå­—符串转æ¢åˆ°æ•°å€¼ï¼Œç»™å®ƒåŠ é›¶: :echo "0100" + 0 64 è¦é¿å…开头的零导致八进制的转æ¢ï¼Œæˆ–者想æ¢ä¸åŒçš„基底,用 |str2nr()|。 布尔型的æ“作使用数值类型。零代表å‡å€¼ (FALSE),éžé›¶ä»£è¡¨çœŸå€¼ (TRUE)。 æ³¨æ„ åœ¨å‘½ä»¤ :if "foo" 里,"foo" è¢«è½¬æ¢æˆ 0,也就是å‡å€¼ã€‚è¦æµ‹è¯•字符串éžç©ºï¼Œåº”该使用 strlen(): :if strlen("foo") *E745* *E728* *E703* *E729* *E730* *E731* 列表ã€å­—典和函数引用类型ä¸ä¼šè‡ªåŠ¨è¿›è¡Œè½¬æ¢ã€‚ *E706* 如果你试图改å˜å˜é‡ç±»åž‹ï¼Œä½ ä¼šå¾—到错误。先 |:unlet| å¯ä»¥é¿å…此错误。ä¸è¿‡ï¼Œå­—符串 和数值被认为是等价的类型。考虑如下的命令åºåˆ—: :let l = "string" :let l = 44 " 类型从字符串改为数值 :let l = [1, 2, 3] " å‡ºé”™ï¼ 1.2 函数引用 *Funcref* *E695* *E718* 函数引用å˜é‡å¯ä»¥é€šè¿‡ |function()| 函数得到。å¯ä»¥åœ¨è¡¨è¾¾å¼é‡Œç”¨å®ƒæ¥ä»£æ›¿å‡½æ•°å,在 å›´ç»•å‚æ•°çš„æ‹¬å·ä¹‹å‰ï¼Œä»¥è°ƒç”¨å®ƒå¼•用的函数。例如: :let Fn = function("MyFunc") :echo Fn() *E704* *E705* *E707* 函数引用å˜é‡å¿…须以大写字æ¯ã€"s:"ã€"w:"ã€"t:" 或 "b:" 开始。函数引用å˜é‡ä¸èƒ½å’Œ 任何函数é‡å。 特例是å¯ä»¥å®šä¹‰å‡½æ•°å¹¶ç›´æŽ¥æŠŠå®ƒçš„函数引用赋给字典的一个项目。例如: :function dict.init() dict : let self.val = 0 :endfunction 该字典的键å¯ä»¥ç”¨å°å†™å­—æ¯å¼€å§‹ã€‚这里ä¸ç”¨å®žé™…的函数å。å¦è§ |numbered-function|。 函数引用å¯ä»¥ç”¨ |:call| 命令调用: :call Fn() :call dict.init() 所引用的函数的åå­—å¯ä»¥ç”¨ |string()| 得到, :let func = string(Fn) ä½ å¯ä»¥ç”¨ |call()| æ¥è°ƒç”¨å‡½æ•°å¼•用并用一个列表å˜é‡æ¥ä¼ é€’傿•°: :let r = call(Fn, mylist) 1.3 列表 *List* *Lists* *E686* 列表是项目的有åºåºåˆ—。项目å¯ä»¥æ˜¯ä»»ä½•类型,用索引å·å¯ä»¥è¿›è¡Œè®¿é—®ã€‚å¯ä»¥åœ¨åºåˆ—的任 何ä½ç½®ä¸Šå¢žåŠ æˆ–è€…åˆ é™¤é¡¹ç›®ã€‚ 列表建立 *E696* *E697* 列表用方括å·é‡Œé€—å·åˆ†éš”的项目åºåˆ—建立。例如: :let mylist = [1, two, 3, "four"] :let emptylist = [] 项目å¯ä»¥æ˜¯ä»»ä½•表达å¼ã€‚用列表作为项目就能建立列表的列表: :let nestlist = [[11, 12], [21, 22], [31, 32]] 忽略末项之åŽé¢å¤–的逗å·ã€‚ 列表索引 *list-index* *E684* 在列表之åŽçš„æ–¹æ‹¬å·ä¸­æ”¾ä¸Šç´¢å¼•å·å¯ä»¥è®¿é—®åˆ—表项目。索引从零开始,也就是说,第一个 项目的索引值为零。 :let item = mylist[0] " 得到第一个项目: 1 :let item = mylist[2] " 得到第三个项目: 3 如果返回的项目本身是列表,å¯ä»¥é‡å¤è¿™æ ·çš„æ“ä½œ: :let item = nestlist[0][1] " 得到第一个列表的第二个项目: 12 负索引从尾端开始计算。索引 -1 指å‘列表的最åŽä¸€ä¸ªé¡¹ç›®ï¼Œ-2 指å‘倒数第二个项目, 便­¤ç±»æŽ¨ã€‚ :let last = mylist[-1] " 得到最åŽä¸€ä¸ªé¡¹ç›®: "four" è¦é¿å…éžæ³•索引值产生的错误,用 |get()| 函数。如果项目ä¸å­˜åœ¨ï¼Œå®ƒè¿”回零或者你指 定的缺çœå€¼: :echo get(mylist, idx) :echo get(mylist, idx, "NONE") 列表连接 两个列表å¯ä»¥ç”¨ "+" æ“作符连接: :let longlist = mylist + [5, 6] :let mylist += [7, 8] è¦åœ¨å‰é¢æˆ–åŽé¢é™„加项目,在项目外é¢åŠ ä¸Š [] 从而把它å˜ä¸ºä¸€ä¸ªåˆ—è¡¨ã€‚è¦æ”¹å˜åˆ—表内部 的值,è§ä¸‹ |list-modification|。 å­åˆ—表 列表的一部分å¯ä»¥é€šè¿‡æŒ‡å®šé¦–末两个索引获得,方括å·å†…以冒å·åˆ†éš”两者: :let shortlist = mylist[2:-1] " 得到列表 [3, "four"] 首索引的çœç•¥ç±»ä¼¼äºŽç”¨ 0。末索引的çœç•¥ç±»ä¼¼äºŽç”¨ -1。 :let endlist = mylist[2:] " 从项目 2 到结æŸ: [3, "four"] :let shortlist = mylist[2:2] " å•个项目的列表: [3] :let otherlist = mylist[:] " å¤åˆ¶åˆ—表 å¦‚æžœé¦–ç´¢å¼•åœ¨åˆ—è¡¨æœ«é¡¹ä¹‹åŽæˆ–者末索引å°äºŽé¦–索引,返回空列表。没有错误信æ¯ã€‚ 如果末索引大于等于列表的长度,使用列表长度å‡ä¸€: :let mylist = [0, 1, 2, 3] :echo mylist[2:8] " 返回: [2, 3] 注æ„: mylist[s:e] æ„味ç€ç”¨å˜é‡ "s:e" 作为索引。在 ":" 之å‰ç”¨å•个字æ¯ä½œä¸ºå˜é‡è¦ å°å¿ƒã€‚需è¦çš„è¯åŠ ä¸Šç©ºæ ¼: mylist[s : e]。 列表åŒä¸€ *list-identity* 如果å˜é‡ "aa" 是列表,把它赋给å¦ä¸€ä¸ªå˜é‡ "bb" åŽï¼Œä¸¤ä¸ªå˜é‡æŒ‡å‘åŒä¸€åˆ—表。因此, 对列表 "aa" çš„ä¿®æ”¹ä¹ŸåŒæ—¶ä¿®æ”¹äº† "bb": :let aa = [1, 2, 3] :let bb = aa :call add(aa, 4) :echo bb [1, 2, 3, 4] |copy()| 函数å¯ä»¥å¤åˆ¶åˆ—表。如上所述,用 [:] 也å¯ã€‚è¿™ç§æ–¹å¼å»ºç«‹åˆ—表的浅备份: 改 å˜åˆ—表中的列表项目ä»ç„¶ä¼šä¿®æ”¹å¤åˆ¶åˆ—表的相应项目: :let aa = [[1, 'a'], 2, 3] :let bb = copy(aa) :call add(aa, 4) :let aa[0][1] = 'aaa' :echo aa [[1, aaa], 2, 3, 4] :echo bb [[1, aaa], 2, 3] è¦å»ºç«‹ä¸€ä¸ªå®Œå…¨ç‹¬ç«‹çš„列表,用 |deepcopy()|。它递归地建立列表值的备份。最深å¯è¾¾ 100 层。 å¯ç”¨æ“作符 "is" 检查两个å˜é‡æ˜¯å¦æŒ‡å‘åŒä¸€ä¸ªåˆ—表。"isnot" 刚好相å。与此对照, "==" 比较两个列表的值是å¦ç›¸åŒã€‚ :let alist = [1, 2, 3] :let blist = [1, 2, 3] :echo alist is blist 0 :echo alist == blist 1 比较列表时 注æ„: 如果长度相åŒï¼Œæ‰€æœ‰é¡¹ç›®ç”¨ "==" 的比较的结果也相åŒï¼Œä¸¤ä¸ªåˆ—表就 认为相åŒã€‚有一个例外: 数值和字符串总被认为ä¸ç›¸åŒã€‚这里ä¸è¿›è¡Œè‡ªåŠ¨ç±»åž‹è½¬æ¢ï¼Œè€Œåœ¨ å˜é‡é—´ç›´æŽ¥ç”¨ "==" å´ä¸æ˜¯å¦‚此。例如: echo 4 == "4" 1 echo [4] == ["4"] 0 å› æ­¤å¯ä»¥è¯´ï¼Œåˆ—è¡¨çš„æ¯”è¾ƒæ¯”æ•°å€¼å’Œå­—ç¬¦ä¸²çš„æ¯”è¾ƒæ›´ä¸¥æ ¼ã€‚ä½ åŒæ ·å¯ä»¥ç”¨è¿™ç§æ–¹å¼æ¯”è¾ƒç®€å• ç±»åž‹çš„å€¼ï¼ŒæŠŠå®ƒä»¬æ”¾åˆ°å­—ç¬¦ä¸² (译者注: 方括å·ï¼Ÿ) 里就行了: :let a = 5 :let b = "5" echo a == b 1 echo [a] == [b] 0 列表解包 è¦ç»™åˆ—è¡¨é¡¹ç›®è§£åŒ…ï¼Œå³æŠŠå®ƒä»¬åˆ†åˆ«å­˜å…¥å•独的å˜é‡ï¼Œç”¨æ–¹æ‹¬å·æŠŠå˜é‡æ‹¬èµ·æ¥ï¼Œå¦‚åŒæŠŠå®ƒä»¬ 当作列表项目: :let [var1, var2] = mylist 如果å˜é‡å’Œåˆ—表的项目数é‡ä¸åŒï¼ŒæŠ¥é”™ã€‚è¦å¤„ç†åˆ—表中所有é¢å¤–的项目,加上 ";" å’Œå• ä¸ªå˜é‡: :let [var1, var2; rest] = mylist 它的工作方å¼å°±åƒ: :let var1 = mylist[0] :let var2 = mylist[1] :let rest = mylist[2:] å¦‚æžœåªæœ‰ä¸¤ä¸ªé¡¹ç›®ï¼Œä¸ä¼šæŠ¥é”™ã€‚这时 "rest" æˆä¸ºç©ºè¡¨ã€‚ 列表修改 *list-modification* è¦ä¿®æ”¹åˆ—表的指定项目,用 |:let|: :let list[4] = "four" :let listlist[0][3] = item è¦ä¿®æ”¹åˆ—表的一部分,å¯ä»¥æŒ‡å®šè¦ä¿®æ”¹çš„首末项目。æä¾›çš„值的个数必须ä¸å°‘于该范围内 的项目数: :let list[3:5] = [3, 4, 5] 给列表增加和删除项目å¯ä»¥é€šè¿‡å‡½æ•°å®Œæˆã€‚一些例å­å¦‚下: :call insert(list, 'a') " 在最å‰é¢æ’å…¥ 'a' :call insert(list, 'a', 3) " 在 list[3] 剿’入项目 'a' :call add(list, "new") " 在最åŽé™„加字符串项目 :call add(list, [1, 2]) " 在最åŽé™„加新的列表项目 :call extend(list, [1, 2]) " åœ¨æœ€åŽæ‰©å±•列表,使之多包å«ä¸¤ä¸ªé¡¹ç›® :let i = remove(list, 3) " 删除项目 3 :unlet list[3] " åŒä¸Š :let l = remove(list, 3, -1) " 从项目 3 åˆ é™¤åˆ°æœ€åŽ :unlet list[3 : ] " åŒä¸Š :call filter(list, 'v:val !~ "x"') " 删除有 'x' 的项目 改å˜åˆ—表项目的顺åº: :call sort(list) " 按字æ¯ç»™åˆ—è¡¨æŽ’åº :call reverse(list) " åè½¬é¡¹ç›®çš„é¡ºåº For 循环 |:for| 循环为æ¯ä¸ªåˆ—表项目执行命令。一个å˜é‡è¢«ä¾æ¬¡è®¾ä¸ºæ¯ä¸ªåˆ—表项目。例如: :for item in mylist : call Doit(item) :endfor 它的工作方å¼å°±åƒ: :let index = 0 :while index < len(mylist) : let item = mylist[index] : :call Doit(item) : let index = index + 1 :endwhile æ³¨æ„ æ‰€æœ‰åˆ—è¡¨é¡¹ç›®å¿…é¡»æ˜¯ç›¸åŒç±»åž‹ï¼Œä¸ç„¶ä¼šæŠ¥é”™ |E706|。è¦é¿å…这一点,在循环尾部 |:unlet| 该å˜é‡ã€‚ å¦‚æžœä½ åªæ˜¯æƒ³è¦ä¿®æ”¹æ¯ä¸ªåˆ—表项目,|map()| 函数比 for 循环简å•得多。 å°±åƒ |:let| 命令,|:for| 也å¯ä»¥æŽ¥å—å˜é‡çš„列表。这需è¦å‚数是列表的列表。 :for [lnum, col] in [[1, 3], [2, 8], [3, 0]] : call Doit(lnum, col) :endfor 这就åƒå¯¹åˆ—表的æ¯ä¸ªé¡¹ç›®ä½¿ç”¨äº† |:let| 命令。é‡å¤ä¸€æ¬¡ï¼Œç±»åž‹å¿…须相åŒï¼Œå¦åˆ™ä¼šæŠ¥é”™ã€‚ 也å¯ä»¥ç”¨å˜é‡ä¿å­˜åˆ—表å˜é‡çš„其余项目: :for [i, j; rest] in listlist : call Doit(i, j) : if !empty(rest) : echo "remainder: " . string(rest) : endif :endfor 列表的相关函数 *E714* å¯ç”¨äºŽåˆ—表的函数: :let r = call(funcname, list) " è°ƒç”¨å¸¦å‚æ•°åˆ—表的函数 :if empty(list) " 检查 list 是å¦ä¸ºç©º :let l = len(list) " list é¡¹ç›®çš„æ•°é‡ :let big = max(list) " list 项目的最大值 :let small = min(list) " list 项目的最å°å€¼ :let xs = count(list, 'x') " 计算 list 里 'x' 出现的次数 :let i = index(list, 'x') " list 第一个 'x' çš„ä½ç½® :let lines = getline(1, 10) " 得到缓冲区å行文本行 :call append('$', lines) " 附加若干文本行到缓冲区尾部 :let list = split("a b c") " 用字符串中的项目建立列表 :let string = join(list, ', ') " 用 list 项目构造字符串 :let s = string(list) " list 的字符串表示 :call map(list, '">> " . v:val') " 在æ¯ä¸ªé¡¹ç›®å‰åŠ ä¸Š ">> " ä¸è¦å¿˜è®°ç»„åˆä½¿ç”¨ä¸åŒåŠŸèƒ½å¯ä»¥ç®€åŒ–任务。例如,è¦è®¡ç®—列表中所有数值的总和: :exe 'let sum = ' . join(nrlist, '+') 1.4 å­—å…¸ *Dictionaries* *Dictionary* å­—å…¸æ˜¯å…³è”æ•°ç»„: æ¯ä¸ªé¡¹ç›®æœ‰ä¸€ä¸ªé”®å’Œä¸€ä¸ªå€¼ã€‚用键å¯ä»¥å®šä½é¡¹ç›®ï¼Œè€Œé¡¹ç›®çš„存储ä¸èƒ½ç¡® 定任何特定顺åºã€‚ 字典建立 *E720* *E721* *E722* *E723* 字典通过花括å·é‡Œé€—å·åˆ†éš”的项目列表建立。æ¯ä¸ªé¡¹ç›®åŒ…å«ä»¥å†’å·åˆ†éš”的键和值。一个键 åªèƒ½å‡ºçŽ°ä¸€æ¬¡ã€‚ä¾‹å¦‚: :let mydict = {1: 'one', 2: 'two', 3: 'three'} :let emptydict = {} *E713* *E716* *E717* 键必须是字符串。用数值也å¯ä»¥ï¼Œä½†å®ƒæ€»è¢«è‡ªåŠ¨è½¬æ¢ä¸ºå­—符串。所以字符串 '4' 和数值 4 总会找到相åŒçš„é¡¹ç›®ã€‚æ³¨æ„ å­—ç¬¦ä¸² '04' 和数值 04 是ä¸ä¸€æ ·çš„,因为åŽè€…è¢«è½¬æ¢æˆ 字符串 '4'。 值å¯ä»¥æ˜¯ä»»ä½•表达å¼ã€‚如果值本身是字典,就å¯ä»¥å»ºç«‹åµŒå¥—的字典: :let nestdict = {1: {11: 'a', 12: 'b'}, 2: {21: 'c'}} 忽略末项之åŽçš„逗å·ã€‚ 访问项目 常è§çš„è®¿é—®é¡¹ç›®çš„æ–¹å¼æ˜¯æŠŠé”®æ”¾å…¥æ–¹æ‹¬å·: :let val = mydict["one"] :let mydict["four"] = 4 ç”¨è¿™ç§æ–¹å¼å¯ä»¥ç»™å·²å­˜åœ¨çš„字典增加新项目,这和列表ä¸åŒã€‚ 如果键åªåŒ…å«å­—æ¯ã€æ•°å­—和下划线,å¯ä»¥ä½¿ç”¨å¦‚ä¸‹å½¢å¼ |expr-entry|: :let val = mydict.one :let mydict.four = 4 因为项目å¯ä»¥æ˜¯åŒ…括列表和字典的任何类型,你å¯ä»¥åå¤ä½¿ç”¨ç´¢å¼•和键进行访问: :echo dict.key[idx].key å­—å…¸åˆ°åˆ—è¡¨çš„è½¬æ¢ ä½ å¯ä»¥å¾ªçޝéåŽ†å­—å…¸çš„æ‰€æœ‰é¡¹ç›®ã€‚ä¸ºæ­¤ï¼Œä½ éœ€è¦æŠŠå­—å…¸è½¬ä¸ºåˆ—è¡¨ï¼Œç„¶åŽæŠŠå®ƒä¼ é€’ç»™ |:for|。 通常,你期望é历所有的键,用 |keys()| 函数就å¯ä»¥äº†: :for key in keys(mydict) : echo key . ': ' . mydict[key] :endfor 键列表没有ç»è¿‡æŽ’åºã€‚ä½ å¯èƒ½å¸Œæœ›å…ˆè¿›è¡ŒæŽ’åº: :for key in sort(keys(mydict)) è¦é历所有的值,用 |values()| 函数: :for v in values(mydict) : echo "value: " . v :endfor å¦‚æžœä½ æƒ³åŒæ—¶å¾—到键和值,用 |items()| 函数。它返回一个列表,其中æ¯ä¸ªé¡¹ç›®æ˜¯ä¸¤ä¸ª 项目的列表: 键和值: :for [key, value] in items(mydict) : echo key . ': ' . value :endfor å­—å…¸åŒä¸€ *dict-identity* å°±åƒåˆ—表那样,你需è¦ç”¨ |copy()| å’Œ |deepcopy()| æ¥æž„造字典的备份。å¦åˆ™ï¼Œèµ‹å€¼äº§ 生的结果会引用åŒä¸€ä¸ªå­—å…¸: :let onedict = {'a': 1, 'b': 2} :let adict = onedict :let adict['a'] = 11 :echo onedict['a'] 11 如果所有的键-值组对的比较结果相åŒï¼Œä¸¤ä¸ªå­—典比较的结果也相åŒã€‚è¯¦æƒ…è§ |list-identity|。 字典修改 *dict-modification* è¦ä¿®æ”¹å­—典已ç»å­˜åœ¨çš„项目或者增加新的项目,用 |:let|: :let dict[4] = "four" :let dict['one'] = item 从字典里删除项目å¯ä»¥é€šè¿‡ |remove()| 或 |:unlet| 完æˆã€‚ 从 dict 里删除键 "aaa" çš„é¡¹ç›®æœ‰ä¸‰ç§æ–¹æ³•: :let i = remove(dict, 'aaa') :unlet dict.aaa :unlet dict['aaa'] 两个字典的åˆå¹¶å¯ä»¥ç”¨ |extend()|: :call extend(adict, bdict) 这使得 adict 得到扩展,加入所有的 bdict 项目。对于é‡å¤çš„键,adict 项目被覆盖。 å¯é€‰çš„ç¬¬ä¸‰ä¸ªå‚æ•°å¯ä»¥æ”¹å˜è¿™ä¸€ç‚¹ã€‚ æ³¨æ„ è¿™ä¸å½±å“字典项目的顺åºï¼Œä¸è¦å¸Œæœ› ":echo adict" 会先显示原有 adict 项目, ç„¶åŽå†æ˜¾ç¤º bdict 的项目。 从字典里删除多个项目å¯ä»¥ç”¨ |filter()| 完æˆ: :call filter(dict, 'v:val =~ "x"') 删除 "dict" 里所有值ä¸åŒ¹é… "x" 的项目。 字典函数 *Dictionary-function* *self* *E725* 定义函数时,如果带有 "dict" 属性,å¯ä»¥ä»¥ä¸€ç§ç‰¹æ®Šæ–¹å¼ä½¿ç”¨å­—典。例如: :function Mylen() dict : return len(self.data) :endfunction :let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")} :echo mydict.len() 这类似于é¢å‘对象编程的方法。字典项目用作 |Funcref|。局部å˜é‡ "self" 引用函数所 在的字典。 字典里也å¯ä»¥åŠ å…¥æŒ‡å‘æ²¡æœ‰ "dict" 属性的函数的函数引用,ä¸è¿‡è¿™æ—¶æ— æ³•使用 "self" å˜é‡ã€‚ *numbered-function* *anonymous-function* è¦é¿å…é¢å¤–的函数å,å¯ä»¥å®šä¹‰æ—¶ç›´æŽ¥èµ‹ç»™å­—å…¸: :let mydict = {'data': [0, 1, 2, 3]} :function mydict.len() dict : return len(self.data) :endfunction :echo mydict.len() 该函数会得到一个编å·ï¼Œè€Œ dict.len çš„å€¼æ˜¯æŒ‡å‘æ­¤å‡½æ•°çš„ |Funcref|。该函数åªèƒ½é€šè¿‡ |Funcref| 访问。如果没有任何 |Funcref| 引用,它会被自动删除。 ç¼–å·å‡½æ•°ä¸ä¸€å®šè¦æœ‰ "dict" 属性。 字典相关函数 *E715* å¯ä»¥ç”¨äºŽå­—典的函数: :if has_key(dict, 'foo') " 如果 dict 有带 "foo" 键的项目则为真 :if empty(dict) " 如果 dict 为空则为真 :let l = len(dict) " dict é¡¹ç›®çš„æ•°é‡ :let big = max(dict) " dict 项目的最大值 :let small = min(dict) " dict 项目的最å°å€¼ :let xs = count(dict, 'x') " 统计 dict 里 'x' 出现的数目 :let s = string(dict) " dict 的字符串表示 :call map(dict, '">> " . v:val') " 在æ¯ä¸ªé¡¹ç›®å‰åŠ ä¸Š ">> " 1.5 å˜é‡çš„æ›´å¤šç»†èŠ‚ *more-variables* 如果你需è¦çŸ¥é“å˜é‡æˆ–表达å¼çš„类型,使用 |type()| 函数。 如果 'viminfo' é€‰é¡¹åŒ…å« '!' 标志ä½ï¼Œå¤§å†™å¼€å¤´ä¸”ä¸åŒ…å«å°å†™å­—æ¯çš„全局å˜é‡è¢«ä¿å­˜åœ¨ viminfo 文件里 |viminfo-file|。 如果 'sessionoptions' é€‰é¡¹åŒ…å« "global",大写开头且包å«è‡³å°‘一个å°å†™å­—æ¯çš„全局 å˜é‡è¢«ä¿å­˜åœ¨ä¼šè¯æ–‡ä»¶é‡Œ |session-file|。 å˜é‡å å¯ä»¥ä¿å­˜çš„ä½ç½® my_var_6 æ—  My_Var_6 ä¼šè¯æ–‡ä»¶ MY_VAR_6 viminfo 文件 å¯ä»¥ä½¿ç”¨èŠ±æ‹¬å·æ¥æž„造å˜é‡åï¼Œè§ |curly-braces-names|。

2. 表达å¼è¯­æ³• *expression-syntax*

表达å¼è¯­æ³•å°ç»“,优先级从低到高排列: |expr1| expr2 ? expr1 : expr1 if-then-else |expr2| expr3 || expr3 .. 逻辑或 |expr3| expr4 && expr4 .. 逻辑与 |expr4| expr5 == expr5 等于 expr5 != expr5 ä¸ç­‰äºŽ expr5 > expr5 大于 expr5 >= expr5 大于等于 expr5 < expr5 å°äºŽ expr5 <= expr5 å°äºŽç­‰äºŽ expr5 =~ expr5 åŒ¹é…æ­£è§„è¡¨è¾¾å¼ expr5 !~ expr5 ä¸åŒ¹é…æ­£è§„è¡¨è¾¾å¼ expr5 ==? expr5 等于,忽略大å°å†™ expr5 ==# expr5 等于,匹é…大å°å†™ 等等 如上,? 忽略大å°å†™ï¼Œ# 则匹é…之 expr5 is expr5 相åŒçš„ |List| 实例 expr5 isnot expr5 ä¸åŒçš„ |List| 实例 |expr5| expr6 + expr6 .. 数值加法或列表连接 expr6 - expr6 .. æ•°å€¼å‡æ³• expr6 . expr6 .. 字符串连接 |expr6| expr7 * expr7 .. 数值乘法 expr7 / expr7 .. 数值除法 expr7 % expr7 .. 数值求余 |expr7| ! expr7 é€»è¾‘éž - expr7 ä¸€å…ƒå‡æ³•: å–å + expr7 一元加法: 原值 |expr8| expr8[expr1] 字符串里的字节或者 |List| 的项目 expr8[expr1 : expr1] 字符串å­ä¸²æˆ– |List| çš„å­åˆ—表 expr8.name |Dictionary| 的项目 expr8(expr1, ...) 使用 |Funcref| å˜é‡çš„函数调用 |expr9| number 数值常数 "string" å­—ç¬¦ä¸²å¸¸æ•°ï¼Œåæ–œæ æœ‰ç‰¹æ®Šå«ä¹‰ 'string' 字符串常数,' åŠ å€ [expr1, ...] |List| {expr1: expr1, ...} |Dictionary| &option 选项值 (expr1) åµŒå¥—è¡¨è¾¾å¼ variable 内部å˜é‡ va{ria}ble 带花括å·çš„内部å˜é‡ $VAR 环境å˜é‡ @r 寄存器 'r' 的值 function(expr1, ...) 函数调用 func{ti}on(expr1, ...) 带花括å·çš„函数调用 ".." 标明这一层上的æ“作å¯ä»¥è¿žæŽ¥ã€‚比如: &nu || &list && &shell == "csh" åŒä¸€å±‚的表达å¼ä»Žå·¦åˆ°å³è¿›è¡Œåˆ†æžã€‚ expr1 *expr1* *E109*


expr2 ? expr1 : expr1

'?' 之å‰çš„表达å¼ä½œä¸ºæ•°å€¼æ±‚值。如果结果éžé›¶ï¼Œæœ€ç»ˆçš„结果是 '?' å’Œ ':' 之间的表达
å¼çš„值,ä¸ç„¶æœ€ç»ˆçš„结果是 ':' 之åŽçš„表达å¼çš„值。例如:
        :echo lnum == 1 ? "top" : lnum

å› ä¸ºç¬¬ä¸€ä¸ªè¡¨è¾¾å¼æ˜¯ "expr2",它ä¸èƒ½åŒ…å«å¦ä¸€ä¸ª ?:。å¦å¤–两个表达å¼åˆ™æ²¡æœ‰è¿™ä¸ªé™
制,从而使得递归使用 ?: æˆä¸ºå¯èƒ½ã€‚例如:
        :echo lnum == 1 ? "top" : lnum == 1000 ? "last" : lnum

è¦ä½¿ä¹‹å¯è¯»ï¼Œå»ºè®®ä½¿ç”¨ç»­è¡Œç¬¦ |line-continuation|:
        :echo lnum == 1
        :\      ? "top"
        :\      : lnum == 1000
        :\              ? "last"
        :\              : lnum

在 ':' å‰ï¼Œä½ æ€»æ˜¯åº”该加上空格,å¦åˆ™å®ƒå¯èƒ½è¢«é”™è¯¯ç”¨åœ¨å¦‚ "a:1" 这样的å˜é‡é‡Œã€‚


expr2 和 expr3                                          *expr2* *expr3*


                                        *expr-barbar* *expr-&&*
"||" å’Œ "&&" æ“作符左å³ä¸¤è¾¹å„接å—ä¸€ä¸ªå‚æ•°ã€‚傿•°æ˜¯ (或转化为) 数值。è¿ç®—结果是:

         输入                            输出 
n1              n2              n1 || n2        n1 && n2 
é›¶              é›¶              é›¶              é›¶
é›¶              éžé›¶            éžé›¶            é›¶
éžé›¶            é›¶              éžé›¶            é›¶
éžé›¶            éžé›¶            éžé›¶            éžé›¶

æ“作符å¯ä»¥è¿žæŽ¥ã€‚比如:

        &nu || &list && &shell == "csh"

æ³¨æ„ "&&" 比 "||" 优先级高,所以这等价于:

        &nu || (&list && &shell == "csh")

一旦结果å¯ä»¥ç¡®å®šï¼Œè¡¨è¾¾å¼ä½¿ç”¨ "短路" 计算,也就是,ä¸å†è®¡ç®—åŽé¢çš„傿•°ï¼Œè¿™å’Œ C
的情形类似。比如:

        let a = 1
        echo a || b

è¿™æ˜¯åˆæ³•的,å³ä½¿æ²¡æœ‰å« "b" çš„å˜é‡ä¹Ÿæ˜¯å¦‚此。因为 "a" å·²ç»æ˜¯éžé›¶å€¼ï¼Œç»“果必然是éž
零。下é¢çš„æƒ…形类似:

        echo exists("b") && b == "yes"

无论 "b" 定义与å¦ï¼Œè¿™æ˜¯åˆæ³•的。第二个å­å¥åªæœ‰åœ¨ "b" 定义的时候æ‰ä¼šè¢«è®¡ç®—。


expr4                                                   *expr4*


expr5 {cmp} expr5

比较两个 expr 表达å¼ï¼Œå¦‚果结果为å‡ï¼Œè¿”回 0,如果结果为真,返回 1。

                        *expr-==*  *expr-!=*  *expr->*   *expr->=*
                        *expr-<*   *expr-<=*  *expr-=~*  *expr-!~*
                        *expr-==#* *expr-!=#* *expr->#*  *expr->=#*
                        *expr-<#*  *expr-<=#* *expr-=~#* *expr-!~#*
                        *expr-==?* *expr-!=?* *expr->?*  *expr->=?*
                        *expr-<?*  *expr-<=?* *expr-=~?* *expr-!~?*
                        *expr-is*
                使用 'ignorecase'    匹é…大å°å†™     忽略大å°å†™ 
等于                    ==              ==#             ==?
ä¸ç­‰äºŽ                  !=              !=#             !=?
大于                    >               >#              >?
大于等于                >=              >=#             >=?
å°äºŽ                    <               <#              <?
å°äºŽç­‰äºŽ                <=              <=#             <=?
åŒ¹é…æ­£è§„è¡¨è¾¾å¼          =~              =~#             =~?
ä¸åŒ¹é…æ­£è§„è¡¨è¾¾å¼        !~              !~#             !~?
相åŒå®žä¾‹                is
ä¸åŒå®žä¾‹                isnot

示例:
"abc" ==# "Abc"   结果为 0
"abc" ==? "Abc"   结果为 1
"abc" == "Abc"    如果置ä½äº† 'ignorecase',结果为 1,ä¸ç„¶ç»“果为 0

                                                        *E691* *E692*
|List| åªèƒ½å’Œ |List| 比较,而且åªèƒ½ç”¨ "等于"ã€"ä¸ç­‰äºŽ" å’Œ "is"。比较针对列表的
值,递归进行。忽略大å°å†™æ„å‘³ç€æ¯”较项目的值时忽略大å°å†™ã€‚

                                                        *E735* *E736*
|Dictionary| åªèƒ½å’Œ |Dictionary| 比较,而且åªèƒ½ç”¨ "等于"ã€"ä¸ç­‰äºŽ" å’Œ "is"。比
较针对 |Dictionary| 的键/值,递归进行。忽略大å°å†™æ„å‘³ç€æ¯”较项目的值时忽略大å°
写。

                                                        *E693* *E694*
|Funcref| åªèƒ½å’Œ |Funcref| 比较,而且åªèƒ½ç”¨ "等于" å’Œ "ä¸ç­‰äºŽ"。这里永ä¸å¿½ç•¥å¤§
å°å†™ã€‚

|List| 用 "is" 或 "isnot" æ—¶ï¼Œæ£€æŸ¥è¡¨è¾¾å¼æ˜¯å¦æŒ‡å‘åŒä¸€ä¸ª |List| 实例。|List| çš„
备份和原æ¥çš„ |List| ä¸åŒã€‚å¦‚æžœä¸æ˜¯ |List|,用 "is" 等价于用 "等于",而 "isnot"
等价于 "ä¸ç­‰äºŽ",有一点区别: ä¸åŒçš„类型总认为有ä¸åŒçš„值。"4 == '4'" 为真,而
"4 is '4'" 为å‡ã€‚

å¦‚æžœæ¯”è¾ƒå­—ç¬¦ä¸²å’Œæ•°å€¼ï¼Œå­—ç¬¦ä¸²è¢«è½¬åŒ–æˆæ•°å€¼ï¼Œè€Œæ¯”较是在数值之间进行的。这æ„味ç€
"0 == 'x'" 为真,因为 'x' è¢«è½¬åŒ–æˆæ•°å€¼ 0。

如果比较两个字符串,使用 strcmp() 或 stricmp()。因而,比较的是数学上的差异 (比
较字节ç ),而ä¸å¿…然是本地语言的字æ¯çš„差异。

如果æ“作符åŽå¸¦ä¸Š '#',或者 'ignorecase' 关闭时使用无 '#' 的版本时,比较使用
strcmp(): 大å°å†™ç›¸å…³ã€‚

如果æ“作符åŽå¸¦ä¸Š '?',或者 'ignorecase' 打开时使用无 '?' 的版本时,比较使用
stricmp(): 大å°å†™æ— å…³ã€‚

这里 'smartcase' ä¸é€‚用。

"=~" å’Œ "!~" æ“作符使用å³è¾¹çš„傿•°ä½œä¸ºæ¨¡å¼æ¥åŒ¹é…å·¦è¾¹çš„å‚æ•°ã€‚模å¼çš„定义è§
|pattern|。匹é…进行时,总是å‡è®¾ç½®ä½äº† 'magic' 并且 'cpoptions' 为空,无论
'magic' 或 'cpoptions' 实际的值为何。这使得脚本å¯ç§»æ¤ã€‚è¦é¿å…在正规表达å¼é‡Œä½¿
ç”¨çš„åæ–œæ éœ€è¦åŠ å€çš„问题,å¯ä»¥ä½¿ç”¨å•引å·çš„å­—ç¬¦ä¸²ï¼Œè§ |literal-string|。
既然字符串å‡å®šä¸ºå•è¡Œï¼Œå¤šè¡Œçš„æ¨¡å¼ (åŒ…å« \n,å³åæ–œæ -n) ä¸ä¼šè¢«åŒ¹é…。ä¸è¿‡ï¼ŒæŒ‰æœ¬
义出现的å•个 NL 字符å¯ä»¥åƒæ™®é€šå­—符一样匹é…。比如:
        "foo\nbar" =~ "\n"      结果为 1
        "foo\nbar" =~ "\\n"     结果为 0


expr5 和 expr6                                          *expr5* *expr6*

expr6 +  expr6 ..       数值加法或 |List| 连接                  *expr-+*
expr6 -  expr6 ..       æ•°å€¼å‡æ³•                                *expr--*
expr6 .  expr6 ..       字符串连接                              *expr-.*

|Lists| åªèƒ½ç”¨ "+",而且两个 expr6 必须都是列表。返回两者连接以åŽçš„æ–°åˆ—表。

expr7 *  expr7 ..       数值乘法                                *expr-star*
expr7 /  expr7 ..       数值除法                                *expr-/*
expr7 %  expr7 ..       数值求余                                *expr-%*

除了 "." 以外,这里所有的æ“ä½œéƒ½æŠŠå­—ç¬¦ä¸²è½¬åŒ–æˆæ•°å€¼ã€‚

æ³¨æ„ "+" å’Œ "." 的差异:
        "123" + "456" = 579
        "123" . "456" = "123456"

如果 '/' çš„å³è¾¹ä¸ºé›¶ï¼Œç»“果为 0x7fffffff。
如果 '%' çš„å³è¾¹ä¸ºé›¶ï¼Œç»“果为 0。

这里没有能用于 |Funcref| çš„æ“作。


expr7                                                   *expr7*

! expr7                 é€»è¾‘éž                  *expr-!*
- expr7                 ä¸€å…ƒå‡æ³•: å–å          *expr-unary--*
+ expr7                 一元加法: 原值          *expr-unary-+*

'!' 把éžé›¶å˜ä¸ºé›¶ï¼Œé›¶å˜ä¸º 1。
'-' æ”¹å˜æ•°å€¼çš„符å·ã€‚
'+' ä¿æŒåŽŸå€¼ã€‚

字符串会先转化为数值。

å¯ä»¥é‡å¤å’Œæ··åˆè¿™ä¸‰ç§è¿ç®—。例如:
        !-1         == 0
        !!8         == 1
        --9         == 9


expr8                                                   *expr8*

expr8[expr1]            字符串或 |List| 的项目          *expr-[]* *E111*

如果 expr8 æ˜¯æ•°å€¼æˆ–å­—ç¬¦ä¸²ï¼Œç»“æžœæ˜¯å­—ç¬¦ä¸²ï¼ŒåŒ…å« expr8 里第 expr1 个字节。expr8
视作字符串,expr1 è§†ä½œæ•°å€¼ã€‚æ³¨æ„ è¿™é‡Œä¸è¯†åˆ«å¤šå­—节编ç ã€‚

索引 0 给出第一个字符。这和 C ç±»åŒã€‚è¦å°å¿ƒ: 文本列å·å¯æ˜¯ä»Ž 1 开始的ï¼ä¾‹å¦‚,è¦
得到光标所在的字符:
        :let c = getline(line("."))[col(".") - 1]

如果字符串的长度å°äºŽç´¢å¼•值,结果为空字符串。负索引总是给出空字符串 (原因: åå‘
兼容)。用 [-1:] 得到最åŽä¸€ä¸ªå­—节。

如果 expr8 是 |List|,返回索引值为 expr1 的项目。å¯ç”¨çš„ç´¢å¼•å€¼è§ |list-index|。
如果索引越界,产生错误。例如:
        :let item = mylist[-1]          " 得到最åŽä¸€ä¸ªé¡¹ç›®

一般的,如果 |List| 索引大于等于 |List| 的长度,或者比 |List| 的长度更负,产生
错误。


expr8[expr1a : expr1b]  å­å­—符串或å­åˆ—表                *expr-[:]*

如果 expr8 是数值或字符串,结果是å­å­—符串,包å«ç¬¬ expr1a 到第 expr1b (包å«) 个
字节。expr8 视作字符串,expr1a å’Œ expr1b è§†ä½œæ•°å€¼ã€‚æ³¨æ„ è¿™é‡Œä¸è¯†åˆ«å¤šå­—节编ç ã€‚

如果çœç•¥ expr1a,用零。如果çœç•¥ expr1b,用字符串的长度å‡ä¸€ã€‚

å¯ä»¥ç”¨è´Ÿæ•°æ¥ä»Žå­—符串尾部开始计算ä½ç½®ã€‚-1 代表最åŽä¸€ä¸ªå­—符,-2 å€’æ•°ç¬¬äºŒä¸ªï¼Œä¾æ­¤
类推。

如果索引越界,忽略这些字符。如果 expr1b å°äºŽ expr1a,结果是空字符串。

例如:
        :let c = name[-1:]              " 字符串最åŽä¸€ä¸ªå­—节
        :let c = name[-2:-2]            " 字符串倒数第二个字节
        :let s = line(".")[4:]          " 从第五个字节到最åŽ
        :let s = s[:-3]                 " 删除最åŽä¸¤ä¸ªå­—节

如果 expr8 是 |List|,结果是新的 |List|ï¼ŒåŒ…å« expr1 å’Œ expr1b 索引指定的项目。
å’Œä¸Šé¢æè¿°çš„å­—ç¬¦ä¸²æƒ…å½¢ç±»ä¼¼ï¼Œé™¤äº†è¶Šç•Œçš„ç´¢å¼•ä¼šæŠ¥é”™ä»¥å¤–ã€‚ä¾‹å¦‚:
        :let l = mylist[:3]             " å‰å››ä¸ªé¡¹ç›®
        :let l = mylist[4:4]            " å•个项目的列表
        :let l = mylist[:]              " 列表的浅备份

在 |Funcref| 上用 expr8[expr1] 或 expr8[expr1a : expr1b] 出错。


expr8.name              |Dictionary| 的项目             *expr-entry*

如果 expr8 是一个 |Dictionary| 且åŽè·Ÿå¥å·å†è·Ÿä¸€ä¸ªå字,该å字用作 |Dictionary|
的键。这相当于: expr8[name]。

该åå­—å¿…é¡»ç”±å­—æ¯æ•°å­—字符组æˆã€‚这和å˜é‡å一样,ä¸è¿‡è¿™é‡Œå¯ä»¥ç”¨æ•°å­—开始。但ä¸èƒ½ç”¨
花括å·ã€‚

å¥å·å‰åŽä¸èƒ½ç”¨ç©ºç™½ã€‚

例如:
        :let dict = {"one": 1, 2: "two"}
        :echo dict.one
        :echo dict .2

æ³¨æ„ å¥å·ä¹Ÿç”¨äºŽå­—符串连接。è¦é¿å…混淆,用于字符串连接的å¥å·å‰åŽåŠ ä¸Šç©ºç™½ã€‚


expr8(expr1, ...)       |Funcref| 函数调用

如果 expr8 是 |Funcref| 类型的å˜é‡ï¼Œè°ƒç”¨å®ƒæŒ‡å‘的函数。



                                                *expr9*
number

number                  数值常数                *expr-number*

å进制ã€å六进制 (0x 或 0X 开始)ã€æˆ–八进制 (0 开始)。


string                                                  *expr-string* *E114*

"string"                字符串常数              *expr-quote*

æ³¨æ„ ä½¿ç”¨çš„æ˜¯åŒå¼•å·ã€‚

字符串常数接å—以下特殊字符:
\...    三ä½å…«è¿›åˆ¶æ•° (例如,"\316")
\..     两ä½å…«è¿›åˆ¶æ•° (å¿…é¡»åŽè·Ÿéžæ•°å­—)
\.      一ä½å…«è¿›åˆ¶æ•° (å¿…é¡»åŽè·Ÿéžæ•°å­—)
\x..    两ä½å六进制数指定的字节 (例如,"\x1f")
\x.     一ä½å六进制数指定的字节 (å¿…é¡»åŽè·Ÿéžå六进制数字)
\X..    ç­‰åŒäºŽ \x..
\X.     ç­‰åŒäºŽ \x.
\u....  å››ä½åå…­è¿›åˆ¶æŒ‡å®šçš„å­—ç¬¦ã€‚æ ¹æ® 'encoding' 的当å‰å€¼å†³å®šçš„ç¼–ç è¿›è¡Œå­˜è´® (例
        如,"\u02a4")
\U....  ç­‰åŒäºŽ \u.....
\b      退格 <BS>
\e      escape <Esc>
\f      æ¢é¡µ <FF>
\n      æ¢è¡Œ <NL>
\r      回车 <CR>
\t      制表 <Tab>
\\      åæ–œæ 
\"      åŒå¼•å·
\<xxx>  "xxx" 命å的特殊字符,例如 "\<C-W>" 代表 CTRL-W。

æ³¨æ„ "\xff" ä¿å­˜ä¸ºå­—节 255,在æŸäº›ç¼–ç ä¸­å®ƒæ˜¯ä¸åˆæ³•的。使用 "\u00ff" å¯ä»¥æŒ‰ç…§
'encoding' 的当å‰å€¼ä¿å­˜å­—符 255。

æ³¨æ„ "\000" å’Œ "\x00" 强制字符串结æŸã€‚


literal-string                                          *literal-string* *E115*

'string'                字符串常数                      *expr-'*

æ³¨æ„ ä½¿ç”¨çš„æ˜¯å•引å·ã€‚

字符串这里按原义出现。ä¸åŽ»æŽ‰åæ–œæ ï¼Œå®ƒä¹Ÿæ²¡æœ‰ç‰¹æ®Šå«ä¹‰ã€‚唯一的特例是两个å•引å·ä»£
表一个å•引å·ã€‚

å•引å·å­—符串有助于模å¼çš„ä½¿ç”¨ï¼Œå› ä¸ºåæ–œæ ä¸å†éœ€è¦åŠ å€ã€‚以下两个命令等价:
        if a =~ "\\s*"
        if a =~ '\s*'


option                                          *expr-option* *E112* *E113*

&option                 选项值,如有存在,使用局部值
&g:option               全局选项值
&l:option               局部选项值

例如:
        echo "tabstop is " . &tabstop
        if &insertmode

这里å¯ä»¥ä½¿ç”¨ä»»ä½•é€‰é¡¹å€¼ã€‚è§ |options|。如果指定è¦ä½¿ç”¨å±€éƒ¨å€¼ï¼Œä½†ä¸å­˜åœ¨å±€éƒ¨äºŽç¼“冲
区或局部于窗å£çš„选项,则还是使用全局值。


register                                                *expr-register* *@r*

@r                      寄存器 'r' 的值

结果是命å寄存器的内容,以å•个字符串表达。æ¢è¡Œç¬¦åœ¨éœ€è¦æ—¶ä¼šè¢«æ’入。è¦å¾—到无å寄
存器的内容,使用 @" 或 @@。å¯ç”¨å¯„存器的相关解释å¯è§ |registers|。

如果用 '=' 寄存器,你得到表达å¼è‡ªèº«ï¼Œè€Œä¸æ˜¯å®ƒè®¡ç®—的结果。用 |eval()| æ¥è¿›è¡Œè®¡
算。


nesting                                                 *expr-nesting* *E110*

(expr1)                 嵌套表达å¼


environment variable                                    *expr-env*

$VAR                    环境å˜é‡

任何环境å˜é‡çš„字符串值。如果该环境å˜é‡æ²¡æœ‰å®šä¹‰ï¼Œç»“果为空字符串。
                                                *expr-env-expand*
æ³¨æ„ ç›´æŽ¥ä½¿ç”¨ $VAR 和使用 expand("$VAR") 有区别。直接使用的形å¼åªèƒ½æ‰©å±•当å‰
Vim ä¼šè¯æ‰€çŸ¥çš„环境å˜é‡ã€‚使用 expand() 会先å°è¯•å½“å‰ Vim ä¼šè¯æ‰€çŸ¥çš„环境å˜é‡ï¼Œå¦‚
æžœä¸æˆåŠŸï¼Œåˆ™ä½¿ç”¨å¤–å£³æ‰©å±•è¯¥å˜é‡ã€‚è¿™ä¼šå˜æ…¢ï¼Œä½†å¯ä»¥ç”¨æ¥æ‰©å±•åªæœ‰å¤–壳知é“çš„å˜é‡ã€‚
例如:
        :echo $version
        :echo expand("$version")
å‰è€…å¯èƒ½ä¸ä¼šå›žæ˜¾ä»»ä½•内容,åŽè€…会回显 $version å˜é‡ (如果你的外壳支æŒçš„è¯)。


internal variable                                       *expr-variable*

variable                内部å˜é‡
è§ä¸‹é¢çš„ |internal-variables|。


function call           *expr-function* *E116* *E118* *E119* *E120*

function(expr1, ...)    函数调用
è§ä¸‹é¢çš„ |functions|。



3. 内部å˜é‡ *internal-variables* *E121*

*E461* 内部å˜é‡çš„å字由字æ¯ã€æ•°å­—å’Œ '_' 组æˆã€‚但ä¸èƒ½ç”±æ•°å­—开始。å¯ä»¥ä½¿ç”¨èŠ±æ‹¬å·ï¼Œè§ |curly-braces-names|。 内部å˜é‡é€šè¿‡ ":let" 命令建立 |:let|。 内部å˜é‡é€šè¿‡ ":unlet" 命令显å¼åˆ é™¤ |:unlet|。 使用éžå†…部å˜é‡çš„å字或引用已ç»åˆ é™¤çš„内部å˜é‡ä¼šäº§ç”Ÿé”™è¯¯ã€‚ å˜é‡æœ‰ä¸åŒçš„命å空间,根æ®é™„加的å‰ç¼€å†³å®š: (æ— ) 函数内: 局部于函数;å¦åˆ™: 全局 |buffer-variable| b: 局部于当å‰ç¼“冲区。 |window-variable| w: 局部于当å‰çª—å£ã€‚ |tabpage-variable| t: å±€éƒ¨äºŽå½“å‰æ ‡ç­¾é¡µã€‚ |global-variable| g: 全局。 |local-variable| l: 局部于函数。 |script-variable| s: 局部于 |:source| çš„ Vim 脚本。 |function-argument| a: å‡½æ•°å‚æ•° (åªé™äºŽå‡½æ•°å†…使用)。 |vim-variable| v: Vim 预定义的全局å˜é‡ã€‚ 作用域本身å¯ä»¥ç”¨ä½œ |Dictionary|。例如,è¦åˆ é™¤æ‰€æœ‰å±€éƒ¨äºŽè„šæœ¬çš„å˜é‡: :for k in keys(s:) : unlet s:[k] :endfor *buffer-variable* *b:var* "b:" 开头的å˜é‡å局部于当å‰ç¼“冲区。这样,你å¯ä»¥ä¸ºæ¯ä¸ªç¼“冲区定义ä¸åŒçš„ "b:foo" å˜é‡ã€‚è¿™ç§å˜é‡åœ¨ç¼“冲区被删除时 (:bwipeout 或 :bdelete |:bdelete|) åŒæ—¶è¢«åˆ é™¤ã€‚ 预定义了如下的缓冲区局部å˜é‡: *b:changedtick-variable* *changetick* b:changedtick 当å‰ç¼“å†²åŒºçš„æ”¹å˜æ¬¡æ•°ã€‚æ¯æ¬¡æ”¹å˜éƒ½ä¼šé€’增。撤销命令在此情形下也被 视作一次改å˜ã€‚è¿™å¯ç”¨æ¥åœ¨ç¼“冲区å‘ç”Ÿæ”¹å˜æ—¶æ‰§è¡Œä¸€äº›åŠ¨ä½œã€‚æ¯”å¦‚: :if my_changedtick != b:changedtick : let my_changedtick = b:changedtick : call My_Update() :endif *window-variable* *w:var* "w:" 开头的å˜é‡å局部于当å‰çª—å£ã€‚窗å£å…³é—­æ—¶è¢«åˆ é™¤ã€‚ *tabpage-variable* *t:var* "t" 开始的å˜é‡åå±€éƒ¨äºŽå½“å‰æ ‡ç­¾é¡µã€‚标签页关闭时,这些å˜é‡è¢«åˆ é™¤ã€‚{仅当编译时加 å…¥ +windows ç‰¹æ€§æ‰æœ‰æ•ˆ} *global-variable* *g:var* 函数内部,全局å˜é‡å¯ä»¥é€šè¿‡ "g:" è®¿é—®ã€‚å¦‚æžœä¸æä¾›å‰ç¼€ï¼Œä¼šä½¿ç”¨å‡½æ•°çš„局部å˜é‡ã€‚在 其他地方,如果你想的è¯ã€‚也å¯ä»¥ä½¿ç”¨ "g:"。 *local-variable* *l:var* 访问函数的局部å˜é‡æ— éœ€ä»»ä½•å‰ç¼€ã€‚但如果你想è¦ï¼Œå¯ä»¥ä½¿ç”¨ "l:"。ä¸è¿‡ï¼Œå¦‚果没有 "l:" å‰ç¼€ï¼Œä½ å¯èƒ½ä¼šå’Œä¿ç•™çš„å˜é‡å冲çªã€‚例如 "count"。它本身指代 "v:count"。但 使用了 "l:count" ä½ å°±å¯ä»¥ä½¿ç”¨åŒå的局部å˜é‡ã€‚ *script-variable* *s:var* Vim 脚本里,å¯ä»¥ä½¿ç”¨ "s:" 开头的å˜é‡ã€‚它们ä¸èƒ½åœ¨è„šæœ¬ä¹‹å¤–è®¿é—®ï¼Œå› è€Œå¯ä»¥ç§°ä¸ºå±€éƒ¨ 于脚本的å˜é‡ã€‚ 它们å¯ä»¥ç”¨äºŽ: - 载入脚本时执行的命令 - 脚本定义的函数 - 脚本定义的自动命令 - 脚本定义的函数和自动命令里定义的函数和自动命令 (递归) - 脚本里定义的用户定义命令 但ä¸èƒ½ç”¨åœ¨: - 该脚本载入的其它脚本 - 映射 - 等等 脚本å˜é‡å¯ä»¥ç”¨æ¥é˜²æ­¢å’Œå…¨å±€å˜é‡å的冲çªã€‚看看这个例å­: let s:counter = 0 function MyCounter() let s:counter = s:counter + 1 echo s:counter endfunction command Tick call MyCounter() ä½ å¯ä»¥ä»Žä»»ä½•脚本里å¯åЍ "Tick",但那个脚本里的 "s:counter" å˜é‡ä¸ä¼šè¢«æ”¹å˜ï¼Œåªæœ‰ 在 "Tick" 定义所在脚本的 "s:counter" æ‰ä¼šã€‚ å¦ä¸€ä¸ªå®Œæˆç›¸åŒåŠŸèƒ½çš„ä¾‹å­: let s:counter = 0 command Tick let s:counter = s:counter + 1 | echo s:counter 如果调用函数或者å¯åŠ¨ç”¨æˆ·å®šä¹‰å‘½ä»¤ï¼Œè„šæœ¬å˜é‡çš„上下文设置为函数和命令定义所在的脚 本。 脚本å˜é‡ä¹Ÿå¯ç”¨äºŽè„šæœ¬é‡Œå®šä¹‰çš„å‡½æ•°é‡Œå®šä¹‰çš„å‡½æ•°ã€‚ä¾‹å¦‚: let s:counter = 0 function StartCounting(incr) if a:incr function MyCounter() let s:counter = s:counter + 1 endfunction else function MyCounter() let s:counter = s:counter - 1 endfunction endif endfunction 调用 StartCounting() 时,定义 MyCounter() 函数或者递增或者递å‡è®¡æ•°å™¨ã€‚ä¸ç®¡ StartCounting() 在哪里调用,s:counter å˜é‡æ€»å¯ä»¥åœ¨ MyCounter() 里访问。 如果相åŒçš„脚本多次执行,使用的是åŒä¸€ä¸ªè„šæœ¬å˜é‡ã€‚åªè¦ Vim 还在è¿è¡Œï¼Œå°±ä¿æŒæœ‰ 效。这å¯ä»¥ç”¨äºŽç»´æŠ¤è®¡æ•°: if !exists("s:counter") let s:counter = 1 echo "脚本首次执行" else let s:counter = s:counter + 1 echo "脚本现在执行了 " . s:counter . " 次" endif æ³¨æ„ è¿™æ„å‘³ç€ filetype æ’ä»¶ä¸èƒ½ä¸ºæ¯ä¸ªç¼“冲区æä¾›ä¸åŒçš„脚本å˜é‡ã€‚这时应使用缓冲 区的局部å˜é‡ |b:var|。 预定义的 Vim å˜é‡: *vim-variable* *v:var* *v:beval_col* *beval_col-variable* v:beval_col 鼠标指针所在的列å·ï¼Œå³ |v:beval_lnum| 行中的字节ä½ç½®ã€‚ 仅当计算 'balloonexpr' 选项时有效。 *v:beval_bufnr* *beval_bufnr-variable* v:beval_bufnr 鼠标指针所在的缓冲区å·ã€‚仅当计算 'balloonexpr' 选项时有效。 *v:beval_lnum* *beval_lnum-variable* v:beval_lnum 鼠标指针所在的行å·ã€‚仅当计算 'balloonexpr' 选项时有效。 *v:beval_text* *beval_text-variable* v:beval_text 鼠标指针所在或之åŽçš„æ–‡æœ¬ã€‚通常是一个å•è¯ï¼Œå¯ç”¨äºŽè°ƒè¯• C 程åºã€‚ 此处用到 'iskeyword',但也包括此ä½ç½®ä¹‹å‰çš„å¥å·å’Œ "->"。如果在 ']' 上,使用它之å‰çš„æ–‡æœ¬ï¼ŒåŒ…括匹é…çš„ '[' 和它之å‰çš„å•è¯ã€‚如果 在å•行的å¯è§†åŒºåŸŸä¸Šï¼Œä½¿ç”¨é«˜äº®æ–‡æœ¬ã€‚ 仅当计算 'balloonexpr' 选项时有效。 *v:beval_winnr* *beval_winnr-variable* v:beval_winnr 鼠标指针所在的窗å£å·ã€‚仅当计算 'balloonexpr' 选项时有效。 *v:char* *char-variable* v:char 计算 'formatexpr' æ—¶ä½¿ç”¨çš„å‚æ•°ã€‚ *v:charconvert_from* *charconvert_from-variable* v:charconvert_from è¦è½¬æ¢çš„æ–‡ä»¶å­—符编ç å。åªåœ¨è®¡ç®— 'charconvert' 选项时有效。 *v:charconvert_to* *charconvert_to-variable* v:charconvert_to 转æ¢åŽçš„æ–‡ä»¶å­—符编ç å。åªåœ¨è®¡ç®— 'charconvert' 选项时有效。 *v:cmdarg* *cmdarg-variable* v:cmdarg 该å˜é‡æœ‰ä¸¤ä¸ªç›®çš„: 1. 文件读写命令的é¢å¤–傿•°ã€‚ç›®å‰ï¼Œå®ƒä»¬åŒ…括 "++enc=" å’Œ "++ff="。该å˜é‡åœ¨æ–‡ä»¶è¯»å†™å‘½ä»¤çš„自动命令事件激活之å‰è®¾ç½®ã€‚å¼€ 头有一个空格,以便直接把该å˜é‡é™„加到读写命令之åŽã€‚注æ„: è¿™ 里ä¸åŒ…括 "+cmd" 傿•°ï¼Œå› ä¸ºå®ƒæ€»è¦è¢«æ‰§è¡Œçš„。 2. 使用 ":hardcopy" æ‰“å° PostScript 文件时,":hardcopy" 命令的 傿•°ã€‚在 'printexpr' 里用得到。 *v:cmdbang* *cmdbang-variable* v:cmdbang 文件读写命令时,和 v:cmdarg 设置的时间类似。如果使用了 "!",其 值为 1,ä¸ç„¶ä¸º 0ã€‚æ³¨æ„ å®ƒåªèƒ½ç”¨äºŽè‡ªåŠ¨å‘½ä»¤ã€‚ç”¨æˆ·å‘½ä»¤é‡Œå¯ä»¥ç”¨ |<bang>|。 *v:count* *count-variable* v:count 最近的普通模å¼å‘½ä»¤ä½¿ç”¨çš„计数。在映射å‰å¯ç”¨äºŽå¾—到计数。åªè¯»ã€‚ 例如: :map _x :<C-U>echo "计数为 " . v:count<CR> 注æ„: <C-U> 是必è¦çš„ï¼Œå®ƒåˆ é™¤ç´§è·Ÿåœ¨è®¡æ•°ä¹‹åŽ ':' 所给出的行范 围。 也用于计算 'formatexpr' 选项。 为了åŽå‘兼容,这里也å¯ä»¥ç”¨ "count"。 *v:count1* *count1-variable* v:count1 类似于 "v:count",但没有给出计数时,缺çœä¸º 1。 *v:ctype* *ctype-variable* v:ctype è¿è¡ŒçŽ¯å¢ƒå½“å‰çš„字符 locale 设置。它使得 Vim 脚本能得到当å‰çš„ locale ç¼–ç ã€‚技术细节: 这就是 LC_CTYPE 的值。如果没有使用 locale,其值为 "C"。 该å˜é‡ä¸èƒ½ç›´æŽ¥è®¾ç½®ï¼Œè¯·ä½¿ç”¨ |:language| 命令。 è§ |multi-lang|。 *v:dying* *dying-variable* v:dying 通常为零。如果æ•获到æŸä¸ª "致命" çš„ signal,设为 1ã€‚å¦‚æžœåŒæ—¶æ• 获到多个 signal,其值相应增加。在自动命令里å¯ä»¥ç”¨æ¥æ£€æŸ¥ Vim 是å¦è¢«å¼‚常终止。{ä»…é™äºŽ Unix} 例如: :au VimLeave * if v:dying | echo "\nAAAAaaaarrrggghhhh!!!\n" | endif *v:errmsg* *errmsg-variable* v:errmsg 最近给出的错误信æ¯ã€‚该å˜é‡å¯ä»¥è®¾ç½®ã€‚ 例如: :let v:errmsg = "" :silent! next :if v:errmsg != "" : ... handle error 为了åŽå‘兼容,这里也å¯ä»¥ç”¨ "errmsg"。 *v:exception* *exception-variable* v:exception 最近æ•获且没有完æˆçš„ä¾‹å¤–çš„å€¼ã€‚è§ |v:throwpoint| å’Œ |throw-variables|。 例如: :try : throw "oops" :catch /.*/ : echo "caught" v:exception :endtry 输出: "caught oops"。 *v:fcs_reason* *fcs_reason-variable* v:fcs_reason 激活 |FileChangedShell| 事件的原因。 å¯ä»¥åœ¨è‡ªåŠ¨å‘½ä»¤é‡Œç”¨æ¥å†³å®šè¯¥åšä»€ä¹ˆå’Œ/或如何设置 v:fcs_choiceã€‚å¯ èƒ½çš„å€¼æ˜¯: deleted 文件ä¸å†å­˜åœ¨ conflict æ–‡ä»¶å†…å®¹ã€æ¨¡å¼æˆ–修改时间被改å˜ï¼Œè€Œç¼“冲 åŒºåŒæ—¶è¢«ä¿®æ”¹ changed æ–‡ä»¶å†…å®¹è¢«æ”¹å˜ mode 文件模å¼è¢«æ”¹å˜ time æ–‡ä»¶ä¿®æ”¹æ—¶é—´è¢«æ”¹å˜ *v:fcs_choice* *fcs_choice-variable* v:fcs_choice |FileChangedShell| 事件激活åŽè¯¥åšä»€ä¹ˆã€‚å¯ä»¥åœ¨è‡ªåŠ¨å‘½ä»¤é‡Œç”¨æ¥å‘Š è¯‰ Vim å¦‚ä½•å¤„ç†æ¶‰åŠçš„缓冲区: reload 釿–°è½½å…¥ç¼“冲区 (如果文件已删除,ä¸èƒ½å·¥ 作)。 ask 询问用户该åšä»€ä¹ˆï¼Œå°±åƒæ²¡æœ‰è‡ªåЍ命令䏀 样。ä¸è¿‡ï¼Œå¦‚æžœåªæœ‰ä¿®æ”¹æ—¶é—´è¢«æ”¹å˜ï¼Œä¸åš 任何事。 <空> ä¸åšä»»ä½•事。自动命令应该已ç»å¤„ç†å®Œæ¯•。 缺çœä¸ºç©ºã€‚如果使用别的 (éžæ³•çš„) 值,Vim 的行为就åƒå®ƒä¸ºç©ºä¸€æ ·ã€‚ ä¸ä¼šæœ‰è­¦å‘Šä¿¡æ¯ã€‚ *v:fname_in* *fname_in-variable* v:fname_in 输入文件åã€‚åœ¨è®¡ç®—ä»¥ä¸‹é€‰é¡¹æ—¶åˆæ³•: 选项 用于 'charconvert' è¦è½¬æ¢çš„æ–‡ä»¶ 'diffexpr' 原始文件 'patchexpr' 原始文件 'printexpr' è¦æ‰“å°çš„æ–‡ä»¶ |SwapExists| é‡Œè®¾ä¸ºäº¤æ¢æ–‡ä»¶å。 *v:fname_out* *fname_out-variable* v:fname_out 输出文件åã€‚åªæœ‰åœ¨è®¡ç®—以下选项时æ‰åˆæ³•: 选项 用于 'charconvert' 生æˆçš„转æ¢å®Œæˆçš„æ–‡ä»¶ (*) 'diffexpr' diff 的结果 'patchexpr' äº§ç”Ÿçš„è¡¥ä¸æ–‡ä»¶ (*) å¦‚æžœç”¨äºŽä¸ºå†™å…¥å‘½ä»¤è¿›è¡Œè½¬æ¢ (比如,":w file"),等价于 v:fname_inã€‚å¦‚æžœç”¨äºŽä¸ºè¯»å…¥å‘½ä»¤è¿›è¡Œè½¬æ¢ (比如,":e file"),它是 一个临时文件å,和 v:fname_in ä¸åŒã€‚ *v:fname_new* *fname_new-variable* v:fname_new 文件新版本的åå­—ã€‚åªæœ‰åœ¨è®¡ç®— 'diffexpr' çš„æ—¶å€™æ‰æœ‰æ•ˆã€‚ *v:fname_diff* *fname_diff-variable* v:fname_diff 比较结果 (或补ä¸) 的文件åã€‚åªæœ‰åœ¨è®¡ç®— 'patchexpr' çš„æ—¶å€™æ‰æœ‰ 效。 *v:folddashes* *folddashes-variable* v:folddashes 用于 'foldtext': åæ˜ å…³é—­çš„æŠ˜å çš„æŠ˜å çº§åˆ«çš„连字符。 |sandbox| 里åªè¯»ã€‚|fold-foldtext| *v:foldlevel* *foldlevel-variable* v:foldlevel 用于 'foldtext': 关闭的折å çš„æŠ˜å çº§åˆ«ã€‚ |sandbox| 里åªè¯»ã€‚|fold-foldtext| *v:foldend* *foldend-variable* v:foldend 用于 'foldtext': 关闭的折å çš„æœ€åŽä¸€è¡Œã€‚ |sandbox| 里åªè¯»ã€‚|fold-foldtext| *v:foldstart* *foldstart-variable* v:foldstart 用于 'foldtext': 关闭的折å çš„第一行。 |sandbox| 里åªè¯»ã€‚|fold-foldtext| *v:insertmode* *insertmode-variable* v:insertmode 用于 |InsertEnter| å’Œ |InsertChange| 自动命令事件。å–值: i æ’å…¥æ¨¡å¼ r æ›¿æ¢æ¨¡å¼ v è™šæ‹Ÿæ›¿æ¢æ¨¡å¼ *v:key* *key-variable* v:key |Dictionary| 里当å‰é¡¹ç›®çš„é”®ã€‚åªæœ‰åœ¨ |map()| å’Œ |filter()| 里计 ç®—è¡¨è¾¾å¼æ—¶æœ‰æ•ˆã€‚ åªè¯»ã€‚ *v:lang* *lang-variable* v:lang è¿è¡ŒçŽ¯å¢ƒå½“å‰çš„æ¶ˆæ¯ locale 设置。它使得 Vim 脚本能得到当å‰ä½¿ç”¨ 的语言。技术细节: 这就是 LC_MESSAGES 的值。该值和系统有关。 该å˜é‡ä¸èƒ½ç›´æŽ¥è®¾ç½®ï¼Œè¯·ä½¿ç”¨ |:language| 命令。 它和 |v:ctype| ä¸åŒï¼Œå› ä¸ºæ¶ˆæ¯å¯èƒ½ä½¿ç”¨ä¸åŒäºŽå­—符编ç çš„è¯­è¨€ã€‚è§ |multi-lang|。 *v:lc_time* *lc_time-variable* v:lc_time è¿è¡ŒçŽ¯å¢ƒå½“å‰çš„æ—¶é—´æ¶ˆæ¯ locale 设置。它使得 Vim 脚本能得到当å‰ä½¿ç”¨çš„语言。技术细节: 这就是 LC_TIME 的值。 该å˜é‡ä¸èƒ½ç›´æŽ¥è®¾ç½®ï¼Œè¯·ä½¿ç”¨ |:language| å‘½ä»¤ã€‚è§ |multi-lang|。 *v:lnum* *lnum-variable* v:lnum 'foldexpr' |fold-expr| å’Œ 'indentexpr' 表达å¼é‡Œçš„行å·ï¼Œè¿˜æœ‰ 'guitablevel' å’Œ 'guitabtooltip' 里的标签页å·ã€‚åªæœ‰åœ¨è®¡ç®—这些 表达å¼çš„æ—¶å€™æ‰åˆæ³•。|sandbox| 里åªè¯»ã€‚ *v:mouse_win* *mouse_win-variable* v:mouse_win 用 |getchar()| 得到鼠标点击时所在的窗å£å·ã€‚首个窗å£çš„ç¼–å·ä¸º 1 ï¼Œå°±åƒ |winnr()| 那样。如果那时没有鼠标点击,该值为零。 *v:mouse_lnum* *mouse_lnum-variable* v:mouse_lnum 用 |getchar()| 得到鼠标点击时所在的行å·ã€‚这是文本行å·ï¼Œä¸æ˜¯å± 幕行å·ã€‚如果那时没有鼠标点击,该值为零。 *v:mouse_col* *mouse_col-variable* v:mouse_col 用 |getchar()| 得到鼠标点击时所在的列å·ã€‚这是å±å¹•列å·ï¼Œå°±åƒ |virtcol()| 那样。如果那时没有鼠标点击,该值为零。 *v:prevcount* *prevcount-variable* v:prevcount 倒数第二次的普通模å¼å‘½ä»¤ä½¿ç”¨çš„计数,也就是å†ä¸Šä¸€ä¸ªå‘½ä»¤ç”¨çš„ v:count 的值。å¯ä»¥ç”¨æ¥å…ˆä¸­æ­¢å¯è§†æ¨¡å¼ï¼Œç„¶åŽä½¿ç”¨è®¡æ•°ã€‚ :vmap % <Esc>:call MyFilter(v:prevcount)<CR> åªè¯»ã€‚ *v:profiling* *profiling-variable* v:profiling 通常为零。开始用 ":profile start" 之åŽè®¾ä¸ºä¸€ã€‚è§ |profiling|。 *v:progname* *progname-variable* v:progname åŒ…å« Vim å¯åŠ¨æ—¶ä½¿ç”¨çš„åå­— (路径已被去掉)。å¯ä»¥ç”¨æ¥ä¸º "view"〠"evim" 等符å·é“¾æŽ¥åˆ° Vim çš„åå­—æä¾›ç‰¹æ®Šçš„设置。 åªè¯»ã€‚ *v:register* *register-variable* v:register 最近的普通模å¼å‘½ä»¤ä½¿ç”¨çš„寄存器å字。如果没有使用过,为空。 |getreg()| |setreg()| *v:scrollstart* *scrollstart-variable* v:scrollstart 指示使å±å¹•ä¸Šæ»šçš„è„šæœ¬æˆ–å‡½æ•°çš„å­—ç¬¦ä¸²ã€‚åªæœ‰åœ¨åŽŸæ¥ä¸ºç©ºæ—¶æ‰è®¾ç½®ï¼Œå›  æ­¤åªè®°ä½ç¬¬ä¸€ä¸ªåŽŸå› ã€‚å¦‚æžœæ¥è‡ªè¾“入的命令,设为 "Unknown"。 å¯ä»¥ç”¨æ¥å‘现你的脚本为什么产生 hit-enter æç¤ºã€‚ *v:servername* *servername-variable* v:servername 如果有的è¯ï¼Œæ³¨å†Œè¿‡çš„ |x11-clientserver| å字。 åªè¯»ã€‚ *v:shell_error* *shell_error-variable* v:shell_error 最近一次外壳命令的返回值。如果éžé›¶ï¼Œæœ€è¿‘一次外壳命令有错。如果 为零,则该命令æˆåŠŸè¿”å›žã€‚è¿™åªæœ‰åœ¨å¤–壳把错误代ç è¿”回给 Vim 的时 候æ‰å·¥ä½œã€‚-1 通常用æ¥å‘ŠçŸ¥è¯¥å‘½ä»¤æ— æ³•执行。åªè¯»ã€‚ 例如: :!mv foo bar :if v:shell_error : echo 'ä¸èƒ½æŠŠ "foo" æ¢å为 "bar"!' :endif 为了åŽå‘兼容,这里也å¯ä»¥ç”¨ "shell_error"。 *v:statusmsg* *statusmsg-variable* v:statusmsg æœ€è¿‘ç»™å‡ºçš„çŠ¶æ€æ¶ˆæ¯ã€‚å¯ä»¥è®¾ç½®è¯¥å˜é‡ã€‚ *v:swapname* *swapname-variable* v:swapname åªæœ‰åœ¨æ‰§è¡Œ |SwapExists| 自动命令时æ‰åˆæ³•: æ‰¾åˆ°çš„äº¤æ¢æ–‡ä»¶åã€‚åª è¯»ã€‚ *v:swapchoice* *swapchoice-variable* v:swapchoice |SwapExists| 自动命令å¯ä»¥è®¾ç½®æ­¤å€¼ï¼Œä»¥é€‰æ‹©å¦‚何处ç†å·²æœ‰äº¤æ¢æ–‡ä»¶: 'o' 以åªè¯»æ–¹å¼æ‰“å¼€ 'e' ä»ç„¶ç¼–辑 'r' æ¢å¤ 'd' åˆ é™¤äº¤æ¢æ–‡ä»¶ 'q' 退出 'a' 中止 该值应是å•ä¸ªå­—ç¬¦çš„å­—ç¬¦ä¸²ã€‚å¦‚æžœä¸ºç©ºï¼Œç”¨æˆ·ä¼šè¢«è¯¢é—®ï¼Œå°±åƒæ²¡æœ‰ SwapExists 自动命令那样。缺çœä¸ºç©ºã€‚ *v:swapcommand* *swapcommand-variable* v:swapcommand æ‰“å¼€æ–‡ä»¶åŽæ‰§è¡Œçš„æ™®é€šæ¨¡å¼å‘½ä»¤ã€‚å¯ä»¥ç”¨äºŽ |SwapExists| 自动命令, 用以让å¦ä¸€ä¸ª Vim 打开文件并跳转到åˆé€‚çš„ä½ç½®ã€‚例如,è¦è·³è½¬åˆ°æŸ 标签,用的值是 ":tag tagname\r"。":edit +cmd file" 用的值是 ":cmd\r"。 *v:termresponse* *termresponse-variable* v:termresponse 使用 |t_RV| termcap 项目返回的终端的转义åºåˆ—。Vim 收到 ESC [ 或者 CSI 开始,以一个 'c' 结æŸï¼Œå¹¶ä¸”å…¶é—´åªåŒ…嫿•°å­—,';' å’Œ '.' 的转义åºåˆ—的时候,会设置该值。 如果设置该选项,会激活 TermResponse 自动命令事件,这样你就å¯ä»¥ 对终端的应答åšå‡ºå应。 æ–°çš„ xterm 的应答是: "<Esc>[ Pp ; Pv ; Pc c"。 Pp 是终端类型: 0 代表 vt100,而 1 代表 vt220。 Pv 是补ä¸å· (因为这是 patch 95 引入的,补ä¸å·åº”该总是 95 会更高)。Pc 总是零。 {仅当编译时加入 |+termresponse| ç‰¹æ€§æ‰æœ‰æ•ˆ} *v:this_session* *this_session-variable* v:this_session 最近载入或者ä¿å­˜çš„ä¼šè¯æ–‡ä»¶çš„æ–‡ä»¶å |:mksession|。å¯ä»¥è®¾ç½®è¯¥å˜ é‡ã€‚如果没有ä¿å­˜è¿‡ä¼šè¯æ–‡ä»¶ï¼Œè¯¥å˜é‡ä¸ºç©ºã€‚ 为了åŽå‘兼容,这里也å¯ä»¥ç”¨ "this_session"。 *v:throwpoint* *throwpoint-variable* v:throwpoint 最近æ•获且未完æˆçš„例外的抛出ä½ç½®ã€‚输入的命令ä¸ä¼šè®¾ç½®æ­¤å˜é‡ã€‚å¦ è§ |v:exception| å’Œ |throw-variables|。 例如: :try : throw "oops" :catch /.*/ : echo "Exception from" v:throwpoint :endtry 输出: "Exception from test.vim, line 2" *v:val* *val-variable* v:val |List| 或 |Dictionary| 当å‰é¡¹ç›®çš„å€¼ã€‚åªæœ‰åœ¨è®¡ç®— |map()| å’Œ |filter()| é‡Œçš„è¡¨è¾¾å¼æ—¶æ‰æœ‰æ•ˆã€‚åªè¯»ã€‚ *v:version* *version-variable* v:version Vim 的版本å·: 主版本å·ä¹˜ä»¥ 100 加上副版本å·ã€‚5.0 版本对应的是 500。5.1 版本 (5.01) 则是 501。åªè¯»ã€‚为了åŽå‘兼容,这里也å¯ä»¥ 用 "version"。 用 |has()| å¯ä»¥æ£€æŸ¥æ˜¯å¦åŒ…嫿Ÿè¡¥ä¸ï¼Œä¾‹å¦‚: if has("patch123") æ³¨æ„ è¡¥ä¸å·å’Œç‰ˆæœ¬æœ‰å…³ï¼Œ5.0 å’Œ 5.1 版本都有补ä¸å· 123ï¼Œä½†å®Œå…¨ä¸ åŒã€‚ *v:warningmsg* *warningmsg-variable* v:warningmsg 最近给出的警告消æ¯ã€‚该å˜é‡å¯ä»¥è®¾ç½®ã€‚

4. 内建函数 *functions*

|function-list| æä¾›äº†æŒ‰åŠŸèƒ½åˆ†ç»„çš„ä¸€ä¸ªå‡½æ•°åˆ—è¡¨ã€‚ (在函数å上使用 CTRL-] 跳转到完整的功能说明。) 用法 结果 æè¿° add( {list}, {item}) 列表 在 |List| {list} 最åŽé™„加 {item} append( {lnum}, {string}) 数值 在第 {lnum} 行下附加字符串 {string} append( {lnum}, {list}) 数值 在第 {lnum} 行下附加行 {list} argc() 数值 傿•°åˆ—表的文件数目 argidx() 数值 傿•°åˆ—表的当å‰ç´¢å¼• argv( {nr}) 字符串 傿•°åˆ—表第 {nr} ä¸ªå‚æ•° argv( ) 列表 傿•°åˆ—表 browse( {save}, {title}, {initdir}, {default}) 字符串 å¯åŠ¨æ–‡ä»¶è¯·æ±‚çª—å£ browsedir( {title}, {initdir}) 字符串 å¯åŠ¨ç›®å½•è¯·æ±‚çª—å£ bufexists( {expr}) 数值 如果缓冲区 {expr} 存在则为真 buflisted( {expr}) 数值 如果缓冲区 {expr} 在列表内则为真 bufloaded( {expr}) 数值 如果缓冲区 {expr} 被载入则为真 bufname( {expr}) 字符串 缓冲区 {expr} çš„åå­— bufnr( {expr}) 数值 缓冲区 {expr} 的数目 bufwinnr( {expr}) 数值 缓冲区 {expr} 的窗å£å· byte2line( {byte}) 数值 第 {byte} ä¸ªå­—èŠ‚æ‰€åœ¨çš„è¡Œå· byteidx( {expr}, {nr}) 数值 {expr} 里第 {nr} 个字符的字节ä½ç½® call( {func}, {arglist} [, {dict}]) å¯å˜ 调用函数 {func}ï¼Œä½¿ç”¨å‚æ•° {arglist} changenr() 数值 当剿”¹å˜å· char2nr( {expr}) 数值 {expr} 里第一个字符串的 ASCII 值 cindent( {lnum}) 数值 第 {lnum} 行的 C 缩进 col( {expr}) 数值 光标或ä½ç½®æ ‡è®°çš„åˆ—å· complete({startcol}, {matches}) 字符串 设置æ’入模å¼è¡¥å…¨ complete_add( {expr}) 数值 å¢žåŠ è¡¥å…¨åŒ¹é… complete_check() 数值 补全时检查输入的键 confirm( {msg} [, {choices} [, {default} [, {type}]]]) 数值 用户选择的åºå· copy( {expr}) å¯å˜ æä¾› {expr} 的浅备份 count( {list}, {expr} [, {start} [, {ic}]]) 数值 计算 {list} 里有多少个 {expr} cscope_connection( [{num} , {dbpath} [, {prepend}]]) 数值 检查 cscope 连接是å¦å­˜åœ¨ cursor( {lnum}, {col} [, {coladd}]) 数值 移动光标到 {lnum},{col},{coladd} cursor( {list}) 数值 移动光标到 {list} 里的ä½ç½® deepcopy( {expr}) å¯å˜ æä¾› {expr} 的完整备份 delete( {fname}) 数值 删除文件 {fname} did_filetype() 数值 如果使用过 FileType 自动命令事件则为真 diff_filler( {lnum}) 数值 {lnum} 行之上的 diff 填充行数 diff_hlID( {lnum}, {col}) 数值 {lnum}/{col} ä½ç½®çš„ diff 高亮 empty( {expr}) 数值 如果 {expr} 为空则为真 escape( {string}, {chars}) 字符串 在 {string} 里用 '\' 转义 {chars} eval( {string}) å¯å˜ 计算 {string},返回结果 eventhandler( ) 数值 如果在事件处ç†ä¸­åˆ™ä¸ºçœŸ executable( {expr}) 数值 å¦‚æžœå¯æ‰§è¡Œæ–‡ä»¶ {expr} 存在则为 1 exists( {expr}) 数值 如果 {expr} 存在则为真 extend({expr1}, {expr2} [, {expr3}]) 列表/å­—å…¸ 把 {expr2} 里的项目æ’å…¥ {expr1} expand( {expr}) 字符串 扩展 {expr} 里的特殊关键字 feedkeys( {string} [, {mode}]) 数值 给预输入缓冲区加入键åºåˆ— filereadable( {file}) 数值 如果 {file} 是个å¯è¯»æ–‡ä»¶åˆ™ä¸ºçœŸ filewritable( {file}) 数值 如果 {file} 是个å¯å†™æ–‡ä»¶åˆ™ä¸ºçœŸ filter( {expr}, {string}) 列表/å­—å…¸ 删除 {expr} 里 {string} 为 0 的项目 finddir( {name}[, {path}[, {count}]]) 字符串 在 {path} 里寻找目录 {name} findfile( {name}[, {path}[, {count}]]) 字符串 在 {path} 里寻找文件 {name} fnamemodify( {fname}, {mods}) 字符串 修改文件å foldclosed( {lnum}) 数值 {lnum} 所在折å çš„é¦–è¡Œï¼Œå¦‚æžœæ˜¯å…³é—­çš„è¯ foldclosedend( {lnum}) 数值 {lnum} 所在折å çš„æœ«è¡Œï¼Œå¦‚æžœæ˜¯å…³é—­çš„è¯ foldlevel( {lnum}) 数值 {lnum} 的折å çº§åˆ« foldtext( ) 字符串 å…³é—­çš„æŠ˜å æ˜¾ç¤ºçš„行 foldtextresult( {lnum}) 字符串 {lnum} 所在的关闭的折å çš„æ–‡æœ¬ foreground( ) 数值 把 Vim 窗å£å¸¦åˆ°å‰å° function( {name}) 函数引用 函数 {name} 的引用 garbagecollect() æ—  释放内存,打破循环引用 get( {list}, {idx} [, {def}]) å¯å˜ 得到 {list} 或 {def} 的项目 {idx} get( {dict}, {key} [, {def}]) å¯å˜ 得到 {dict} 或 {def} 的项目 {idx} getbufline( {expr}, {lnum} [, {end}]) 列表 缓冲区 {expr} 第 {lnum} 到 {end} 行 getbufvar( {expr}, {varname}) å¯å˜ 缓冲区 {expr} çš„å˜é‡ {varname} getchar( [expr]) 数值 让用户输入一个字符 getcharmod( ) 数值 最近输入字符的修饰符 getcmdline() 字符串 返回当å‰å‘½ä»¤è¡Œ getcmdpos() 数值 返回命令行的光标ä½ç½® getcmdtype() 字符串 返回当å‰å‘½ä»¤è¡Œç±»åž‹ getcwd() 字符串 当å‰å·¥ä½œç›®å½• getfperm( {fname}) 字符串 文件 {fname} 的文件æƒé™ getfsize( {fname}) 数值 字节计算的文件 {fname} å¤§å° getfontname( [{name}]) 字符串 使用的字体å getftime( {fname}) 数值 文件的最新修改时间 getftype( {fname}) 字符串 文件 {fname} 类型的æè¿° getline( {lnum}) 字符串 当å‰ç¼“冲区的第 {lnum} 行 getline( {lnum}, {end}) 列表 当å‰ç¼“冲区第 {lnum} 到 {end} 行 getloclist({nr}) 列表 ä½ç½®åˆ—表项目的列表 getpos( {expr}) 列表 光标ã€ä½ç½®æ ‡è®°ç­‰çš„ä½ç½® getqflist() 列表 quickfix 项目的列表 getreg( [{regname} [, 1]]) 字符串 寄存器内容 getregtype( [{regname}]) 字符串 寄存器类型 gettabwinvar( {tabnr}, {winnr}, {name}) å¯å˜ {tabnr} 标签页 {winnr} 窗å£çš„ {name} getwinposx() 数值 GUI Vim 窗å£ä»¥åƒç´ è®¡çš„ X åæ ‡ getwinposy() 数值 GUI Vim 窗å£ä»¥åƒç´ è®¡çš„ Y åæ ‡ getwinvar( {nr}, {varname}) å¯å˜ çª—å£ {expr} çš„å˜é‡ {varname} glob( {expr}) 字符串 扩展 {expr} 里的文件通é…符 globpath( {path}, {expr}) 字符串 在 {path} 所有目录下执行 glob({expr}) has( {feature}) 数值 如果支æŒç‰¹æ€§ {feature} 则为真 has_key( {dict}, {key}) 数值 如果 {dict} 有项目 {key} 则为真 haslocaldir() 数值 如果当å‰çª—壿‰§è¡Œè¿‡ |:lcd| hasmapto( {what} [, {mode} [, {abbr}]]) 数值 如果 {what} 的映射存在则为真 histadd( {history},{item}) 字符串 在历å²é‡Œå¢žåŠ é¡¹ç›® histdel( {history} [, {item}]) 字符串 从历å²é‡Œåˆ é™¤é¡¹ç›® histget( {history} [, {index}]) 字符串 得到历å²çš„第 {index} 项 histnr( {history}) 数值 历å²é‡Œæœ€é«˜çš„é¡¹ç›®å· hlexists( {name}) 数值 如果高亮组 {name} 存在则为真 hlID( {name}) 数值 高亮组 {name} 的语法 ID hostname() 字符串 Vim è¿è¡Œçš„æœºå™¨åå­— iconv( {expr}, {from}, {to}) 字符串 è½¬æ¢ {expr} çš„ç¼–ç  indent( {lnum}) 数值 第 {lnum} 行的缩进 index( {list}, {expr} [, {start} [, {ic}]]) 数值 {list} 列表里出现 {expr} 的项目的索引 input( {prompt} [, {text} [, {completion}]]) 字符串 从用户得到输入 inputdialog( {p} [, {t} [, {c}]]) 字符串 类似于 input(),但使用 GUI å¯¹è¯æ¡† inputlist( {textlist}) 数值 让用户从选择列表里挑选 inputrestore() 数值 æ¢å¤é¢„输入 inputsave() 数值 ä¿å­˜å’Œæ¸…除预输入 inputsecret( {prompt} [, {text}]) 字符串 类似于 input(),但éšè—文本 insert( {list}, {item} [, {idx}]) 列表 在 {list} 里æ’å…¥ {item} [{idx} 之å‰] isdirectory( {directory}) 数值 如果 {directory} 是目录则为真 islocked( {expr}) 数值 如果 {expr} 被é”ä½åˆ™ä¸ºçœŸ items( {dict}) 列表 {dict} 里的键-值组对 join( {list} [, {sep}]) 字符串 连接 {list} 的项目æˆä¸ºä¸€ä¸ªå­—符串 keys( {dict}) 列表 {dict} 的所有键 len( {expr}) 数值 {expr} 的长度 libcall( {lib}, {func}, {arg}) 字符串 调用库 {lib} 的函数 {func}ï¼Œä½¿ç”¨å‚æ•° {arg} libcallnr( {lib}, {func}, {arg}) 数值 åŒä¸Šï¼Œä½†è¿”回数值 line( {expr}) 数值 å…‰æ ‡æ‰€åœ¨ã€æœ«è¡Œæˆ–者ä½ç½®æ ‡è®°æ‰€åœ¨çš„è¡Œå· line2byte( {lnum}) 数值 行 {lnum} 的字节ä½ç½® lispindent( {lnum}) 数值 行 {lnum} çš„ Lisp 缩进 localtime() 数值 当剿—¶é—´ map( {expr}, {string}) 列表/å­—å…¸ {expr} çš„æ¯ä¸ªé¡¹ç›®æ”¹å˜ä¸º {string} maparg( {name}[, {mode} [, {abbr}]]) 字符串 æ¨¡å¼ {mode} 的映射 {name} çš„å³è¾¹ mapcheck( {name}[, {mode} [, {abbr}]]) 字符串 æ£€æŸ¥åŒ¹é… {name} 的映射 match( {expr}, {pat}[, {start}[, {count}]]) 数值 {expr} 里 {pat} 的匹é…ä½ç½® matcharg( {nr}) 列表 |:match| çš„å‚æ•° matchend( {expr}, {pat}[, {start}]) 数值 {expr} 里 {pat} 的结æŸä½ç½® matchlist( {expr}, {pat}[, {start}[, {count}]]) 列表 {expr} 里 {pat} 的匹é…å’Œå­åŒ¹é… matchstr( {expr}, {pat}[, {start}[, {count}]]) 字符串 第 {count} 个 {expr} 里 {pat} çš„åŒ¹é…æ–‡ 本 max({list}) 数值 {list} 的项目的最大值 min({list}) 数值 {list} 的项目的最å°å€¼ mkdir({name} [, {path} [, {prot}]]) 数值 建立目录 {name} mode() 字符串 当å‰ç¼–è¾‘æ¨¡å¼ nextnonblank( {lnum}) 数值 第一个 >= {lnum} çš„éžç©ºç™½è¡Œçš„è¡Œå· nr2char( {expr}) 字符串 ASCII 值为 {expr} çš„å•个字符 pathshorten( {expr}) 字符串 缩短路径里的目录å prevnonblank( {lnum}) 数值 最åŽä¸€ä¸ª <= {lnum} çš„éžç©ºç™½è¡Œçš„è¡Œå· printf( {fmt}, {expr1}...) 字符串 排版文本 pumvisible() 数值 å¼¹å‡ºçª—å£æ˜¯å¦å¯è§ range( {expr} [, {max} [, {stride}]]) 列表 从 {expr} 到 {max} çš„åºåˆ— readfile({fname} [, {binary} [, {max}]]) 列表 得到文件 {fname} 的行列表 reltime( [{start} [, {end}]]) 列表 得到时间值 reltimestr( {time}) 字符串 把时间值转化为字符串 remote_expr( {server}, {string} [, {idvar}]) 字符串 å‘é€è¡¨è¾¾å¼ remote_foreground( {server}) 数值 把 Vim æœåŠ¡å™¨å¸¦åˆ°å‰å° remote_peek( {serverid} [, {retvar}]) 数值 检查应答字符串 remote_read( {serverid}) 字符串 读入应答字符串 remote_send( {server}, {string} [, {idvar}]) 字符串 å‘é€é”®åºåˆ— remove( {list}, {idx} [, {end}]) å¯å˜ 从 {list} 里删除项目 {idx}-{end} remove( {dict}, {key}) å¯å˜ 从 {dict} 里删除项目 {key} rename( {from}, {to}) 数值 æ¢å (移动) 文件,从 {from} 到 {to} repeat( {expr}, {count}) 字符串 é‡å¤ {expr} {count} 次 resolve( {filename}) 字符串 è§£æžå¿«æ·æ–¹å¼å¯¹åº”的文件å reverse( {list}) 列表 å转 {list},直接修改 {list} search( {pattern} [, {flags}]) 数值 æœç´¢ {pattern} searchdecl({name} [, {global} [, {thisblock}]]) 数值 æœç´¢å˜é‡å£°æ˜Ž searchpair( {start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]]) 数值 æœç´¢ start/end 对的å¦ä¸€ä¾§ searchpairpos( {start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]]) 列表 æœç´¢ start/end 队的å¦ä¸€ä¾§ searchpos( {pattern} [, {flags} [, {stopline}]]) 列表 æœç´¢ {pattern} server2client( {clientid}, {string}) 数值 å‘é€åº”答字符串 serverlist() 字符串 得到å¯ç”¨çš„æœåŠ¡å™¨åˆ—è¡¨ setbufvar( {expr}, {varname}, {val}) 设置缓冲区 {expr} çš„ {varname} 为 {val} setcmdpos( {pos}) 数值 设置命令行的光标ä½ç½® setline( {lnum}, {line}) 数值 设置第 {lnum} 行的内容为 {line} setloclist( {nr}, {list}[, {action}]) 数值 用 {list} 修改ä½ç½®åˆ—表 setpos( {expr}, {list}) æ—  设置 {expr} çš„ä½ç½®ä¸º {list} setqflist( {list}[, {action}]) 数值 用 {list} 修改 quickfix 列表 setreg( {n}, {v}[, {opt}]) 数值 设置寄存器的值和类型 settabwinvar( {tabnr}, {winnr}, {varname}, {val}) æ—  设置标签页 {tabnr} çª—å£ {winnr} çš„ {varname} å˜é‡ä¸º {val} setwinvar( {nr}, {varname}, {val}) è®¾ç½®çª—å£ {expr} çš„ {varname} 为 {val} shellescape( {string}) 字符串 转义 {string} ä»¥ä¾¿ç”¨ä½œå¤–å£³å‘½ä»¤çš„å‚æ•° simplify( {filename}) 字符串 å°½å¯èƒ½ç®€åŒ–文件å sort( {list} [, {func}]) 列表 æŽ’åº {list},用比较函数 {func} soundfold( {word}) 字符串 按å‘éŸ³æŠ˜å  {word} spellbadword() 字符串 光标所在的拼写错误的å•è¯ spellsuggest( {word} [, {max} [, {capital}]]) 列表 拼写建议 split( {expr} [, {pat} [, {keepempty}]]) 列表 从 {pat} 分割的 {expr} 里构造 |List| str2nr( {expr} [, {base}]) 数值 把字符串转æ¢ä¸ºæ•°å€¼ strftime( {format}[, {time}]) 字符串 指定格å¼çš„æ—¶é—´ stridx( {haystack}, {needle}[, {start}]) 数值 {haystack} 里 {needle} çš„ä½ç½® string( {expr}) 字符串 {expr} 值得字符串表示 strlen( {expr}) 数值 字符串 {expr} 的长度 strpart( {src}, {start}[, {len}]) 字符串 {src} 从 {start} 开始的 {len} 个字节 strridx( {haystack}, {needle} [, {start}]) 数值 {haystack} 里最åŽä¸€ä¸ª {needle} çš„ä½ç½® strtrans( {expr}) 字符串 翻译字符串,使之å¯ä»¥æ˜¾ç¤º submatch( {nr}) 字符串 ":substitute" çš„ç‰¹å®šåŒ¹é… substitute( {expr}, {pat}, {sub}, {flags}) 字符串 {expr} 里的所有 {pat} 被 {sub} 替代 synID( {lnum}, {col}, {trans}) 数值 {lnum} 行 {col} 列所在的语法 ID synIDattr( {synID}, {what} [, {mode}]) 字符串 syntax ID {synID} çš„ {what} 属性 synIDtrans( {synID}) 数值 {synID} ç»è¿‡ç¿»è¯‘的语法 ID system( {expr} [, {input}]) 字符串 外壳命令/过滤 {expr} 的输出 tabpagebuflist( [{arg}]) 列表 标签页里的缓冲区å·åˆ—表 tabpagenr( [{arg}]) 数值 当剿ˆ–æœ€åŽæ ‡ç­¾é¡µçš„ç¼–å· tabpagewinnr( {tabarg}[, {arg}]) 数值 标签页里当å‰çª—å£çš„ç¼–å· taglist( {expr}) 列表 åŒ¹é… {expr} 的标签列表 tagfiles() 列表 使用的标签文件 tempname() 字符串 临时文件的文件å tolower( {expr}) 字符串 字符串 {expr} å˜ä¸ºå°å