如何异步保存vim远程文件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何异步保存vim远程文件?相关的知识,希望对你有一定的参考价值。
使用编辑远程文件
vim scp://remote/file
使用:w
保存文件会阻止编辑器,直到文件更改保存到远程。
我试图使用:Dispatch :write
来避免被阻止,但这不起作用(使用tmux或iterm策略)。 :Dispatch
由插件vim-dispatch提供。
相关的互联网搜索结果表明:
- Ssh到远程并在那里工作(如果你有一个缓慢的连接,check this question或考虑ssh替代mosh)
- eshion/vim-sync提供了将本地文件自动同步到远程的可能性
- Git hook auto-push:在每次提交后推送更改为远程
- satiani/async-scp-vim(参见详情blog)每当触发BufWritePost事件时启动SCP调用
- Ssh tunnel由于打开ssh连接而写得更快(另请参阅Speeding up Vim's Netrw plugin over ssh/scp和autossh)。
- sshfs / osxfuse-sshfs
set directory=~/.vim/swaps//; set backupdir=~/.vim/backups
- Neovim尚未发布,每晚构建不会开箱即用。这里有任何答案赞赏。据报道,#1464是一个问题
- Backchannel Vi
解决方案很有帮助,但需要设置vcs,配置文件等。
我更喜欢
- 在当地工作
- 没有为每个文件配置(一次配置编辑器就可以了)
- 并非每次写入都应该是提交。
保持ssh隧道开放并没有改善它。
更新我想知道是否存在异步运行保存过程的解决方案。保存过程在这里,如netrw在命令行中显示,scp调用将临时文件复制到远程,这可能需要一些时间。我想同时回到我的编辑中,不要被阻止。我希望这会让我的问题更清晰。
tpope/dispatch的替代品是:Shougo/vimproc,idbrii/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远程文件?的主要内容,如果未能解决你的问题,请参考以下文章