V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chemzqm
V2EX  ›  Vim

vim 有望实现基于 socket 的 channel 机制实现异步通信

  •  1
     
  •   chemzqm · 2016-02-14 14:49:13 +08:00 · 5334 次点击
    这是一个创建于 3239 天前的主题,其中的信息可能已经有所发展或是发生改变。

    文档: 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 大概是更有效率的选择)
    第 1 条附言  ·  2016-02-14 17:21:34 +08:00
    标题有点问题,最新版 vim 已经实现 channel 了,只是现在功能还不全, brew 安装的还没有。
    使用 --with-features=huge 编译可使 vim 支持 channel 。

    有人问有啥用,那再举个例子,可以搞个基于 socket 的聊天室,然后使用 vim 做为前端的 UI 呈现,没有 channel 的双向通信,实现这种功能是很困难的。
    16 条回复    2016-10-26 04:13:53 +08:00
    wizardoz
        1
    wizardoz  
       2016-02-14 15:07:18 +08:00
    有什么用?
    chemzqm
        2
    chemzqm  
    OP
       2016-02-14 15:17:22 +08:00
    @wizardoz 更简单的代码,更好的用户体验
    binarylu
        3
    binarylu  
       2016-02-14 15:20:07 +08:00
    期待
    taobeier
        4
    taobeier  
       2016-02-14 15:28:33 +08:00
    期待.
    wh0ami
        5
    wh0ami  
       2016-02-14 16:10:16 +08:00
    neovim 做的怎么样了?
    yuuko
        6
    yuuko  
       2016-02-14 16:30:43 +08:00 via Android
    期待(๑˙ー˙๑)
    chenggiant
        7
    chenggiant  
       2016-02-14 16:45:24 +08:00
    期待!
    jdlau
        8
    jdlau  
       2016-02-14 17:05:02 +08:00 via Android
    期待
    htfy96
        9
    htfy96  
       2016-02-14 17:35:10 +08:00
    neovim 和 vim 的分裂从此开始?
    chemzqm
        10
    chemzqm  
    OP
       2016-02-14 17:42:01 +08:00
    @wh0ami 一直在做吧,之前在 reddit 有人说越来越多开发者切换到 neovim 了,主要大概是得益于它的 job-control 能让更强大的插件表现更好。如果你用命令行 vim 可以很容易切过去,我是因为习惯 macvim ,而 neovim 的 mac 版差太多所以没换。
    chemzqm
        11
    chemzqm  
    OP
       2016-02-14 17:54:20 +08:00
    @htfy96 不一定吧,只要 api 没冲突, neovim 可以继续使用 vim 做为内核。
    不过有一点, neovim 的 job-control 实现经常被人诟病,也有人说它那种实现是伪异步(纯属道听途说),但是 vim 原生支持的 job-control 表现上应该会好写,所以可以预见将来会有更多、功能更强的插件使用原生的 job-control 实现。
    xuboying
        12
    xuboying  
       2016-02-14 23:43:18 +08:00
    emacs 是个操作系统了, vim 有往这个方向的趋势么?
    techmoe
        13
    techmoe  
       2016-02-15 08:02:31 +08:00 via Android
    越来越神了。。
    haoc
        14
    haoc  
       2016-02-18 09:09:31 +08:00
    vim 还是保守一些。新功能都有 neovim 来是实现吧!
    wsdjeg01
        15
    wsdjeg01  
       2016-05-05 13:46:56 +08:00 via Android
    @chemzqm 也就是说目前 vim 的 job 特性要更加好?但是我看 shougo 等都觉得 neovim 的更加合理,我自己也是这么觉得的,我写过一个 job 测试,感觉还是 neovim 的更加简洁
    skywind3000
        16
    skywind3000  
       2016-10-26 04:13:53 +08:00
    如果你们使用 Vim8.0 或者 NeoVim ,你们可以试试: http://github.com/skywind3000/asyncrun.vim 更好的代替 dispatch ,异步 git push, 异步编译,异步调试,比 dispatch 好很多的用户体验,如果这些还不足以打动你,可以看这个视频: https://raw.githubusercontent.com/skywind3000/asyncrun.vim/master/doc/screenshot.gif
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2824 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:06 · PVG 22:06 · LAX 06:06 · JFK 09:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.