如何让Emacs在多个位置保存文件?

如何让Emacs在多个位置保存文件?,emacs,Emacs,有没有一种简单的方法让emacs将当前缓冲区保存在两个位置? 我可以在“after save hook”中以编程方式将当前文件复制到第二个位置,但为此编写lisp代码可能需要一些时间 对于那些好奇我为什么想要这个的人: 我希望我对JSP所做的更改立即部署到tomcat的webapps/myapp目录中 因此,每次我保存一个JSP文件时,我都希望它保存在当前版本控制的源代码位置以及部署Tomcat应用程序的目录中 我不能使用符号链接,因为我使用的是windows计算机,目标位置是通过Samba导出

有没有一种简单的方法让emacs将当前缓冲区保存在两个位置? 我可以在“after save hook”中以编程方式将当前文件复制到第二个位置,但为此编写lisp代码可能需要一些时间

对于那些好奇我为什么想要这个的人: 我希望我对JSP所做的更改立即部署到tomcat的webapps/myapp目录中

因此,每次我保存一个JSP文件时,我都希望它保存在当前版本控制的源代码位置以及部署Tomcat应用程序的目录中


我不能使用符号链接,因为我使用的是windows计算机,目标位置是通过Samba导出的Linux框中的目录。

类似的操作应该可以:

(add-hook 'local-write-file-hooks 'my-save-hook)
(defun my-save-hook ()
  "write the file in two places"
  (let ((orig (buffer-file-name)))
    (write-file (concat "/some/other/path" (file-name-nondirectory orig)) nil)
    (write-file orig nil)))
有关
本地写入文件挂钩的详细信息,请参见


显然,自定义在第一次调用
'write-file

时创建的文件名鉴于您试图解决的问题是立即部署更改,我建议编写一个脚本(在您的情况下是批处理文件),使用适当的选项调用
rsync
。您可以在save hook之后的
中运行此操作(这可能有些过分),或者在进行了一组要测试的更改后,为您分配一个热键来运行它。比如:

(global-set-key 'f11 (shell-command "c:/dev/deploy_to_test.bat"))
其中脚本将如下所示:

rsync -avz --del c:/dev/mywebapp z:/srv/tomcat/mywebapp

这可能比将同一个文件保存在多个位置要好,因为它可以确保部署目录始终与源存储库中的目录匹配。

更通用的解决方案可能是类似于以下要点的钩子:

基本上,在任何文件保存时,如果保存文件的目录中有一个名为
的可执行脚本。在保存时,它将使用保存文件的名称执行该脚本


这允许您在每个目录的基础上指定
rsync
命令(或一个或多个其他命令)。当然,这可以扩展到一个目录树上寻找这种模式。

对此进行改进:重新绑定
C-x C-s
以执行正常的文件保存和部署脚本。我喜欢jdmichal的评论以及您的答案。谢谢。这个脚本可能需要一个提示来确认使用.on保存文件,特别是当文件不属于调用用户时。
(defun ha/folder-action-save-hook ()
  "A file save hook that will look for a script in the same directory, called .on-save.  It will then execute that script asynchronously."
  (let* ((filename (buffer-file-name))
         (dir (file-name-directory filename))
         (script (concat dir ".on-save"))
         (cmd (concat script " " filename)))
    (write-file filename nil)
    (when (file-exists-p script)
      (async-shell-command cmd))))

(add-hook 'local-write-file-hooks 'ha/folder-action-save-hook)