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