2009-12-21 13 views
6

¿Hay alguna manera fácil de que emacs guarde el búfer actual en dos ubicaciones? Podría en el 'after-save-hook' copiar programáticamente el archivo actual a una segunda ubicación, pero escribir el código lisp para eso podría llevar algo de tiempo.¿Cómo hacer que Emacs guarde el archivo en varias ubicaciones?

Para aquellos que sienten curiosidad por por qué quiero esto: Quiero que los cambios que realizo en mi JSP se desplieguen de inmediato en el directorio webapps/myapp de tomcat.

Así que cada vez que guardo un archivo JSP quiero guardarlo tanto en mi ubicación de origen controlada de la versión actual como en el directorio donde se implementa mi aplicación Tomcat.

No puedo usar enlaces simbólicos porque utilizo una máquina de Windows y la ubicación de destino es un directorio en el cuadro de Linux que se exporta a través de Samba.

Respuesta

6

Dado que el problema que está tratando de resolver es implementar cambios inmediatamente, le sugiero que escriba una secuencia de comandos (en su caso un archivo por lotes) que invoque rsync con las opciones correspondientes. Puede ejecutar esto en el after-save-hook (que probablemente sea excesivo) o asignarle una tecla de acceso rápido para ejecutarlo cuando haya realizado un conjunto de cambios que desea probar. Algo así como:

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

donde la secuencia de comandos se vería así:

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

Esta es probablemente mejor que guardar el mismo archivo en varios lugares, ya que garantiza el directorio de despliegue siempre coincide con lo que tiene en su repositorio de origen

+1

Para mejorar esto: vuelva a enlazar 'C-x C-s' para realizar el archivo de guardar normal y el script de despliegue. – jdmichal

+0

Me gusta el comentario de jdmichal junto con su respuesta. Gracias. – Murali

7

Algo como esto debería funcionar:

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

Para más información sobre local-write-file-hooks ver this answer.

Obviamente, personalice el nombre de archivo creado en la primera llamada al 'write-file.

+0

+1 para dar la solución de propósito general. – Murali

1

Probablemente una más generan solución es un gancho similar a este Síntesis: 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) 

Esencialmente, en cualquier archivo de salvar, si el directorio donde el archivo se guarda como una secuencia de comandos ejecutable llamado, .on-save, ejecutará esa secuencia de comandos con el nombre del archivo que se está guardando.

Esto le permite poner un rsync u otros comandos para un directorio. De acuerdo, esto podría ampliarse para recorrer un árbol de directorios buscando este tipo de patrón.

+0

Este script probablemente necesita un aviso para confirmar con el archivo .on-save, en particular, cuando el archivo no es propiedad del usuario que realiza la invocación. – mcr

Cuestiones relacionadas