前言
经过上一篇文章的vim插件开发之helloworld插件,我们学习到了如何开发一个简单的vim插件helloworld插件,该插件功能非常简单,只是打印一条语句“hello,world”,麻雀虽小,但五脏俱全,通过该示例我们了解了vim插件开发的基本流程。helloworld插件中,我们发现vim language的语法有点奇怪,和我们平时工作使用的语言有点不一样,这时我们就心想如果能够使用我们平常熟悉的语言来做vim插件开发,那就太好了,一方面效率比较高,另外一方面也节省了学习新语法的时间,可以更加深入的掌握自己所熟悉的语言。
很高兴的告诉您,您是可以这样做的,只要您的vim支持该类语言的开发即可。如何确定你的vim是否支持如python,perl 等之类的语言的特性呢?输入如下命令:
vim --version
以下是我的机器上,该命令的输出结果:
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May 14 2013 13:18:26)
Included patches: 1-415, 417-944
Modified by <bugzilla@>
Compiled by <bugzilla@>
Huge version without GUI. Features included (+) or not (-):
+arabic +file_in_path +mouse_sgr +tag_binary
+autocmd +find_in_path -mouse_sysmouse +tag_old_static
-balloon_eval +float +mouse_urxvt -tag_any_white
-browse +folding +mouse_xterm -tcl
++builtin_terms -footer +multi_byte +terminfo
+byte_offset +fork() +multi_lang +termresponse
+cindent +gettext -mzscheme +textobjects
-clientserver -hangul_input +netbeans_intg +title
-clipboard +iconv +path_extra -toolbar
+cmdline_compl +insert_expand +perl +user_commands
+cmdline_hist +jumplist +persistent_undo +vertsplit
+cmdline_info +keymap +postscript +virtualedit
+comments +langmap +printer +visual
+conceal +libcall +profile +visualextra
+cryptv +linebreak +python/dyn +viminfo
+cscope +lispindent -python3 +vreplace
+cursorbind +listcmds +quickfix +wildignore
+cursorshape +localmap +reltime +wildmenu
+dialog_con -lua +rightleft +windows
+diff +menu +ruby/dyn +writebackup
+digraphs +mksession +scrollbind -X11
-dnd +modify_fname +signs -xfontset
-ebcdic +mouse +smartindent -xim
+emacs_tags -mouseshape -sniff -xsmp
+eval +mouse_dec +startuptime -xterm_clipboard
+ex_extra +mouse_gpm +statusline -xterm_save
+extra_search -mouse_jsbterm -sun_workshop
+farsi +mouse_netterm +syntax
system vimrc file: "/etc/vimrc"
user vimrc file: "$HOME/.vimrc"
user exrc file: "$HOME/.exrc"
fall-back for $VIM: "/etc"
f-b for $VIMRUNTIME: "/usr/share/vim/vim73"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -I/usr/local/include -O2 -g -pipe -Wall -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: gcc -L. -Wl,-z,relro -rdynamic -Wl,-export-dynamic -Wl,--enable-new-dtags -Wl,-rpath,/usr/lib64/perl5/CORE -Wl,-z,relro -L/usr/local/lib -Wl,--as-needed -o vim -lm -lnsl -lselinux -lncurses -lacl -lattr -lgpm -ldl -Wl,--enable-new-dtags -Wl,-rpath,/usr/lib64/perl5/CORE -fstack-protector -L/usr/lib64/perl5/CORE -lperl -lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
从上述我们可以看到,支持的一些特性有:+perl, +python/dy, +ruby/dyn等等,所以我们完全可以使用这类语言来进行开发。
选择python的原因
为什么本篇文章我们选择python来介绍呢,主要有以下方面的原因:
-
- python语法比较简洁,简单,自从使用python的第一天就喜欢上了该语言,虽然一开始会有点不适应,但经过一段时间的训练之后,很快就适应并喜欢上该语言;
- python提供的库比较丰富,尤其是某些库的api设计的非常好,非常简洁,对于开发者来说,调用起来非常简单,但也有一些设计的非常ugly的库,比较著名的有urllib;
- 利用python写的著名vim插件也比较多,方便以后我们可以定制别人写的插件,从而做到更好的定制插件;
- 开发某类应用程序比较快速。
开发流程
经过上述描述之后,您一定想快速了解如何在vim插件开发中使用python语言?不急,听我python-helloworld插件慢慢道来:
既然要开发python-helloworld插件,那么我们首先用python写一个helloworld(),打印"hello,world",如下:
def helloworld():
print "hello,world"
python这块我们做好了,那么如何在vim插件中调用该方法呢?
接下来我们主要有两个工作,一是定义一个Helloworld命令,另外一个是将上述的python代码嵌入到vim插件中。
我们先来说第二个问题吧,这个比较简单,具体的嵌入如下所示:
python << EOF
def helloworld():
print "hello,world"
EOF
在“python << EOF”和“EOF”之间加入我们的python代码就可以了,是不是很简单,那么如何定义命令并调用我们的helloworld方法呢,其实也很简单,请继续阅读:
command! -nargs=0 Helloworld exec('py helloworld()')
其实上面的代码已经非常明了怎么做了,不过还是简单的说下吧。
command! 表示定义一条vim中的命令;
-nargs=0表示命令行参数为0,即没有命令参数;
Helloworld为具体的命令名称,首字母大写;
exec('py helloworld()') 执行python代码并调用helloworld()函数;
注:关于上述-nargs=0这块有必要说明一下,因为这里面有一个比较trick的地方,保不准你今后遇到了,查资料都比较难查。当命令行没有参数的时候,自然会想到-nargs=0,如果有一个参数,那么自然-nargs=1,当有2个参数呢,是不是就是-nargs=2呢?如果你实验了,就会知道,此时报错了,报错说2是无效的数字,所以当有2个或2个以上的参数时,和我们平时想得就不太一样。当遇到这个问题的时候,我们自然会google,baidu,bing,当你在网上搜索的时候,发现根本就找不到类似的问题,只找到一个可怜的信息,在vim中输入:help command,最后果然在这里面我们找到了答案:
-nargs=0 No arguments are allowed (the default)
-nargs=1 Exactly one argument is required
-nargs=* Any number of arguments are allowed (0, 1, or many)
-nargs=? 0 or 1 arguments are allowed
-nargs=+ Arguments must be supplied, but any number are allowed
当我看到上述信息的时候,如获珍宝啊。