copy-file-on-save
is a minor mode to copy the file to another path on after-save-hook. This not only saves the backup in the project specific path, it also you can realize the deployment to the remote server over TRAMP.
The original name of this feature was auto-deployment. It was named after JetBrains’ automatic deployment function. But in Emacs this function can be realized by TRAMP’s excellent file system abstraction layer. That is, deploying to remote server is just done with only copy-file
function.
TRAMP can log in to remote server from Emacs and edit the file directly. This means that you do not need to keep a full copy of the project on your client PC. But at the price you will feel latency to all file system operations.
The disadvantage of TRAMP is Emacs Lisp compatibility. Especially in the case of several packages, processing depending on the file system is lacking consideration or it may be slow even if it works. For example, Magit also works via TRAMP, but it’s very slow.
ssh-deploy package is a TRAMP wrapper like copy-file-on-save
, but it has many features such as directory recursive deployment and diff between remote and local. If you want rich features you should use ssh-deploy.
On the other hand, we only provide simple functions. We recommend using tools and scripts such as rsync and git for multi-file deployment.
A typical use of this feature is to place PHP files on the remote development server. However, this is useful not only for PHP but also for synchronizing files without depend on shared directory function of virtual environments (VirtualBox, Vagrant and Docker).
vagrant-tramp and docker-tramp increase the affinity of Emacs (TRAMP) and Vagrant/Docker, so it is worth noting.
Path to deployment directory or convert (mapping) function.
You can use TRAMP’s syntax. See Configuration - TRAMP User Manual and Inline methods. (ex. /scp:dest-server:/home/your/path/to/proj
)
This is necessary for sharing variables in the project.
Using .dir-locals.el (RECOMMENDED)
Put the following into your .dir-locals.el
in project root directory.
((nil . ((copy-file-on-save-dest-dir . "/scp:dest-server:/home/your/path/to/proj")
(copy-file-on-save-ignore-patterns . ("/cache")))))
This method uses standard functions of Emacs. However, you will feel annoying warnings from Emacs. Please see Safe File Variables - GNU Emacs Manual for how to suppress this warning.
Put the following into your init.el
or .emacs
file.
(global-copy-file-on-save-mode)
Please don’t worry. This mode does not work in buffers that do not have available settings for deployment.
M-x copy-file-on-save-mode
will toggle enable/disable the minor mode.
Using hook with auto-minor-mode
;; Example for full directory path to your project.
(add-to-list 'auto-minor-mode-alist `(,(format "^%s/work/your-project/" (getenv "HOME")) . copy-file-on-save-mode))
;; You can ommit path if it is enough specific your project.
(add-to-list 'auto-minor-mode-alist '("/work/your-project/" . copy-file-on-save-mode))
See also CONTRIBUTORS.
- [ENHANCEMENT,BUG] Fixed saving failed when there was no directory. (Thanks @Csomnia)