Skip to content

Instantly share code, notes, and snippets.

@mrpatrick
Forked from mtmtcode/auto-rsync.el
Created June 29, 2016 18:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrpatrick/ad355283bf4c83e5851946a852dde7cf to your computer and use it in GitHub Desktop.
Save mrpatrick/ad355283bf4c83e5851946a852dde7cf to your computer and use it in GitHub Desktop.
auto-rsync.el - Emacs minor mode to execute rsync automaticlly
;;; auto-rsync-mode -- minor mode for auto rsync
;;
;; Author: @l3msh0
;;
;;; Example
;;
;; (require 'auto-rsync)
;; (auto-rsync-mode t)
;; (setq auto-rsync-dir-alist
;; (("/path/to/src1/" . "/path/to/dest1/")
;; ("/path/to/src2/" . "username@hostname:/path/to/dest2/")))
;;; Customize
;;
(defgroup auto-rsync nil "Auto rsync")
(defcustom auto-rsync-command "rsync" "rsync command path" :group 'auto-rsync)
(defcustom auto-rsync-command-option "-avzq" "rsync command option" :group 'auto-rsync)
;;; TODO
;;
;; open remote counterpart
;;
(defvar auto-rsync-dir-alist nil "Pair of rsync source and destination dir")
(defvar auto-rsync-normalized-alist nil)
;;; Code
(defun auto-rsync-exec-rsync ()
"execute rsync if editing file path matches src dir"
(interactive)
(let* ((normalized-alist (mapcar (lambda (x) (cons (file-name-as-directory (expand-file-name (car x)))
(file-name-as-directory (cdr x))))
auto-rsync-dir-alist))
(sync-pair (assoc-if (lambda (key) (string-match key buffer-file-name)) normalized-alist)))
(when sync-pair
(save-window-excursion
;; avoid annoying shell comannd window
(shell-command (format "%s %s %s %s&" auto-rsync-command auto-rsync-command-option (car sync-pair) (cdr sync-pair)) nil)))))
(define-minor-mode auto-rsync-mode
"automatically execute rsync when editing file's path matches `auto-rsync-dir-alist`"
:lighter " rsync"
:global t
(cond (auto-rsync-mode
(add-hook 'after-save-hook 'auto-rsync-exec-rsync))
(t
(remove-hook 'after-save-hook 'auto-rsync-exec-rsync))))
(provide 'auto-rsync)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment