文档: https://github.com/vim/vim/blob/cbebd4879cc78e670d79b2c57dc33d7b911c962a/runtime/doc/channel.txt
目前还是草案阶段
vim-dev 讨论主题: https://groups.google.com/forum/#!topic/vim_dev/qtw5LdCrHJQ
几年前 vim 收到过 1 个补丁, 实现类似 js 的 setTimeout/setInterval 机制支持异步,但是大概考虑到性能以及代码复杂度的影响,那个补丁最后也没被接受,希望这次的不会黄掉🙂
大致谈谈这个机制会对我们有什么影响:
- 我们可以直接在 vim 中使用 neomake 这类异步任务插件,而不必求助与 neovim 或者使用 syntastic 这种检测时会卡住 vim 的同步插件。
- 类似 YouCompleteMe 以及 tern_for_vim 这类插件可以使用新机制替换原有的 clientserver 通信方式,从而让代码更简单、效率更高。
- 很多插件不必再依赖 vim-dispatch 或是 vimproc.vim 。举个例子 : https://github.com/chemzqm/vim-v2ex 是一个基于 vimproc 实现的异步抓取并显示 V2EX 最新主题的插件。为了异步添加内容,只能借助于后台 server 的 stdio 通信,然后在 vim 里检测 CursorHold 事件触发时添加内容,同时为了 CursorHold 事件可以连续触发,还需在 CursorHold 事件触发时发送无用的伪按键码。如果使用新的机制,这个过程就可以简化成通过 socket 传递 json ,然后在 vim 回调函数触发时解析 json 添加内容即可。
- gvim/macvim 操作体验有望进一步增强。不用再羡慕 tmux ,通过新的机制,可以方便的把其它进程的结果实时返回到 vim (例如输出到一个分割窗口)。例如 vim 内开始异步测试,然后在 vim 内实时看到结果。
- channel 是双向通信的,可以用来实现更多好玩的东西,例如在 vim 里控制后台的 node-debugger (举例而已,使用 Chrome 调试 node 大概是更有效率的选择)