Bram 估计急了,最新的几个Vim版本中新功能十分给力,
目前(7.4.1689)已经包含几个 NeoVim 类似的特性:
1. timer:
以前没有timer,需要周期运行只有做 CursorHold/CursorHoldI/CursorMoved 几个事件的autocmd来模拟,十分山寨,默认timeout是4秒,最短的触发周期是4秒,修改短了又会影响其他插件,自从有了timer_start, timer_stop,这件时间容易很多了,比如:
func! MyHandler(timer) echo 'Handler called' endfunc let timer = timer_start(500, 'MyHandler', {'repeat': 3})
这样 MyHandler就会每隔500毫秒以后被调用,并持续3次。
使用前判断下 has('timers') 即可,有了这个东西,实现后台任务就比较容易了,python用后台线程跑一个编译任务,实时把stdout/stderr的内容不断的投递到前台队列,然后vim script 里面起一个100毫秒的时钟去检查队列,并把刚才保存的 stdout/stderr 内容输出到 quickfix中,几百行代码,一个异步编译系统就可以构建出来了。
从此,可以象ide一样异步编译大工程,一边编辑文件,一边实时查看 quickfix中编译信息的输出,不必在那里傻等着。
2. Jobs:
jobs可以异步执行任务(其实我们上面已经用timer+python模拟了),为什么不直接用jobs呢?因为目前 jobs依赖的版本太新了,估计还有个几个月才能更新到各大系统,同时测试后发现vim的job实现类似上面的python后台线程监控状态,并投递内容给前台,但是前台更新比较慢,好像2秒才更新一次,就是说后台job结束了,你可能两秒后才能收到结束callback,当然如果你不在乎也可以无视直接使用更直接的 jobs。需要检查下 has('job'):
:echo has('job')
返回1代表你的版本支持job,这下那些什么 vimproc等异步任务模拟插件可以淘汰了,之前各种黑客手段来实现后台任务的也可以消停了。
3. channels:
vimscript中使用socket+json(或者换行分割原始字符串) 来和远程服务端通信,链接成功后可以发送命令,收到数据后会触发回调。需要检查 has('channel') 来判断。
4. guirenderoption:
windows下 gvim支持 direct2d 渲染,vimrc里面设置这么一行,渲染就使用directx了,效果更好,需要最新版本支持:
set renderoptions=type:directx,renmode:5,taamode:1
有了 guirenderoption,在 windows下字体能更加漂亮,而有了 timer/job/channel 三个套件,vim异步问题终于被官方解决了,很多依赖异步机制的插件再也不用搞一大堆飞线来实现这些事情了。
-----
估计被NeoVim 逼着更新了这么多东西,不过也是好事。
---
2016.7.20 更新:上面是四月份 jobs, timer, channel 刚出来不久的评价,随着5月份几个重要bug的修改(上面1689中提到的job更新慢问题5月已经得到修正),以及六七月的相继改进,jobs, timer, channel 如今很稳定了,:help channel 里面的文字已经由 DRAFT 变为非 DRAFT。
我一直在用,今天这些接口确实稳定不少了,上面的回答是 vim 7.4.1689,如今已经到了 vim 7.4.2078,经历了一共 389 次改进后
http:// Vim.org这月出了一条关于 8.0 的新闻:
Work on Vim 8 makes good progress
[2016-07-03] The past months many new features have been included, such as asynchronous communication, job control, timers and much more. The number of reported problems is steadily going down. This is an indication the quality is getting to an adequate level. There are still a few pieces to get in place and patches to include. (Bram Moolenaar)
长期以来 vim 并没有竞争者,所以 Bram 乐得去打工就业做自己的事,在 Vim 方面的发展自然就慢慢跟不上了。
neovim 给 vim 增加新鲜血液还是很重要的,不过在它被 Linux 发行版当作标准 vi 取代 vim 之前,可能都还并不能真正替代 vim 。
不过现在看来,只要 vim 还在维护,那么 Linux 发行版的标准 vi 命令用 neovim 取代 vim 可能性不太大。多等等看吧。