enchive/enchive-mode.el

63 lines
2.3 KiB
EmacsLisp
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

;;; enchive-mode.el --- automatic encrypt/decrypt -*- lexical-binding: t; -*-
;; This is free and unencumbered software released into the public domain.
;;; Commentary:
;; Load this file, then M-x `enchive-mode' (global minor mode) to
;; enable automatic encryption and decryption of Enchive files.
;;; Code:
(defgroup enchive ()
"Interface to Enchive subprocess."
:group 'data)
(defcustom enchive-program-name "enchive"
"Path to the locally installed enchive binary.")
(defvar enchive-handler-entry (cons "\\.enchive\\'" #'enchive-file-handler)
"Entry for `enchive-mode' in `file-name-handler-alist'.")
(defvar enchive-auto-mode-entry (list "\\.enchive\\'" nil 'enchive)
"Entry for `enchive-mode' in `auto-mode-alist'.")
(defun enchive-file-handler (operation &rest args)
"Handler for `file-name-handler-alist' for automatic encrypt/decrypt."
(cond ((eq operation 'insert-file-contents)
(let ((file (car args)))
(unless (= 0 (call-process enchive-program-name file '(t nil) nil
"--pinentry" "--agent" "extract"))
(error "Enchive subprocess failed"))
(setf buffer-file-name file)
(list file (buffer-size))))
((eq operation 'write-region)
(call-process-region (nth 0 args) (nth 1 args)
enchive-program-name nil nil nil
"archive" "/dev/stdin" (nth 2 args)))
;; Handle any operation we dont know about.
(t (let ((inhibit-file-name-handlers
(cons 'enchive-file-handler
(and (eq inhibit-file-name-operation operation)
inhibit-file-name-handlers)))
(inhibit-file-name-operation operation))
(apply operation args)))))
;;;###autoload
(define-minor-mode enchive-mode
"Global minor mode to automatically encrypt/decrypt enchive files."
:global t
(setf file-name-handler-alist
(delq enchive-handler-entry file-name-handler-alist))
(setf auto-mode-alist
(delq enchive-auto-mode-entry auto-mode-alist))
(when enchive-mode
(setf file-name-handler-alist
(cons enchive-handler-entry file-name-handler-alist))
(setf auto-mode-alist
(cons enchive-auto-mode-entry auto-mode-alist))))
(provide 'enchive-mode)
;;; enchive-mode.el ends here