V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
chemzqm
V2EX  ›  Vim

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

  •  1
     
  •   chemzqm · Feb 14, 2016 · 6195 views
    This topic created in 3738 days ago, the information mentioned may be changed or developed.

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

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