Skip to content
Copy file on save, automatic deployment it. aka auto-deployment.
Emacs Lisp
Branch: master
Clone or download
Latest commit 5af6d5f Jun 4, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
.gitignore Init repository Aug 9, 2017 Add CONTRIBUTORS and Changelog Dec 12, 2017
Cask Bump version 0.0.3 Dec 12, 2017 Add MELPA badges Dec 12, 2017
copy-file-on-save.el Bump version 0.0.5 Jun 4, 2018

Emacs auto-deployment

MELPA: copy-file-on-save MELPA stable: copy-file-on-save

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.

Why copy-file-on-save?

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.

vs direct editing on TRAMP

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.

vs emacs-ssh-deploy

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.

For 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).

Extends TRAMP

vagrant-tramp and docker-tramp increase the affinity of Emacs (TRAMP) and Vagrant/Docker, so it is worth noting.



(string) copy-file-on-save-dest-dir

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)

(repeat string) copy-file-on-save-ignore-patterns

Configure for each project

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.

How to turn on copy-file-on-save

Enable global-minor-mode (RECOMMENDED)

Put the following into your init.el or .emacs file.


Please don’t worry. This mode does not work in buffers that do not have available settings for deployment.

Enable manually

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




  • [ENHANCEMENT,BUG] Fixed saving failed when there was no directory. (Thanks @Csomnia)
You can’t perform that action at this time.