【问题标题】:How to save in vim a remote file asynchronously?如何在vim中异步保存远程文件?
【发布时间】:2018-03-02 18:02:55
【问题描述】:

编辑远程文件

 vim scp://remote/file

使用:w 保存文件会阻止编辑器,直到文件更改保存到远程。

我试图使用:Dispatch :write 来避免被阻止,但这不起作用(使用 tmux 或 iterm 策略)。 :Dispatch 由插件vim-dispatch 提供。

相关互联网搜索结果提示:

这些解决方案很有帮助,但需要设置 vcs、配置文件等。

我更喜欢

  • 在本地工作
  • 没有对每个文件进行配置(一次性配置编辑器就可以了)
  • 并非每次写入都应该是一次提交。

保持 ssh 隧道打开也没有改善。

更新 我想知道是否有异步运行保存过程的解决方案。保存过程在这里意味着,正如 netrw 在命令行中显示的那样,将临时文件复制到远程的 scp 调用可能需要一些时间。同时我想回到我的编辑,不要被阻止。我希望这能让我的问题更清楚。

tpope/dispatch 的替代方案是: Shougo/vimprocidbrii/AsyncCommand,我还没试过。

【问题讨论】:

  • 那么……你在找什么?
  • @romainl:很明显我的问题的答案。提到 dispatch.vim 只是为了表明我的想法。它似乎不起作用。你还不明白我的意思吗?
  • 谢天谢地,在 Vim 中没有异步的东西,所以无论你怎么看,你都需要第三方解决方案。您显然已经研究了您的主题,但“这很好,但不是我想要的。”没有告诉我们所有这些选项对您不起作用的方式。或者为什么你不在你的服务器上直接使用 Vim。或者为什么你不使用 VCS 或其他任何东西来代替牛仔编辑。
  • 首先,我不想问我已经知道的事情。与在本地运行 vim 相比,直接在服务器上使用 vim 是滞后的。我真的很欣赏 vims 的响应能力。当我在服务器上运行 vim 时,我会丢失它。你能解释一下为什么你说'谢天谢地在 vim 中没有异步'。 Afaik neovim 是关于 vim 的异步扩展 (Job control (work with processes asynchronously))。他们在这方面投入了大量时间。
  • 现在您可能会说,您已经知道答案了。这不是真的。 Dispatch.vim 扩展了:make:write 也可能有一些东西。

标签: vim asynchronous netrw


【解决方案1】:

这是一个老问题,但我遇到了同样的问题,即如何有效地处理远程文件。

我的解决方案是使用unison 即时同步文件。定义了一个命令来调用 vim 中的同步函数。

function! s:Sync()
  call system("unison -batch /home/user ssh://user@server//home/user")
endfunction

command! Sync :call <SID>Sync()

使用 unison 同步文件的速度太快了,我没有太多动力让它异步运行。

【讨论】:

【解决方案2】:

SSHFS:我对 sshfs 的问题是 vim 插件 lightline.vim 使用 fugitive.vim 函数。

当您滚动(行号更改)时,状态行会经常更新,因此显示当前分支的逃逸函数一直被评估。

这大大减慢了滚动速度。从状态栏中删除逃犯状态缓解了减速。

还有另一个插件 https://github.com/seletskiy/vim-refugi 报告了这一点

通过 sshfs 的 git 非常慢

我还为逃犯安装了这个插件并应用了他们的提示

因为这个脚本使用 ssh 多路复用,所以最好配置你的 ssh 自动打开主连接。

例如你在 ~/.ssh/config 中需要这个:

host *
    controlmaster auto
    controlpath   ~/.ssh/connections/%r_%h_%p

【讨论】:

    【解决方案3】:

    vim8/neovim 的插件 AsyncRun

    在以下 wiki 页面上描述了如何在保存到远程时使用此插件获取 netrw:

    https://github.com/skywind3000/asyncrun.vim/wiki/Get-netrw-using-asyncrun-to-save-remote-files

    补丁副本:

    当你将 g:netrw_write_AsyncRun = 1 放入你的 vimrc 时,跟随 $VIMRUNTIME/autoload/netrw.vim(版本 156)的差异与 AsyncRun 异步保存:

    ❯ git diff netrw-156.vim netrw.vim
    diff --git a/netrw-156.vim b/netrw.vim
    index 76485c2..183fc96 100644
    --- a/netrw-156.vim
    +++ b/netrw.vim
    @@ -510,6 +510,7 @@ call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
     call s:NetrwInit("g:netrw_win95ftp",1)
     call s:NetrwInit("g:netrw_winsize",50)
     call s:NetrwInit("g:netrw_wiw",1)
    +call s:NetrwInit("g:netrw_write_AsyncRun",0)
     if g:netrw_winsize > 100|let g:netrw_winsize= 100|endif
     " ---------------------------------------------------------------------
     " Default values for netrw's script variables: {{{2
    @@ -2377,6 +2378,14 @@ fun! netrw#NetWrite(...) range
     "    call Decho("(netrw) Processing your write request...",'~'.expand("<slnum>"))
        endif
    +   " NetWrite: Perform AsyncRun Write {{{3
    +   " ============================
    +   if exists("g:netrw_write_AsyncRun") && g:netrw_write_AsyncRun == 1
    +       let bang_cmd = 'AsyncRun -post=call\ delete('.s:ShellEscape(tmpfile,1).')\ |\ echo\ "(netrw)\ Your\ write\ request\ has\ finished." '
    +    else
    +        let bang_cmd ="!"
    +   endif
    +
        ".........................................
        " NetWrite: (rcp) NetWrite Method #1 {{{3
        if  b:netrw_method == 1
    @@ -2515,7 +2524,7 @@ fun! netrw#NetWrite(...) range
         else
          let useport= ""
         endif
    -    call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(g:netrw_machine.":".b:netrw_fname,1))
    +    call s:NetrwExe(s:netrw_silentxfer.bang_cmd.g:netrw_scp_cmd.useport." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(g:netrw_machine.":".b:netrw_fname,1))
         let b:netrw_lastfile = choice
    
        ".........................................
    @@ -2612,9 +2621,11 @@ fun! netrw#NetWrite(...) range
    
       " NetWrite: Cleanup: {{{3
     "  call Decho("cleanup",'~'.expand("<slnum>"))
    -  if s:FileReadable(tmpfile)
    -"   call Decho("tmpfile<".tmpfile."> readable, will now delete it",'~'.expand("<slnum>"))
    -   call s:NetrwDelete(tmpfile)
    +  if !exists("g:netrw_write_AsyncRun") || g:netrw_write_AsyncRun == 0
    +    if s:FileReadable(tmpfile)
    +"     call Decho("tmpfile<".tmpfile."> readable, will now delete it",'~'.expand("<slnum>"))
    +      call s:NetrwDelete(tmpfile)
    +    endif
       endif
       call s:NetrwOptionRestore("w:")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2012-05-25
      • 1970-01-01
      相关资源
      最近更新 更多