[关闭]
@wz520 2016-06-20T11:29:19.000000Z 字数 1041 阅读 1870

编写 Vim 脚本时容易犯的错误

Vim Vim脚本


简单总结一下在编写 Vim 脚本时,由于某些语法或概念和别的语言类似但不完全一样而容易导致的错误。
若想看入门教程的话请在 Vim 中输入 :help usr_41.txt ,个人感觉没有比这更好的了。

“半动态”的变量类型

注意:
7.4.1546 开始 Vim 终于允许任意地改变变量的类型,所以运行以下的任何代码都不会再报类型不匹配的错误了。但是如果你仍然使用早于 7.4.1546 的版本,则需要注意。

Vim 的变量很奇怪,声明(赋初值)时无需(也不能)指明类型,但是初值的类型实际上已经决定了变量的类型并且以后几乎不能再改变。比如:

  1. let a = 3
  2. let a = [3]

第二句会报 类型不匹配 错误,原因是第一次赋的 3 已确定 a 是整型,Vim 不允许再给它赋个列表类型的值。
为什么前面说 几乎不能再改变 呢?因为你可以给它赋字符串:

  1. let b = 3
  2. let b = "abc"

可以正常通过。因为 Vim 内部允许一个变量在字符串和整形之间自由转换。
跟别的一些语言类似,也允许 整形 和 浮点型 之间进行转换。
但是 不支持字符串型和浮点型之间的转换 ,于是以下代码又报“类型不匹配”错误了:

  1. let c = 3
  2. let c = "abc"
  3. let c = 3.5

把第二行和第三行的代码换一下也是同样的结果,感觉这个特性(也是应该叫BUG?)有点不合逻辑。
而且更糟糕的是,在别的语言里(比如 Python)看似很平常的代码,到了 Vim 脚本语言里同样报“类型不匹配”错误:

  1. for i in [3, "abc", 3.5]
  2. echo i
  3. endfor

原因是,第三次循环将 3.5 赋给 i 时,i 已经是字符串类型,而上面说过字符串类型是不能转为浮点类型的,于是就报错了。
解决办法是,在 echo i 下面加入 unlet i,把 i 删了。这样每次循环时的 i 就跟上次的 i 没关系了,就不会有什么类型不匹配了。

总之如果一个变量的初值是其他类型,那么以后就无法再赋其他类型的值了。如果你执意要这么干,记得要先 unlet 。

切片操作的范围(与 Python 比较)

Vim 脚本的“列表”和“字典”无论在概念上还是在语法上都与 Python 十分相似。

学过 Python 的朋友都知道列表的切片操作 a[b:c] ,是将 a[b]a[c] 之间的元素拿出来组合成一个新的列表。这个语法 Vim 也支持。

但是要注意有一点不一样:

Python 是不包含 a[c] 的,而 Vim 是包含的。

举例:

  1. [0,1,2,3,4,5][1:3]

对于这个表达式,Vim 返回 [1,2,3] 而 Python 返回 [1,2] 。

当然还不止这些

有时间再补充……

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注