如何异步保存vim远程文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何异步保存vim远程文件?相关的知识,希望对你有一定的参考价值。

使用编辑远程文件

 vim scp://remote/file

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

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

相关的互联网搜索结果表明:

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

我更喜欢

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

保持ssh隧道开放并没有改善它。

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

tpope/dispatch的替代品是:Shougo/vimprocidbrii/AsyncCommand,我还没有尝试过。

答案

这是一个老问题,但我遇到了如何有效地使用远程文件的相同问题。

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

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

command! Sync :call <SID>Sync()

使用unison同步文件的速度非常快,以至于我没有太多动力让它以异步方式运行。

另一答案

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

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

这大大减慢了滚动速度。从状态行中删除逃犯状态可以缓解这种情况。

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

通过sshfs的git很慢。

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

由于此脚本使用ssh多路复用,因此最好将ssh配置为自动打开主连接。

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

host *
    controlmaster auto
    controlpath   ~/.ssh/connections/%r_%h_%p
另一答案

插件AsyncRun for vim8 / neovim

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

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

补丁的副本:

以下差异到$ VIMRUNTIME / autoload / netrw.vim(版本156),当您放入vimrc时,与AsyncRun异步保存g:netrw_write_AsyncRun = 1:

❯ 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:")

以上是关于如何异步保存vim远程文件?的主要内容,如果未能解决你的问题,请参考以下文章

保存 .cpp 文件时在 vim 中自动格式化代码

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

Linux实操篇—— 远程登录远程文件传输vi和vim工具的使用方法

jQuery-异步请求