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

时间:2009-12-21 23:24:24

标签: emacs

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

对于那些好奇我为什么要这样的人: 我希望我对JSP的更改立即部署在tomcat的webapps / myapp目录中。

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

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

3 个答案:

答案 0 :(得分:7)

这样的事情应该有效:

(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)))

有关local-write-file-hooks的更多信息,请参阅this answer

显然,可以自定义第一次调用'write-file时创建的文件名。

答案 1 :(得分:6)

鉴于您要解决的问题是立即部署更改,我建议编写一个脚本(在您的情况下是一个批处理文件),使用适当的选项调用rsync。你可以在after-save-hook中运行它(这可能是一种过度杀伤),或者在你做了一组想要测试的变化时,为你分配一个热键来运行它。类似的东西:

(global-set-key 'f11 (shell-command "c:/dev/deploy_to_test.bat"))

脚本看起来像这样:

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

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

答案 2 :(得分:1)

可能更普遍的解决方案是类似于这个Gist的钩子:https://gist.github.com/howardabrams/67d60458858f407a13bd

(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)

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

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