2009-12-21 10 views
6

C'è un modo semplice per avere emacs salvare il buffer corrente in due posizioni? Nel "post-salvataggio-hook" è possibile copiare a livello di codice il file corrente in una seconda posizione, ma la scrittura del codice Lisp potrebbe richiedere del tempo.Come salvare Emacs in più posizioni?

Per coloro che sono curiosi perché voglio questo: Voglio che le modifiche apportate al mio JSP vengano immediatamente implementate nella directory webapps/myapp di tomcat.

Quindi ogni volta che salvi un file JSP lo voglio salvato sia nella posizione corrente della mia versione controllata sia nella directory in cui è distribuita la mia applicazione Tomcat.

Non riesco a utilizzare i collegamenti simbolici perché utilizzo una macchina Windows e il percorso di destinazione è una directory in Linux che viene esportata tramite Samba.

risposta

6

Dato il problema che si sta tentando di risolvere è quello di implementare immediatamente le modifiche, vorrei suggerire a scrivere uno script (nel tuo caso un file batch) che invoca rsync con le opzioni appropriate. È possibile eseguire ciò nel after-save-hook (che è probabilmente eccessivo) o assegnare un tasto di scelta rapida per eseguirlo per te quando hai fatto una serie di modifiche che si desidera verificare. Qualcosa di simile:

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

in cui lo script sarà simile a questa:

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

Questo è probabilmente meglio che salvare lo stesso file in luoghi diversi, in quanto garantisce la directory di distribuzione sempre partite che cosa avete in il tuo repository sorgente.

+1

Per migliorare su questo: Rebind 'C-x C-s' per eseguire sia il normale salvataggio di file che lo script di distribuzione. – jdmichal

+0

Mi piace il commento di jdmichal insieme alla tua risposta. Grazie. – Murali

7

Qualcosa del genere dovrebbe funzionare:

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

Per maggiori informazioni sulla local-write-file-hooks vedere this answer.

Ovviamente personalizzare il nome del file creato nella prima chiamata a 'write-file.

+0

+1 per dare la soluzione generica. – Murali

1

Probabilmente un più generare la soluzione è un gancio simile a questo Gist: 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) 

In sostanza, su qualunque file di salvataggio, se la directory in cui il file viene salvato come uno script eseguibile chiamato, .on-save, eseguirà quello script con il nome del file che si sta salvando.

Ciò consente di inserire un rsync o altri comandi per una directory. Certo, questo potrebbe essere espanso per salire su un albero di directory alla ricerca di questo tipo di schema.

+0

Questo script richiede probabilmente un prompt per confermare l'utilizzo del file .on-save in particolare quando il file non è di proprietà dell'utente che ha richiamato. – mcr

Problemi correlati