vim 有望实现基于 socket 的 channel 机制实现异步通信 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chemzqm
V2EX    Vim

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

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

    文档: https://github.com/vim/vim/blob/cbebd4879c78e670d79b2c57dc33d7b911c962a/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-1 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     Solana     2622 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 08:49 PVG 16:49 LAX 00:49 JFK 03:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86