芜湖网络,微信小程序排名关键词优化,东莞松山湖职业技术学院,app怎么制作多少钱VimScript 五分钟入门#xff08;翻译#xff09; 转自#xff1a;https://zhuanlan.zhihu.com/p/37352209 译注#xff1a;折腾 Vim 当然要能看懂和改写相关脚本#xff0c;而中文资料匮乏#xff0c;缺一个提纲挈领的教程。本文翻译自 Andrew Scala 的 《Five Minute V…VimScript 五分钟入门翻译 转自https://zhuanlan.zhihu.com/p/37352209 译注折腾 Vim 当然要能看懂和改写相关脚本而中文资料匮乏缺一个提纲挈领的教程。本文翻译自 Andrew Scala 的 《Five Minute Vimscript》立足于让你用最短的时间掌握 VimScript 的基础和要点你可以把它看成一份语言速查表。
Vim有着丰富的内建文档系统使用 :h 关键词 就可以阅读如果你想在方便的尝试各种 vimscript 可通过 normal 模式下使用 gQ 命令进入 VimScript 的交互式环境调试命令。
注意下面的例子中会包含一些形如 符号 的符号意味着正式使用时应该被完全替换成真实的东西包括左右两边的尖括号。而单独的 和 在 VimScript 中被用作比较符号。
变量
let 命令用来对变量进行初始化或者赋值。unlet 命令用来删除一个变量。unlet! 命令同样可以用来删除变量但是会忽略诸如变量不存在的错误提示。
默认情况下如果一个变量在函数体以外初始化的那么它的作用域是全局变量而如果它是在函数体以内初始化的那它的作用于是局部变量。同时你可以通过变量名称前加冒号前缀明确的指明变量的作用域
g:var - 全局
a:var - 函数参数
l:var - 函数局部变量
b:var - buffer 局部变量
w:var - window 局部变量
t:var - tab 局部变量
s:var - 当前脚本内可见的局部变量
v:var - Vim 预定义的内部变量你可以通过 $name 的模式读取或者改写环境变量同时可以用 option 的方式来读写 vim 内部设置的值。
数据类型
Number32 位有符号整数
-123
0x10
0177Float: 浮点数需要编译 Vim 的时候有 float 特性支持
123.456
1.15e-6
-1.1e3String: NULL 结尾的 8位无符号字符串
ab\txx\--
x-za,cFuncref: 函数引用函数引用类型的变量名必须以大写字母开头
:let Myfunc function(strlen)
:echo Myfunc(foobar) Call strlen on foobar.
6List: 有序列表
:let mylist [1, 2, [a, b]]
:echo mylist[0]
1
:echo mylist[2][0]
a
:echo mylist[-2]
2
:echo mylist[999]
E684: list index out of range: 999
:echo get(mylist, 999, THERE IS NO 1000th ELEMENT)
THERE IS NO 1000th ELEMENTDictionary: 无序的 Key/Value 容器
:let mydict {blue: #0000ff, foo: {999: baz}}
:echo mydict[blue]
#0000ff
:echo mydict.foo
{999: baz}
:echo mydict.foo.999
baz
:let mydict.blue BLUE
:echo mydict.blue
BLUE没有布尔类型整数 0 被当作假其他被当作真。字符串在比较真假前会被转换成整数大部分字符串都会被转化为 0除非以非零开头的字符串才会转化成非零。
译注可以调用 type(varname) 来取得变量的类型最新版 Vim 8.1 中已经包含 Boolean 类型并且有 v:true, v:false 两个值
VimScript 的变量属于动态弱类型。
:echo 1 . foo
1foo
:echo 1 1
2:function! TrueFalse(arg)
: return a:arg? true : false
:endfunction:echo TrueFalse(foobar)
false
:echo TrueFalse(1000)
true
:echo TrueFalse(x1000)
false
:echo TrueFalse(1000x)
true
:echo TrueFalse(0)
false字符串比较
string string: 字符串相等string ! string: 字符串不等string ~ pattern: 匹配 patternstring !~ pattern: 不匹配 patternoperator#: 匹配大小写operator?: 不匹配大小写
注意设置选项 ignorecase 会影响 和 ! 的默认比较结果可以在比较符号添加 ? 或者 # 来明确指定大小写是否忽略。
string . string: 字符串链接
:function! TrueFalse(arg)
: return a:arg? true : false
:endfunction:echo TrueFalse(X start ~ X$)
false
:echo TrueFalse(end X ~ X$)
true
:echo TrueFalse(end x ~# X$)
false流程控制If, For, While, and Try/Catch
条件判断
if expression...
elseif expression...
else...
endif循环
for var in listcontinuebreak
endfor复杂循环
for [var1, var2] in [[1, 2], [3, 4]] on 1st loop, var1 1 and var2 2 on 2nd loop, var1 3 and var2 4
endforWhile 循环
while expression
endwhile异常捕获
try...
catch pattern (optional) HIGHLY recommended to catch specific error.
finally...
endtry函数
使用 function 关键字定义一个函数使用 function! 覆盖一个函数的定义函数和变量一样也有作用范围的约束。需要注意函数名必须以大写字母开头。
function! Name(arg1, arg2, etc)function body
endfunctiondelfunction function 删除一个函数
call function 调用一个函数函数调用前的 call 语句是必须的除非在一个表达式里。
例子强制创建一个全局函数使用感叹号参数使用 … 这种不定长的参数形式时a:1 表示 … 部分的第一个参数a:2 表示第二个如此类推a:0 用来表示 … 部分共有多少参数。
function! g:Foobar(arg1, arg2, ...)let first_argument a:arg1let index 1let variable_arg_1 a:{index} same as a:1return variable_arg_1
endfunction有一种特殊的调用函数的方式可以指明该函数作用的文本区域是从当前缓冲区的第几行到第几行按照 “1,3call Foobar() ”的格式调用一个函数的话该函数会在当前文件的第一行到第三行每一行执行一遍再这个例子中该函数总共被执行了三次。
如果你在函数声明的参数列表后添加一个 range 关键字那函数就只会被调用一次这时两个名为 a:firstline 和 a:lastline 的特殊变量可以用在该函数内部使用。
例如强制创建一个名为 RangeSize 的函数用来显示被调用时候的文本范围
function! b:RangeSize() rangeecho a:lastline - a:firstline
endfunction面向对象
Vim 没有原生的类的支持但是你可以用字典模拟基本的类。为了定义一个类的方法可以在函数声明时使用 dict 关键字来将内部字典暴露为 self 关键字
let MyClass {foo: Foo}
function MyClass.printFoo() dictecho self.foo
endfunction类的实现更类似于 singleton为了在 VimScript 中创建类的实例我们对字典使用 deepcopy() 方法进行拷贝实例化
:let myinstance deepcopy(MyClass)
:call myinstance.printFoo()
Foo
:let myinstance.foo Bar
:call myinstance.printFoo()
Bar接下来做什么
现在既然你已经知道了大致原理下面给你推荐一些好的资源。
教程
Vim 中文帮助文档usr_41 - 编写 Vim 脚本和 API 列表Vim 脚本指北Vim 脚本开发规范
其他
知乎Vim 专栏
感谢
希望你觉得本文对你有用感谢阅读。