我的大部分工作都是在 vim 中完成的。我更喜欢在本地使用 vim 编辑文件,而不是通过 ssh 连接到服务器并在那里运行 vim,原因有很多,其中最重要的一个就是在慢速连接下 UI 的响应能力。
我知道我可以使用 vim 和 scp 编辑远程文件,并且我还有一个 sshfs 设置,它允许我非常简单地 cd 到挂载点并使用 vim 启动一些文件。
然而,令我烦恼的是,每次我保存文件时,它都会写入所有的文件传输到远程服务器。这确实减慢了我的工作流程。
我真正想要做的是进行如下设置:
- 使用本地 vim 打开远程文件时,提取文件的内容和文件的哈希值
- 保存文件时,检查远程哈希是否未更改,如果没有更改,则上传差异并使用新的更改修补远程文件。
- 最好通过持久 ssh 连接完成所有操作,这样就不会每次打开新连接而浪费时间。
这将更快、更节省带宽,并且具有相同的功能。
我通常使用 git 或 svn 来实现类似的结果,但当我无法使用此类 SCM 系统时,我真的希望获得这种最小的功能。
我的问题是:
1. 是否有人知道任何现有的脚本或程序可以为我完成部分或全部这些工作?
2. 有人愿意编写一些可以解决问题的 bash 单行代码吗?我知道用这些代码应该可以做到...
答案1
xdelta
可以为您进行修补和哈希检查。
假设您已使用 sshfs 安装文件,请尝试以下操作。我保留了文件扩展名,以便您使用语法高亮显示:
#!/bin/bash
if [ ! -f "$1" -o ! -w "$1" ]
then
echo "ERROR: cannot open $1 for editing"
exit 1
fi
TMP="/tmp/$(date +%s)-$$-$(basename $1)"
TMP2="$TMP.2"
PAT="$TMP.patch"
/bin/cp $1 $TMP
/bin/cp $TMP $TMP2
/usr/bin/vim $TMP2
/usr/bin/xdelta delta $TMP $TMP2 $PAT
/bin/cp $1 $1.orig
if /usr/bin/xdelta patch $PAT $1.orig $1
then
/bin/rm $TMP $TMP2 $PAT
else
echo "ERROR: xdelta patch failed, keeping temporary files $TMP $TMP2 $PAT"
exit 1
fi
假设你把它命名为 deltavim 或者类似的名字,你只需要
deltavim /path/to/remotefile.conf
这将需要本地的两个副本来制作增量,但如果成功,则会删除所有内容。它会保留带有 .orig 的原始远程文件,但如果您愿意,可以在修补后添加一行来删除它。
如果远程文件在您编辑时发生变化,xdelta 将会注意到并拒绝修补。
无论如何,也许这对您来说是一个起点。
祝你好运!(...并且永远不要将从互联网上下载的未加载、未经测试的脚本指向你喜欢的文件...)
答案2
当您远程连接时vim
,它是否实际写入了整个文件?
vim ftp://myserver//path/file.txt