VIM使用进阶:VIM脚本初步

小例子

新建一个vim脚本test.vim,输入下面的代码,并保存

vim9script
var i = 1
while i < 5
  echo "count is" i
  i += 1
endwhile

然后输入

:source %

即可看到上述代码被执行。当然,source %执行的是文本内容,对文件名的后缀是无要求的。但首行必须是vim9script,表明此为vim9脚本文件。

考虑到大部分vim使用者都是编程大佬,对于var i = 1while等语句,但凡有一点编程直觉,都会看懂。

唯一需要说明的是,如果不小心写了死循环,可以通过Ctrl C或者Ctrl+Breakspace终止。

下面对VIM9Script中通用的编程元素做一个基础的解释,包括变量、数据类型、运算符、函数以及控制流。

变量

VIM中的变量分为局部和全局变量两种,和一般编程语言不同,在VIM中所谓的全局变量,可以贯穿当前VIM程序打开的任何一个VIM脚本。

通过var声明的变量为局部变量,通过g:声明的变量则是全局变量。

例如在a.vim中输入

vim9script
var test_a = 5
g:test_b = 6

保存并执行之后,在命令模式下调用这两个变量,

:source %       #编译执行a.vim
:echo test_a    #将会报错
:echo g:test_b
6      

VIM中内置了一些全局变量,可输入:let查看,在定义了g:test_b之后,test_b #6的确出现在了全局变量中。而通过:let获取的全局变量,除了前面一些无后缀的变量名外,后面还出现了b:v:等开头的变量。

这些变量也不同程度上具备全局性,其说明如下

buffer-variableb:局部于当前缓冲区。
window-variablew:局部于当前窗口。
tabpage-variablet:局部于当前标签页。
global-variableg:全局。
local-variablel:局部于函数 (只限于老式函数内使用)。
script-variables:局部于 :source 的 Vim 脚本。
function-argumenta:函数参数 (只限于老式函数内使用)。
vim-variablev:Vim 预定义的全局变量。

g:test_b只是一个临时用于演示的全局变量,其实是毫无卵用的,故而可用unlet对其删除

:unlet g:test_b

这回再输入:let调用全局变量就看不到test_b了,而且echo也会报错。

数据类型

在VIM9脚本中,字符串通过单引号或者双引号进行标识,区别在于,双引号字符串开启了反斜杠转义;单引号字符串中,除了单引号需要用两个单引号表示之外,不对任何其他字符做转义。

双引号中常见的转义字符有

\t<Tab>\n换行
\r回车\eesc
\b退格""
\反斜杠
\<C-W>CTRL-W

数值则可以为十进制、十六进制、八进制或者二进制

十进制十六进制八进制二进制
300x1e/0X1e0o36/0O360b00011110/0B00011110

echo在打印数值时,会自动转为十进制,例如

:echo 0x15
21

由于echo可以同时打印多组值,那么在打印两个负值时就会产生逻辑上的歧义。在VIM9中,会将第二个负号优先识别为减号,这当然是是符合程序员直觉的;如希望输出两个负值,那么可以将后面的值用括号括起来。

:echo -5 -5
-10
:echo -5 (-5)
-5 -5

尽管通过var新建变量时并未说明数据类型,但VIM并不允许将一个数值变量重新赋值为字符串。换言之,VIM脚本是静态类型语言,之所以var a = 9并未声明变量类型,得益于自动的类型推导。

如果一个变量尚未赋值,那么类型无从推导,就需要在声明时定义数据类型

vim9script
var name: string
var age: number

运算符

VIM中的运算符如下

+-*/%加减乘除余
a ? b : c三元表达式
==/!=等于/不等于
>/</>=/<=大于/小于/大于等于/小于等于
..字符串连接
=~/!~字符串匹配/不匹配

条件和循环

VIM中通过if..elseif...else...endif来完成条件语句

if {condition}
    {statements}
elseif{condition}
    {statements}
else
    {statements}
endif

while循环以endwhile作为结尾标志,在循环语句中,可通过continue来跳过某一次循环,通过break跳出循环,这与大多数编程语言是一样的。

函数

在VIM中通过关键字def定义函数,通过enddef来结束函数,其基本方法如下,唯一需要注意的是,函数名必须以大写字母开始。

def Min(num1: number, num2: number): number
    var smaller: number
    if num1 < num2
      return num1
    else
      return num2
    endif
enddef

首行表示,这是一个名为Min的函数,输入两个数字num1, num2,输出也是一个数字,不难看出,其返回值是二者中间较小的那个。

return后面可以接表达式,即上式可写为

def Min(num1: number , num2: number): number
    return num1 < num2 ? num1 : num2
enddef

函数同样可以定义为全局的,例如

def g:Min(num1: number, num2: number): number
    return num1 < num2 ? num1 : num2
enddef

这样,在编译后就可以在:模式下直接调用了,编译时别忘了写vim9script,以及保存。

:source %
:echo g:Min(5,1)
1

删除全局函数可用

:delfunction SetSyn

函数中return并不是必须的,即函数并不一定要有返回值

def test(txt: string)
    echo txt
enddef

当返回值定义为any时,表示返回值数据类型不确定。

def GetValue(): any
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本文主要介绍: vim使用技巧、 vim的配置及vimrc、 vim的命令和vim的插件。 内容极其详细,且用doc文档编写,整理得整齐、美观。 [目录] vim使用进阶: 序言 本文是本系列的序言,讲述我使用vim的经历和心得,以及对vim初学者的一些建议。文中的抓图展示了我的vim使用环境。 vim使用进阶: 使用会话和viminfo 本文介绍如何使用vim的会话 (session) 和viminfo来恢复vim使用环境。如果你需要经常恢复到相同工作环境,此功能非常有用,你不必一次次重新打开文件、设置你的工作环境。 vim使用进阶: vimrc初步 本文简要介绍了vimrc的知识以及如何使用vimrc保存vim的配置。文中还提供了一些键映射(map),使用这些映射可以快速编辑和加载vimrc。关于vimrc的更多应用,参见本系列其它文章。 vim使用进阶: 保存项目相关配置 本篇主要以path选项为例,讲述如何保存和恢复项目相关的配置。在使用vim的过程中,你可能同时打开几个project,每个project的配置可能都不相同,文中介绍了两种方法来保存每个project自身的独有配置。一种是使用一个固定的vim配置脚本保存project相关的path设置、按键映射等;另外一种是利用前面文章所介绍的会话(session)机制。 vim使用进阶: 使用标签(tag)文件 本文介绍了如何使用Exuberant ctags生成tag文件以及在vim中如何使用tag文件进行跳转、查找等操作。还简要介绍了tag文件的格式,在后面介绍的Lookupfile插件中,会利用tag文件便捷的查找、打开文件。 vim使用进阶: 使用taglist插件 本文介绍如何使用taglist插件(plugin)来查看程序中的标签(tag),并介绍了taglist插件的配置和用法。taglist插件利用Exuberant ctags程序生成标签文件,并提供像Source Insight那样的标签窗口,可以方便的跳转到函数、变量等标签所在的位置。 vim使用进阶: 文件浏览和缓冲区浏览 本节介绍了如何在vim中浏览文件,以及如何查看当前打开的缓冲区。利用netrw插件,可以方便的在vim中浏览各个目录、打开指定文件,而不用切换到文件浏览器或shell;当然,netrw插件的作用并不仅仅局限于此。利用bufexplorer插件,则可以方便的查看打开的缓冲区(buffer),在缓冲区间进行切换。本文的最后介绍了winmanager插件,使用这个插件,可以把netrw插件、bufexplorer插件和taglist插件整合起来,使vim看起来更像一个集成开发环境(IDE)。 vim使用进阶: lookupfile插件 如果你在开发一个大的项目,当你想在一大堆文件中查找或者编辑指定文件时,Lookupfile插件是必不可少的。使用它,可以快速查找项目文件、可以在缓冲区查找指定文件、可以浏览指定目录等。在查找时甚至可以使用正则表达式(regex),在你只记得部分文件名或目录名时,这可是救命的手段。 vim使用进阶: 开启文件类型检测 vim最吸引人的一点是,它支持无穷多的文件类型,而且能够随意扩展。在本文主要介绍如何打开文件类型检测的功能,以及如何使用基于文件类型的插件(filetype plugin)。正因为有了文件类型检测的功能,我们才可能针对不同的类型的文件,定义不同的键映射(map)、设置不同的选项,进行语法高亮的染色(后续文章中介绍)…你可以实现任意你想实现的功能。 vim使用进阶: 乱花渐欲迷人眼 - 语法高亮 VIM并不是只有黑色两色。正相反,它提供了非常灵活的机制允许用户自定义色彩。运行在终端中的VIM,由于终端本身的限制,只能使用若干种固定的颜色;但对于GVIM来讲,你可以根据你的喜好调出任意的颜色。本文介绍的,正是vim的语法高亮功能。 vim使用进阶: 程序员的利器 - cscope 在前面的文章中介绍了利用ctags生成的tag文件,跳转到标签定义的地方。但如果想查找函数在哪里被调用,或者标签在哪些地方出现过,ctags就无能为力了,这时需要使用更为强大的cscope。本文就介绍如何使用cscope,有了它,你可以把source insight抛到一边去了。 vim使用进阶: 剑不离手 - quickfix vim由一个程序员开发,并且为更多的程序员所使用,所以vim对开发人员的强大支持,也就可以理解了。quickfix模式的引入就是一个例子。quickfix模式,是一种加速你开发的工作方式,使你不必离开vim,就可以快速的完成”编辑-编译-修正”你的程序。它不仅仅对开发人员有用,只要你的工作有类似”编辑-编译-修正”的过程,它就可以极大的简化你的工作。 vim使用进阶: 智能补全 使用过Source Insight的人一定对它的自动补全功能印象深刻,在很多的集成开发环境中,也都支持自动补全。vim做为一个出色的编辑器,这样的功能当然少不了。本文主要介绍vim的OMNI补全。将在下一篇中介绍其它的补全方式。 vim使用进阶: 自动补全 本文继续介绍vim的补全功能。作为一个通用的编辑器vim实现的补全功能并不仅仅限于对程序的补全,它可以对文件名补全、根据字典进行补全、根据本缓冲区或其它缓冲区类似的内容进行补全、根据文件语法补全等等,它甚至允许用户自己编写函数来实现定制的补全。本文简要介绍了这些补全的方法。 vim使用进阶: 指随意动,移动如飞 (一) VIM提供的移动方式多如牛毛,但我们并不需要掌握全部这些命令,只需要掌握最适合自己的那些命令。本文介绍了最常用的一些移动命令,在下篇文章中将介绍更高级的移动方法。 vim使用进阶: 指随意动,移动如飞 (二) 本文介绍如何在vim中移动,主要涉及如何使用跳转表(jump-motions)、使用标记(mark)、使用折行(fold),以及如何在程序中移动。 vim使用进阶: 在VIM使用GDB调试 本文介绍了如何使用vimgdb补丁在vim中用gdb调试程序,同时还介绍了vim的编译方法。然而,vim只是一个编辑器,而不是一个集成开发环境(IDE),所以它对调试的支持很有限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值