2009-12-21 35 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

相關問題