2009-12-21 24 views
6

Có cách nào dễ dàng để có emacs lưu bộ đệm hiện tại ở hai vị trí không? Tôi có thể trong 'sau khi lưu-móc' lập trình sao chép tập tin hiện tại đến một vị trí thứ hai, nhưng viết mã lisp cho rằng có thể mất một thời gian.Làm thế nào để Emacs lưu tập tin tại nhiều địa điểm?

Đối với những người tò mò tại sao tôi muốn điều này: Tôi muốn những thay đổi tôi thực hiện cho JSP của mình ngay lập tức được triển khai trong thư mục webapps/myapp của tomcat.

Vì vậy, mỗi lần tôi lưu một tập tin JSP Tôi muốn nó được lưu trong cả hai phiên bản hiện tại của tôi kiểm soát vị trí nguồn cũng như trong thư mục nơi ứng dụng Tomcat của tôi được triển khai.

tôi không thể sử dụng liên kết tượng trưng vì tôi sử dụng một máy cửa sổ và vị trí đích là một thư mục trong Linux hộp đó được xuất khẩu thông qua Samba.

Trả lời

6

Do sự cố bạn đang cố gắng giải quyết là triển khai thay đổi ngay lập tức, tôi khuyên bạn nên viết một tập lệnh (trong trường hợp của bạn là tệp lô) gọi rsync bằng các tùy chọn thích hợp. Bạn có thể chạy điều này trong after-save-hook (có thể là quá mức cần thiết) hoặc gán một phím nóng để chạy nó cho bạn khi bạn đã thực hiện một tập hợp các thay đổi mà bạn muốn thử nghiệm. Một cái gì đó như:

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

nơi kịch bản sẽ trông như thế này:

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

Đây có lẽ là tốt hơn so với tiết kiệm cùng một tập tin ở nhiều nơi, vì nó đảm bảo các thư mục triển khai luôn phù hợp với những gì bạn có trong kho lưu trữ nguồn của bạn.

+1

Để cải thiện điều này: Khởi động lại 'C-x C-s' để thực hiện cả việc lưu tập tin bình thường và tập lệnh triển khai. – jdmichal

+0

Tôi thích nhận xét từ jdmichal cùng với câu trả lời của bạn. Cảm ơn. – Murali

7

Something như thế này nên làm việc:

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

Để biết thêm về local-write-file-hooks thấy this answer.

Rõ ràng tùy chỉnh tên tập tin được tạo ra trong cuộc gọi đầu tiên để 'write-file.

+0

1 đã cho các giải pháp mục đích chung. – Murali

1

Có lẽ một tạo ra nhiều giải pháp là một cái móc tương tự như Gist này: 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) 

Về cơ bản, trên bất kỳ tập tin lưu, nếu thư mục chứa tập tin đã được lưu lại dưới dạng một kịch bản thực thi gọi, .on-save, nó sẽ thực thi tập lệnh đó với tên của tệp đang được lưu.

này cho phép bạn đặt một rsync hoặc khác lệnh cho một thư mục. Cấp, điều này có thể được mở rộng để đi bộ lên một cây thư mục tìm kiếm loại hình này.

+0

Tập lệnh này có thể cần lời nhắc để xác nhận bằng cách sử dụng tệp .on-lưu cụ thể khi tệp không thuộc quyền sở hữu của người dùng đang gọi. – mcr

Các vấn đề liên quan