有没有一种简单的方法让emacs在两个位置保存当前缓冲区? 我可以在'after-save-hook'中以编程方式将当前文件复制到第二个位置,但为此编写lisp代码可能需要一些时间。
对于那些好奇我为什么要这样的人: 我希望我对JSP的更改立即部署在tomcat的webapps / myapp目录中。
因此,每当我保存JSP文件时,我希望它保存在我当前版本控制的源位置以及部署Tomcat应用程序的目录中。
我不能使用符号链接,因为我使用的是Windows机器,目标位置是Linux框中通过Samba导出的目录。
答案 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
命令(或一个或多个其他命令)。当然,这可以扩展为在目录树中查找这种模式。