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

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

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的更多信息,请参见此答案

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


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
我喜欢jdmichal的评论和你的回答。谢谢。 - 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 命令(或一个或多个其他命令)。当然,这可以扩展到遍历目录树以查找此类模式。

这个脚本可能需要一个提示来确认特定的.on-save文件是否被调用用户所拥有,尤其是当该文件不属于调用用户时。 - mcr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接