2009-12-21 16 views
6

Gibt es eine einfache Möglichkeit, Emacs den aktuellen Puffer an zwei Stellen zu speichern? Ich könnte in der "nach-Speichern-Hook" programmgesteuert die aktuelle Datei an einen zweiten Speicherort kopieren, aber das Schreiben von Lisp-Code für das kann einige Zeit dauern.Wie speichert Emacs Dateien an mehreren Orten?

Für diejenigen, die neugierig sind, warum ich das möchte: Ich möchte die Änderungen, die ich an meine JSP sofort in Tomcat Webapps/myapp Verzeichnis bereitgestellt werden.

Also jedes Mal, wenn ich eine JSP-Datei speichern möchte ich es sowohl in meiner aktuellen versionskontrollierten Quellspeicherort als auch in dem Verzeichnis gespeichert, in dem meine Tomcat-Anwendung bereitgestellt wird.

Ich kann keine Symlinks verwenden, weil ich einen Windows-Rechner verwende und der Zielort ein Verzeichnis in der Linux-Box ist, das über Samba exportiert wird.

Antwort

6

Angesichts des Problems, das Sie versuchen zu lösen ist, Änderungen sofort bereitzustellen, würde ich vorschlagen, ein Skript (in Ihrem Fall eine Batchdatei) zu schreiben, die rsync mit den entsprechenden Optionen aufruft. Sie können dies entweder in der after-save-hook (was wahrscheinlich zu viel ist) ausführen oder einen Hotkey zuweisen, um es für Sie auszuführen, wenn Sie eine Reihe von Änderungen vorgenommen haben, die Sie testen möchten. Etwas wie:

(global-set-key 'f11 (shell-command "c:/dev/deploy_to_test.bat")) 

wo das Skript würde wie folgt aussehen:

rsync -avz --del c:/dev/mywebapp z:/srv/tomcat/mywebapp 

Dies ist wahrscheinlich besser als die gleiche Datei in mehreren Orten zu speichern, da es die Verzeichnisbereitstellung sorgt für immer übereinstimmt, was Sie haben in Ihr Quell-Repository.

+1

Um dies zu verbessern: Rebind 'C-x C-s', um sowohl die normale Dateisicherung als auch das Deploy-Skript durchzuführen. – jdmichal

+0

Ich mag den Kommentar von jdmichal zusammen mit Ihrer Antwort. Vielen Dank. – Murali

7

So etwas sollte funktionieren:

(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))) 

Für mehr auf local-write-file-hooksthis answer sehen.

Offensichtlich passen Sie den Dateinamen, der im ersten Anruf erstellt wird, an 'write-file an.

+0

+1 für die allgemeine Lösung. – Murali

1

Wahrscheinlich mehr erzeugen Lösung einen Haken ähnlich wie diese Gist ist: 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) 

Wesentlichen auf eine beliebige Datei speichern, wenn das Verzeichnis, in dem die Datei als ausführbare Skript gespeichert wird aufgerufen, .on-save, Es führt das Skript mit dem Namen der Datei aus, die gespeichert wird.

Damit können Sie einen rsync oder andere Befehle für ein Verzeichnis setzen. Zugegeben, dies könnte erweitert werden, um in einem Verzeichnisbaum nach dieser Art von Muster zu suchen.

+0

Dieses Skript benötigt wahrscheinlich eine Eingabeaufforderung, um die Verwendung der .on-save-Datei zu bestätigen, insbesondere wenn die Datei nicht dem aufrufenden Benutzer gehört. – mcr

Verwandte Themen