2009-12-21 20 views
6

有没有简单的方法让emacs在两个地方保存当前缓冲区? 我可以在'保存后钩子'编程方式将当前文件复制到第二个位置,但编写lisp代码可能需要一些时间。如何让Emacs在多个位置保存文件?

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

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

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

回答

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 

这可能比节省在多个位置相同的文件更好,因为它可以确保始终部署目录相匹配你所拥有的您的源代码库。

+1

为了改进:重新绑定'C-x C-s'来执行正常的文件保存和部署脚本。 – jdmichal

+0

我喜欢jdmichal的评论以及您的答案。谢谢。 – Murali

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时创建的文件名。

+0

+1给出通用的解决方案。 – Murali

1

可能是一个更产生的解决方案是类似于此要点的钩: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或其他命令。当然,这可以扩展到寻找这种模式的目录树。

+0

此脚本可能需要提示才能确认使用.on-save文件,特别是当文件不属于调用用户时。 – mcr

相关问题