vim是一个强大的编辑器,以命令行操作的快速性著称。不过,玩着玩着,感觉也不能解决自己工作中的一些特别的问题。所以现在你可以有三种方法来自定义一些命令,完成自己个性化的需求。下面就来一一尝试。

【宏命令】

  可以用宏命令来批量处理。不过退出之后就消失了,下次不能再使用,所以这个不是一个永久性的方法。短时解决重复工作是非常高效的。

【自定义命令】

  可以自定义命令,这个也是简短操作的一个好方法。例如:在gvim下将当前文本去掉重复行,就可以使用以下两个命令:

:sort
:g/^\(.\+\)$\n\1/d

如果每次都敲入这两行命令,估计你也嫌麻烦。可以自定义为一个命令,这样就可以直接用简短方式执行了。

:command! Td :sort|:g/^\(.\+\)$\n\1/d

  将上面这一个作为一个独立行放入vim的配置文件中。window下是Vim\_vimrc,linux下是~/.vimrc文件。这样启动vim的时候就会自动定义好这个命令,直接就可以使用了。

  关于command自定义冒号命令,我这里罗嗦几句讲一下。

1.以:command开头,如果是重新定义,command后加!号。没有定义过也可以加上。如果需要指定可能的参数个数,可以加上-xargs=n配置项。

2.空格之后紧跟新的命令名字,请以大写字母开头,后面的是否采用驼峰命名法取决于你自己。

3.然后就是命令操作的集合了。用|分割多个命令,这里跟平常|在编程中的语义不同,请注意。

  对于这样短一点的命令可以采用这种方式去做,如果操作太多,那么需要在command后面加入很多代码,这不是vim想看到的。可以将多余的代码放入函数中,这是今天我想说的主题。

【插件开发】

插件文件放在\ftplugin类似的目录中,以.vim为后缀。例如:

// art.vim
if exists("b:did_ftplugin")finish
endifrun ftplugin/lisp.vimsetl lw-=if
setl lw+=def-art-fun,deffacts,defglobal,defrule,defschema,\for,schema,while

其中一开始判断是否已经加载了文件,防止重复加载。然后调用了lisp.vim文件,最后进行了一些操作,还可以继续定义自己的函数。这就是插件的常见基本结构了。

【开发实例】

首先,加入头部,防止重复加载。

if &cp || exists("g:loaded_filter")finish
endif
let g:loaded_filter = "v1"

  这里你还可以自己修改一下loaded_filter,改为其他变量,这样就能够区分你自己的插件了。

然后是定义函数:

func Del(part)let s:num = line('$')while(s:num)let s:str = getline(s:num)let s:num -= 1let s:str = substitute(s:str, a:part, '', '')call setline(s:num + 1, s:str)unlet s:strendwhileunlet s:numreturn
endfunc

  函数都是func开头,名字大写字母开头,可以传递参数。我简单说一下这个函数的功能:

  首先获取全文行数,放到num变量中。然后调用getline函数,取出0至num-1行的内容,将part部分替换为空字符串,也就是删除。然后调用setline函数,更新该行的内容为替换之后的内容。这个函数很简单,作用就是从全文中删掉一个字符串。要在vim中执行这个函数只需要输入:

:call Del('j')

  回车之后就会执行。如果提示没有找到Del函数,可以在配置文件中加入对自定义文件的引用:

source $VIMRUNTIME/ftplugin/filter.vim

  然后重启vim,再次执行就可以了。

  如果我们想自定义删除两个符号之间的内容,那么可以将上面函数substitute中的第二个参数修改为正则表达式,进行匹配和替换就行了。

  这里我要讲另外一个实例:

func Uc(flag)let s:pre = a:flag[0]let s:end = a:flag[1]let s:num = line('$')let s:count = {}while(s:num)let s:str = getline(s:num)let s:num -= 1let s:first = stridx(s:str, s:pre)if( s:first == -1)continueendiflet s:first += 1let s:second = stridx(s:str, s:end)if( s:second == -1)continueendiflet s:str = strpart(s:str, s:first, s:second - s:first)if( has_key(s:count, s:str) )let s:count[s:str] += 1elselet s:count[s:str] = 1endifunlet s:strendwhilefor key in keys(s:count)echo 'key=' key ',value=' s:count[key]endforunlet s:preunlet s:endunlet s:numunlet s:countreturn
endfunc

  这个函数的作用是根据参数字符串part的第一个字符和第二个字符去搜索全文每行,按照匹配到的这两个字符之间的内容进行统计,计算出重复量,显示到命令输入栏的上方。这个功能也可以通过linux下的awk来实现,不过经过这样自己定义之后的函数可以直接调用,一次开发,多次使用,效率更高。

【总结】

  我想讲述的就是这些了,如果你还有更多兴趣想学习更多,可以参考vim用户手册,是一个pdf的电子书,不用紧张,有很好的中文翻译版本,其中详细列举了vim插件开发的语法。

  你还可以通过:function命令查看现在已经定义的函数,然后:function Del查看Del函数的定义内容,这样来学习更多的插件编程技巧。

  你还可以通过:help substitute来查看substitute函数的相关文档,这个文档一般是英文的。计算机英文只要你坚持看,你会发现他们的措辞很类似,单词也就是那几个,比较好掌握。

  你还可以去插件目录下去阅读其他插件的源代码,其中不懂的函数就help一下,然后练习练习就会了,更多插件完全就难不倒你了。

  所以现在你就可以去动手开始做自己的插件了,祝你成功。

转载于:https://www.cnblogs.com/Hiker/archive/2012/11/04/vimplugin.html

布同:vim插件开发实例和讲解相关推荐

  1. VI高级命令集锦及VIM应用实例

          VI高级命令集锦及VIM应用实例 1.交换两个字符位置 xp 2.上下两行调换 ddp 3.把文件内容反转 :g/^/m0/ (未通过) 4.上下两行合并 J 5.删除所有行 dG 6.从 ...

  2. python列表split_Python-split()函数实例用法讲解

    在Python中,split() 方法可以实现将一个字符串按照指定的分隔符切分成多个子串,这些子串会被保存到列表中(不包含分隔符),作为方法的返回值反馈回来. split函数用法 split(sep= ...

  3. 【chorme插件开发】第四节:html+js实现的功能插件开发实例

    ###html+js实现的功能插件开发实例 插件结构 icon.pngpopup.htmlpopup.jsmanifest.json manifest.json文件配置 { "manifes ...

  4. 【VLAN高级技术】--- MUX VLAN运行原理及实例配置讲解

    文章目录 一.MUX VLAN产生原因 二.MUX VLAN运行原理 三.实例配置讲解(重点!!!) 四.MUX VLAN配置命令 一.MUX VLAN产生原因 个人认为MUX VLAN主要是为大中型 ...

  5. S3C2440上LCD驱动 (FrameBuffer)实例开发讲解

    1.S3C2440上LCD驱动 (FrameBuffer)实例开发讲解 其中的代码也可直接参考:drivers/video/s3c2410fb.c 以下为转载文章,文章原地址:http://blog. ...

  6. 利用python addin插件开发实例

    利用python addin插件开发实例 转自http://blog.csdn.net/liyuanxiang1984 https://blog.csdn.net/liyuanxiang1984/ar ...

  7. 视频教程-韦东山生活实例演绎法讲解蓝牙-嵌入式

    韦东山生活实例演绎法讲解蓝牙 2003 年毕业于中国科学技术大学,电子专业.软件专业双学位.近10年嵌入式开发经验,曾ZTE公司负责Linux底层系统开发. 近5年作为特聘讲师在若干个有名的培训机构讲 ...

  8. 【VLAN高级技术】--- QinQ运行原理及实例配置讲解

    文章目录 一.QinQ概述 二.QinQ运行原理 三.QinQ类型 四.QinQ实例配置讲解(重点!) 五.QinQ配置命令(灵活QinQ) 一.QinQ概述 现在以太网技术在网络中进行了大量的部署, ...

  9. S3C2440上MMC/SD卡驱动实例开发讲解(二)

    嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤.一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便.如有错误之处,谢请指正. 共享资源,欢迎转载:http:/ ...

最新文章

  1. 薛宇 AI boom
  2. C 判断 —— switch语句(多个switch值与一组语句联系起来、case顺序是可任意的,default不一定是最后一个case)
  3. DL之PSPNet:PSPNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  4. Linux忘记 root密码的解决办法
  5. Java 第四次作业
  6. 2021年软考网络工程师备考资料
  7. python3 centos7-linux 安装
  8. SQLyog详细使用教程
  9. 大数据时代下的人工智能医疗
  10. 云开发数据库update函数控制台显示更新成功,但数据库中的数据并没有更新(已解决)
  11. vue 如何下载 xlsx文件 这里介绍两种 一种是命名文件夹再下载 一种是不命名随机名称下载
  12. GNU Make构建工具使用教程
  13. 无线ap上网设置教程
  14. poj-2115 C Looooops 扩展欧几里德算法求最小非负整数解
  15. tkinter将图标写入py文件
  16. 【2058】简单计算器
  17. 多核环境下的内存屏障指令
  18. rosdep update 错误
  19. 米公益完结项目结项反馈——环保梦想,你我一同点亮
  20. HTTP 请求方法(GET、POST 和 PUT)

热门文章

  1. 微商团队长的五条管理心法
  2. 选什么专业?找什么样的工作?教你四个维度
  3. 今天tiktok小社群更新 第5个项目行业案例
  4. 怎么能把你的公司快速做大呢
  5. 程序员的工资普遍在20k以上
  6. 双网关,可以上内网或外网,如何同时上内网和外网?
  7. 为什么至今为止有些人的电脑系统还在使用XP?
  8. Power BI Desktop报告中的Web URL配置
  9. JFinal上传文件时用getFile()方法报错
  10. Python re模块将字符串分割为列表