7

我正在寻找一种映射 :w 命令的方法,以便当我使用它时,它将 rsync 当前目录并保存有问题的文件。理想情况下,rsync 命令生成的响应应该在 vim 中返回,但不是在当前文件中,而是作为工具提示或其他东西。

我设法在 TextMate 中实现了这一点,现在正准备开始使用 Vim。我一直在尝试类似的东西:map w :w|!rsync,但这似乎不起作用。

4

3 回答 3

10

您可以连接到 BufWritePost。我不记得确切的语法,但是 " :he BufWritePost" 和 " :he autocommand" 应该可以帮助你。

你像这样设置一个基本的钩子(文件上的模式匹配,所以你可以做 *.your_extension):

 :au BufWritePost * !rsync

此外,应该有某种方法使其成为缓冲区本地。

于 2009-08-02T21:42:40.023 回答
6

如果您想保留本地副本,那么 viraptor 建议的 BufWritePost autocmd 是最好的选择,但假设您安装了 netrw 插件(默认 Vim 运行时文件的一部分),您也可以使用以下命令启动 vim:

vim rsync://myrsync_server.com/path

并像在本地一样编辑文件:保存将更新远程服务器。

:help rsync
于 2009-08-03T11:50:32.920 回答
1

您可以设置缓冲区本地自动命令来执行此操作(请参阅 :help autocmd-buflocal

这将 vim 设置为在每次写入缓冲区后调用 rsync。

au BufWritePost,FileWritePost <buffer> silent !rsync -a /path/to/somedir/ user@host:/remote/dir/ --exclude=*.sw?

一个警告是,您必须为在多文件项目中编辑的每个文件设置这些自动命令之一。这变得很麻烦,而且很容易忘记为新文件/缓冲区进行设置 - 当然,您可以设置一个正常的自动命令,但随后您会触发 rsync 以写入不在项目中的文件。

使用 rsync-over-ssh,如果可以通过低延迟链接访问远程主机,则此方法有效 - 否则可能效果不佳,因为每次写入都会阻止缓冲区进一步更新,直到 rsync 完成。为了让体验更好,我建议

  • 通过持久连接使用连接多路复用重用 SSH连接。
  • &通过在命令末尾附加 a 将 rsync 发送到后台。YMMV。
于 2014-10-12T17:56:00.257 回答