分享 使用 ruby 开发 vim 插件

wosuopu · 2014年07月03日 · 最后由 jinleileiking 回复于 2014年07月08日 · 3389 次阅读

作为一个 Vimmer 和 Pythoner,之前折腾过用 python 编写 vim 插件。现在作为半个 Rubist,又开始继续折腾。

在开始编写插件之前,你需要确认 Vim 是否支持 Ruby,通过以下命令来判别:

$ vim --version | grep +ruby

如果输出为空,则表示你当前的 vim 不支持 Ruby,需要重新编译一下,并启用对 Ruby 的支持。

顺便说下我当前的环境是:

  • vim 7.4
  • ruby 2.1.0

环境检查没有问题那么就开始吧。
在~/.vim/plugin 目录下创建一个 demo.vim 文件。

在开头写上以下代码:

if !has('ruby')
    echo "Error: Required vim compiled with +ruby"
    finish
endif

这段代码就是用 VimL 编写的,它将检查 Vim 是否支持 Ruby。

接下来再判断该插件是否已经加载过了,以免重复加载:

if exists('g:loaded_ruby_demo_plugin')
    finish
endif
let g:loaded_ruby_demo_plugin = 1

所有的检查都没有问题,则开始插件的正文了。先定义一个函数。

function! DemoFun1()
ruby<<EOF
buf = VIM::Buffer.current
puts "current buffer name: #{buf.name} number: #{buf.number} length: #{buf.length}"
EOF
endfunction

function 与 endfunction 是 vim 中用于定义函数的,在”ruby<<EOF”和”EOF”之间部分的是 Ruby 代码。这个例子是输出当前缓冲区的名字、编号以及总行数。
执行命令:call DemoFun1(),应该就可以看到输出结果了。

然后再举个例子说下函数的参数处理。

function! DemoFun2(arg1)
ruby<< EOF
puts "you input: #{VIM.evaluate('a:arg1')}"
EOF
endfunction 

这里定义了一个函数接收一个参数,然后将其输出。使用 VIM.evaluate 将 vim 的变量转化为 Ruby 的变量。

为了方便我们再定义两个命令,以简化对这两个函数的调用。

command! -nargs=0 DemoFun1 call DemoFun1()  
command! -nargs=1 -rang DemoFun2 call DemoFun2(<f-args>)

要获取完整的代码可以访问: https://gist.github.com/wusuopu/c1182efefa85d4f6839b

接下来再简单说下 vim 中 Ruby 的使用。

vim 为 Ruby 提供了一个 VIM 模块,通过它可以在 Ruby 中访问 vim 的接口。同时还提供了两个全局变量:$curwin、$curbuf,它们分别代表了当前窗口对象以及当前缓冲区对象。

VIM 模块中有 Buffer 和 Window 两个对象,分别是用来对缓冲区和窗口进行操作的。同时 VIM 模块还提供了 message、set_option、command 和 evaluate 四个函数。

想要查看更多的帮忙信息,可以在 vim 中执行如下命令:

:help ruby

好了,先写这么多吧,其余的自己去尝试吧。

博客原文地址: http://www.xefan.com/archives/84117.html

好蛋疼。我会说我原来尝试用 Perl 写 Emacs 插件吗。

把 ruby 代码做成 cli 命令,然后 viml 里面调用。

seeing_is_believing 就是这么做的,应该比嵌入 ruby 代码要容易维护。。。 而且不需要+ruby,只有系统有安装有 ruby 就行。

#2 楼 @pynix 那样你能调用 VIM 的 API 吗。。

应该不能,只能写逻辑代码,api 由 viml 部分搞定。。。。

vim 插件系统是 vim 最值得吐槽的地方之一,现在还好有其他语言拓展,但特么老插件我想改点东西就跪了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号