豪仕知识网--知识就是力量!

微信
手机版
生活常识

vim编辑器插件开发实例和讲解/vim插件大全

作者 :东方不败 2024-01-06 09:06:57 围观 : 评论

vim编辑器插件开发实例和讲解/vim插件大全

豪士君测试所用平台

vim编辑器插件开发实例和讲解,一起来看看吧,希望能帮助到您,更多请关注豪仕知识网。

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

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

Vim文本编辑器 7.2 绿色版 评分: 3.3 类别: 文本编辑 大小:9.2M 语言: 英文 查看详细信息 >>

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

【宏命令】

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

【自定义命令】

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

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

●☛█▼▲豪仕知识网◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲

1 :sort 2:g/^\(.\+\)$\n\1/d如果每次都敲入这两行命令,估计你也嫌麻烦。可以自定义为一个命令,这样就可以直接用简短方式执行了。

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

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

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

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

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

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

http://www.haoz.net●☛█▼▲◐●☛█▼▲◐◐◐◐●☛█▼▲◐豪仕知识网●☛█▼▲豪仕知识网

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

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

【插件开发】

HTTP://WWW.haoz.net◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐豪仕知识网

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

// art.vim if exists("b:did_ftplugin") finish endif run ftplugin/lisp.vim setl lw-=ifsetl lw+=def-art-fun,deffacts,defglobal,defrule,defschema, \for,schema,while其中一开始判断是否已经加载了文件,防止重复加载。然后调用了lisp.vim文件,最后进行了一些操作,还可以继续定义自己的函数。这就是插件的常见基本结构了。

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识网HTtp://www.haoZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

【开发实例】

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

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HtTp://wWW.haoz.net豪仕知识网●●●●●●●●●●●●●●●●●●●●●●●●●●

1if &cp || exists("g:loaded_filter") 2finish 3endif 4let 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 -= 1 let s:str = substitute(s:str, a:part, '', '') call setline(s:num + 1, s:str) unlet s:str endwhile unlet s:num returnendfunc   函数都是func开头,名字大写字母开头,可以传递参数。我简单说一下这个函数的功能:

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

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

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

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

source $VIMRUNTIME/ftplugin/filter.vim   然后重启vim,再次执行就可以了。

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

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

◐◐◐◐●☛█▼▲豪仕知识网███████http://www.haOZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

func Uc(flag)

let s:pre = a:flag[0]

豪仕知识网http://www.haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

let s:end = a:flag[1]

豪仕知识网http://www.haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

let s:num = line('$')

let s:count = {}

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

while(s:num)

let s:str = getline(s:num)

let s:num -= 1

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

let s:first = stridx(s:str, s:pre)

if( s:first == -1)

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

continue

◐◐◐◐●☛█▼▲豪仕知识网███████http://www.haOZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

endif

let s:first += 1

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

let s:second = stridx(s:str, s:end)

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

if( s:second == -1)

continue

HTTP://WWW.haoz.net豪仕知识网采集不好玩哦◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐撒旦法师打发斯蒂芬

endif

let s:str = strpart(s:str, s:first, s:second - s:first)

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

if( has_key(s:count, s:str) )

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

let s:count[s:str] += 1

else

let s:count[s:str] = 1

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

endif

unlet s:str

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HtTp://wWW.haoz.net豪仕知识网●●●●●●●●●●●●●●●●●●●●●●●●●●

endwhile

for key in keys(s:count)

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

echo 'key=' key ',value=' s:count[key]

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HtTp://wWW.haoz.net豪仕知识网●●●●●●●●●●●●●●●●●●●●●●●●●●

endfor

unlet s:pre

unlet s:end

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HtTp://wWW.haoz.net豪仕知识网●●●●●●●●●●●●●●●●●●●●●●●●●●

unlet s:num

unlet s:count

return

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

endfunc

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

【总结】

◐◐◐◐●☛█▼▲豪仕知识网HT●☛█▼▲◐◐◐◐●☛█▼▲

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

HTTP://WWW.haoz.net◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐豪仕知识网

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

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

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

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

●☛█▼▲豪仕知识网◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲

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

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

Vim文本编辑器 7.2 绿色版 评分: 3.3 类别: 文本编辑 大小:9.2M 语言: 英文 查看详细信息 >>

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HtTp://wWW.haoz.net豪仕知识网●●●●●●●●●●●●●●●●●●●●●●●●●●

【宏命令】

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

豪仕知识网http://www.haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

【自定义命令】

HTTP://WWW.haoz.net豪仕知识网采集不好玩哦◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐撒旦法师打发斯蒂芬

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

1 :sort 2:g/^\(.\+\)$\n\1/d如果每次都敲入这两行命令,估计你也嫌麻烦。可以自定义为一个命令,这样就可以直接用简短方式执行了。

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

1 :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为后缀。例如:

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HtTp://wWW.haoz.net豪仕知识网●●●●●●●●●●●●●●●●●●●●●●●●●●

// art.vim if exists("b:did_ftplugin") finish endif run ftplugin/lisp.vim setl lw-=ifsetl lw+=def-art-fun,deffacts,defglobal,defrule,defschema, \for,schema,while其中一开始判断是否已经加载了文件,防止重复加载。然后调用了lisp.vim文件,最后进行了一些操作,还可以继续定义自己的函数。这就是插件的常见基本结构了。

【开发实例】

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

http://www.haoz.net●☛█▼▲◐●☛█▼▲◐◐◐◐●☛█▼▲◐豪仕知识网●☛█▼▲豪仕知识网

1if &cp || exists("g:loaded_filter") 2finish 3endif 4let g:loaded_filter = "v1"   这里你还可以自己修改一下loaded_filter,改为其他变量,这样就能够区分你自己的插件了。

◐◐◐◐●☛█▼▲豪仕知识网███████http://www.haOZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

然后是定义函数:

func Del(part) let s:num = line('$') while(s:num) let s:str = getline(s:num) let s:num -= 1 let s:str = substitute(s:str, a:part, '', '') call setline(s:num + 1, s:str) unlet s:str endwhile unlet s:num returnendfunc   函数都是func开头,名字大写字母开头,可以传递参数。我简单说一下这个函数的功能:

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

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识网HTtp://www.haoZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

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

source $VIMRUNTIME/ftplugin/filter.vim   然后重启vim,再次执行就可以了。

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

◐◐◐◐●☛█▼▲豪仕知识网HT●☛█▼▲◐◐◐◐●☛█▼▲

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

func Uc(flag)

let s:pre = a:flag[0]

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

let s:end = a:flag[1]

let s:num = line('$')

let s:count = {}

http://www.haoz.net●☛█▼▲◐●☛█▼▲◐◐◐◐●☛█▼▲◐豪仕知识网●☛█▼▲豪仕知识网

while(s:num)

let s:str = getline(s:num)

●☛█▼▲豪仕知识网◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲

let s:num -= 1

●☛█▼▲豪仕知识网◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲

let s:first = stridx(s:str, s:pre)

◐◐◐◐●☛█▼▲豪仕知识网http://www.haOz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

if( s:first == -1)

continue

HTTP://WWW.haoz.net◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐豪仕知识网

endif

let s:first += 1

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HtTp://wWW.haoz.net豪仕知识网●●●●●●●●●●●●●●●●●●●●●●●●●●

let s:second = stridx(s:str, s:end)

if( s:second == -1)

continue

◐◐◐◐●☛█▼▲豪仕知识网███████http://www.haOZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

endif

let s:str = strpart(s:str, s:first, s:second - s:first)

http://www.haoz.net●☛█▼▲◐●☛█▼▲◐◐◐◐●☛█▼▲◐豪仕知识网●☛█▼▲豪仕知识网

if( has_key(s:count, s:str) )

http://www.haoz.net●☛█▼▲◐●☛█▼▲◐◐◐◐●☛█▼▲◐豪仕知识网●☛█▼▲豪仕知识网

let s:count[s:str] += 1

else

let s:count[s:str] = 1

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HtTp://wWW.haoz.net豪仕知识网●●●●●●●●●●●●●●●●●●●●●●●●●●

endif

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

unlet s:str

endwhile

HTTP://WWW.haoz.net◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐豪仕知识网

for key in keys(s:count)

echo 'key=' key ',value=' s:count[key]

endfor

豪仕知识网http://www.haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

unlet s:pre

unlet s:end

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

unlet s:num

●☛█▼▲豪仕知识网◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲

unlet s:count

return

endfunc

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

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

HTTP://WWW.haoz.net◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐豪仕知识网

【总结】

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

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

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

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

http://www.haoz.net●☛█▼▲◐●☛█▼▲◐◐◐◐●☛█▼▲◐豪仕知识网●☛█▼▲豪仕知识网

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

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

◐◐◐◐●☛█▼▲豪仕知识网███████http://www.haOZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

以上就是vim编辑器插件开发实例和讲解的相关内容分享,字数约11943字,希望这对大家有所帮助!豪仕知识网往后会继续推荐vim编辑器插件开发实例和讲解相关内容。

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

相关文章