8

编辑远程文件

 vim scp://remote/file

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

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

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

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

我更喜欢

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

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

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

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

4

3 回答 3

2

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

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

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

command! Sync :call <SID>Sync()

使用 unison 同步文件的速度是如此之快,以至于我没有太多动力让它异步运行。

于 2017-09-28T00:16:48.387 回答
0

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
于 2015-03-19T14:07:27.393 回答
0

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:")
于 2016-12-20T16:54:28.650 回答