Vim技能修炼教程(14) - 写个ex命令吧

写个ex命令吧

我们第二节开始就写了语法高亮的插件。这一节,我们学习第二种插件的写法,就是写个我们自己的ex命令。

自定义ex命令的命令是:command,我们在~/.vim/下建立一个plugin目录,然后创建一个test.vim之类的文件:

:function Hello()
:echom "Hello,World!"
:endfunction

:command Hello call Hello()

首先,我们定义一个函数。函数名的首字母必须大写。函数中调用:echom去显示一个字符串。
然后我们通过:command来定义一个ex命令,命令的作用是去调用Hello()函数。

有了写新的ex命令的出口,我们现在终于可以使用Vimscript欢快地编程啦。

if语句

作为最基础的分支语句,if将面临学习Vimscript中的第一个坑,就是字符串的真假性的问题。

我们看下下面的例子:

:function Hello()
:if "Hello"
:echom "Hello is true"
:else
:echom "Hello is false"
:endif
:endfunction

我们可以通过:call Hello()来调用它,或者干脆封装成一个ex命令。

:command Hello call Hello()

不管如何,输出结果为:Hello is false。也就是说,Vimscript将"Hello"字符串转换成了数字0,于是,它是v:false.

字符串比较

另外在比较时需要注意的是字符串比较。在Vim中,"=="比较字符是否大小写敏感是跟用户的设置相关的。如果不想受这个影响,建议使用确定的大小写不敏感比较符"==?"和大小写敏感比较符"==#"

不光是"==", "!=", ">", "<", ">=", "<=", "is", "isnot"都有对就应大小写敏感和不敏感的版本。
正则匹配也是一样,"=~"和"!~"也有"=~#"和"=~?"的版本。

函数

  • 定义函数 :function, :endfunction
  • 返回值 :return
  • 调用函数 :call

在函数中使用参数时,请注意使用a:这个作用域描述符。

另外,与大部分vim命令一样,函数调用:call命令支持使用范围来调用。我们看个例子:

:function HelloArgs(arg)
:echom "Hello!" . a:arg
:endfunction

我们输入:

1,3call HelloArgs(getline("."))

结果为:

Hello!:function HelloArgs(arg)
Hello!:echom "Hello!" . a:arg
Hello!:endfunction

除了通过范围调用外,函数参数也可以支持不定个数。其实就是以列表方式传递参数。

循环结构

上节讲列表的时候,我们已经学习了for循环。

while循环

Vimscript还支持:while循环,例:

:function PrintStar(arg)
:let l:c = 0
:while l:c<a:arg
:echo "*"
:let l:c += 1
:endwhile
:endfunction

arg将是打印的行数,我们这么调用:

:call PrintStar(10)

break和continue

Vimscript中也支持:break退出循环和:continue继续下一次循环。

异常处理

Vimscript支持,:try ... :catch ... :finally :endtry的结构。
当然也支持:throw抛出一个异常。

try...finally结构,还可以用来处理资源释放。

时间: 2024-08-03 20:46:09

Vim技能修炼教程(14) - 写个ex命令吧的相关文章

Vim技能修炼教程(2) - 语法高亮速成

语法高亮速成 我们继续在人间修行Vim技能之旅.上一次我们学习了如何通过vundle安装插件,这次我们迅速向写插件的方向挺进. 我们先学习一个最简单的语法高亮插件的写法. 语法高亮基本上是由三部分组成: 配色方案 正则表达式 配色方案和正则表达式的规则对应关系 简单的三步法写语法高亮 第一步,写匹配的正则表达式 我们举个最简单的例子,以Android的log为例,Android的log格式如下: --------- beginning of system 05-05 17:55:48.909 I

Vim技能修炼教程(4) - 基本功

基本功 前面我们学会了插件管理器和如何实现语法高亮,相信大家已经从中体会到了vim插件的强大功能.现在,是时候回来补一补基本功了. Vi有三种主要模式,正常模式,插入模式和可视化模式.正常我们推荐的方式是所有的移动命令只在正常模式下进行,只有在修改的时候再进入插入模式. 这个切换是如此频繁,所以Vi提供了很多快速切换模式的命令.Vim的难学之处之一就是命令太多. 模式切换的好处 如<Practical Vim>中第8条所说,正常模式和插入模式的切换,可以为撤销编辑带来方便.在没有模式切换的文本

Vim技能修炼教程(1) - 使用vundle管理插件

世界上有两个伟大的编辑器:一个是emacs,一个是vi.它们从诞生以来,一直在Unix/Linux世界得到最广泛的支持. 尽管过了几十年,在Windows平台上和跨平台上有层出不穷的后起之秀不断挑战它们的地位,比如编辑器界的Sublime Text,Ultra Editor,Notepad++,pspad,Atom,Visual Studio Code,IDE界的Eclipse, IntellJ IDEA, NetBeans等等,但是它们的地位从未动摇过. 写C#的最好IDE一定是Visual

Vim技能修炼教程(3) - 语法高亮进阶

语法高亮进阶 首先我们复习一下上节学到的三个命令: syntax match用于定义正则表达式和规则的对应 highlight default定义配色方案 highlight link将正则规则和配色方案对应起来 但是,定义好了规则,如何让它自动生效呢?我们需要识别文件类型. 识别文件类型 我们创建一个新插件,建立一个ftdetect目录,然后为这个类型创建一个vim文件,比如之前logcat的例子,我们就建立一个logcat.vim. 例子我们还是找github上的:https://githu

Vim技能修炼教程(10) - 代码跳转

程序员功能 前面我们用了5讲的篇幅来讲基本编辑的基本功:第4讲是基本操作,第5讲是操作符,第6讲行编辑ex命令,第7讲可视模式,第8讲多窗口,第9讲缓冲区和标签页. 从这一讲开始,我们从通用功能向程序员常用功能挺进.首先我们从浏览代码最常用的跳转功能开始. 代码跳转 代码跳转,需要传说中的Exuberant Ctags工具,地址在:http://ctags.sourceforge.net/. 当然大家根据系统不同各显神通吧.比如我是macOS,就通过Homebrew来安装了.大家手头有什么"ap

Vim技能修炼教程(8) - 多窗口

多窗口 如果一个vim只能开一个窗口,那肯定是有点low.尤其是写代码的时候,打开多个文件是经常的需求. 速成教程 横着切成两个 :split 文件名 上下切换窗口 Ctrl-W加上上下键,可以实现上下切换窗口. 关掉一个窗口 跟退出vi一样.比如正常模式下的ZZ,再比如:q. 竖着切成两个 :vsplit 文件名 左右切换窗口 Ctrl-W加上左右键 循环切换窗口 Ctrl-W w 好了,欢迎进入多窗口的世界.基本功能就这么多,大家先把多窗口用起来吧. 再学一点 分割窗口 打开只读文件并水平分

Vim技能修炼教程(16) - 浮点数计算函数

浮点数计算函数 这一节的所有函数,只有在vim编译时支持了+float时才有效. 三角函数 sin() : sine正弦函数 cos() : cosine余弦函数 tan() : tangent正切函数 asin() : arc sine反正弦函数 acos() : arc cosine反余弦函数 atan() : arc tangent反正切函数 atan2({X坐标},{Y坐标}) : arc tangent反正切函数 sinh() : hyperbolic sine 双曲正弦函数 cosh

Vim技能修炼教程(15) - 时间和日期相关函数

Vimscript武器库 前面我们走马观花地将Vimscript的大致语法过了一遍.下面我们开始深入看一下Vimscript都给我们准备了哪些武器.如果只用这些武器就够了,那么就太好了,只用Vimscript会导致最佳的兼容性.否则不管是用:python还是使用扩展库,都给可移植性带来麻烦. 随着Vim的广泛移植,Vimscript带来的可移植性还是很可观的.这是一门跨相当多平台可用的语言. 之前我们为了区分normal命令和ex命令,在脚本中使用ex命令的前面都加上了":"前缀.从这

Vim技能修炼教程(11) - 代码折叠

上一讲我们是程序员篇的第一讲,关于代码跳转.代码跳转是一个付出很少收获很大的功能.这一节我们开始一个收获很多,但是付出也相对多一点功能:代码折叠. 代码折叠 折叠的类型 折叠有下面几种类型: Manual: 手动创建折叠.但是退出vim后就一切都没了. Marker: 基于特定的字符组合进行折叠. Expr: 定义正则表达式来处理折叠,这是最终的解决方案. Indent: 这个最简单也最基本,根据缩进来折叠. Syntax: 根据程序语义进行折叠. 我们先看一个例子,左边是采用syntax方式进