X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=epa.el;h=6a6b422a3e3f141fc08af61fae6176c0dfdbe2a8;hb=b32f12ba258eb94b5e158adefe44e6ad2f732214;hp=096728677529e2b596d35fd1d05f2ca264d7802c;hpb=f147d13f1c522651873bdbfacd0e720972a03d28;p=elisp%2Fepg.git diff --git a/epa.el b/epa.el index 0967286..6a6b422 100644 --- a/epa.el +++ b/epa.el @@ -33,22 +33,6 @@ "The EasyPG Assistant" :group 'epg) -(defcustom epa-protocol 'OpenPGP - "The default protocol." - :type '(choice (const :tag "OpenPGP" OpenPGP) - (const :tag "CMS" CMS)) - :group 'epa) - -(defcustom epa-armor nil - "If non-nil, epa commands create ASCII armored output." - :type 'boolean - :group 'epa) - -(defcustom epa-textmode nil - "If non-nil, epa commands treat input files as text." - :type 'boolean - :group 'epa) - (defcustom epa-popup-info-window t "If non-nil, status information from epa commands is displayed on the separate window." @@ -168,6 +152,22 @@ the separate window." (17 . ?D) (20 . ?G))) +(defvar epa-protocol 'OpenPGP + "*The default protocol. +The value can be either OpenPGP or CMS. + +You should bind this variable with `let', but do not set it globally.") + +(defvar epa-armor nil + "*If non-nil, epa commands create ASCII armored output. + +You should bind this variable with `let', but do not set it globally.") + +(defvar epa-textmode nil + "*If non-nil, epa commands treat input files as text. + +You should bind this variable with `let', but do not set it globally.") + (defvar epa-keys-buffer nil) (defvar epa-key-buffer-alist nil) (defvar epa-key nil) @@ -177,8 +177,8 @@ the separate window." (defvar epa-key-list-mode-map (let ((keymap (make-sparse-keymap))) - (define-key keymap "m" 'epa-mark) - (define-key keymap "u" 'epa-unmark) + (define-key keymap "m" 'epa-mark-key) + (define-key keymap "u" 'epa-unmark-key) (define-key keymap "d" 'epa-decrypt-file) (define-key keymap "v" 'epa-verify-file) (define-key keymap "s" 'epa-sign-file) @@ -186,7 +186,7 @@ the separate window." (define-key keymap "r" 'epa-delete-keys) (define-key keymap "i" 'epa-import-keys) (define-key keymap "o" 'epa-export-keys) - (define-key keymap "g" 'epa-list-keys) + (define-key keymap "g" 'revert-buffer) (define-key keymap "n" 'next-line) (define-key keymap "p" 'previous-line) (define-key keymap " " 'scroll-up) @@ -196,7 +196,7 @@ the separate window." (defvar epa-key-mode-map (let ((keymap (make-sparse-keymap))) - (define-key keymap "q" 'bury-buffer) + (define-key keymap "q" 'epa-exit-buffer) keymap)) (defvar epa-info-mode-map @@ -246,13 +246,15 @@ the separate window." (epg-sub-key-id (car (epg-key-sub-key-list (widget-get widget :value)))))) -(if (fboundp 'encode-coding-string) - (defalias 'epa--encode-coding-string 'encode-coding-string) - (defalias 'epa--encode-coding-string 'identity)) +(eval-and-compile + (if (fboundp 'encode-coding-string) + (defalias 'epa--encode-coding-string 'encode-coding-string) + (defalias 'epa--encode-coding-string 'identity))) -(if (fboundp 'decode-coding-string) - (defalias 'epa--decode-coding-string 'decode-coding-string) - (defalias 'epa--decode-coding-string 'identity)) +(eval-and-compile + (if (fboundp 'decode-coding-string) + (defalias 'epa--decode-coding-string 'decode-coding-string) + (defalias 'epa--decode-coding-string 'identity))) (defun epa-key-list-mode () "Major mode for `epa-list-keys'." @@ -269,6 +271,8 @@ the separate window." ;; if buffer-file-name is not set. (font-lock-set-defaults) (make-local-variable 'epa-exit-buffer-function) + (make-local-variable 'revert-buffer-function) + (setq revert-buffer-function 'epa--key-list-revert-buffer) (run-hooks 'epa-key-list-mode-hook)) (defun epa-key-mode () @@ -299,30 +303,27 @@ the separate window." (use-local-map epa-info-mode-map) (run-hooks 'epa-info-mode-hook)) -(defun epa-mark (&optional arg) - "Mark the current line. -If ARG is non-nil, unmark the current line." +(defun epa-mark-key (&optional arg) + "Mark a key on the current line. +If ARG is non-nil, unmark the key." (interactive "P") (let ((inhibit-read-only t) buffer-read-only properties) (beginning-of-line) + (unless (get-text-property (point) 'epa-key) + (error "No key on this line")) (setq properties (text-properties-at (point))) (delete-char 1) (insert (if arg " " "*")) (set-text-properties (1- (point)) (point) properties) (forward-line))) -(defun epa-unmark (&optional arg) - "Unmark the current line. -If ARG is non-nil, mark the current line." +(defun epa-unmark-key (&optional arg) + "Unmark a key on the current line. +If ARG is non-nil, mark the key." (interactive "P") - (epa-mark (not arg))) - -(defun epa-toggle-mark () - "Toggle the mark the current line." - (interactive) - (epa-mark (eq (char-after (save-excursion (beginning-of-line) (point))) ?*))) + (epa-mark-key (not arg))) (defun epa-exit-buffer () "Exit the current buffer. @@ -330,12 +331,11 @@ If ARG is non-nil, mark the current line." (interactive) (funcall epa-exit-buffer-function)) -(defun epa--insert-keys (context name mode) +(defun epa--insert-keys (keys) (save-excursion (save-restriction (narrow-to-region (point) (point)) - (let ((keys (epg-list-keys context name mode)) - point) + (let (point) (while keys (setq point (point)) (insert " ") @@ -372,7 +372,7 @@ If ARG is non-nil, mark the current line." (or (next-single-property-change point 'epa-list-keys) (point-max))) (goto-char point)) - (epa--insert-keys context name secret) + (epa--insert-keys (epg-list-keys context name secret)) (widget-setup) (set-keymap-parent (current-local-map) widget-keymap)) (make-local-variable 'epa-list-keys-arguments) @@ -389,7 +389,7 @@ If ARG is non-nil, mark the current line." (if epa-list-keys-arguments (car epa-list-keys-arguments))))) (list (if (equal name "") nil name))) - (or epa-list-keys-arguments (list nil nil)))) + (list nil))) (epa--list-keys name nil)) ;;;###autoload @@ -401,9 +401,12 @@ If ARG is non-nil, mark the current line." (if epa-list-keys-arguments (car epa-list-keys-arguments))))) (list (if (equal name "") nil name))) - (or epa-list-keys-arguments (list nil nil)))) + (list nil))) (epa--list-keys name t)) +(defun epa--key-list-revert-buffer (&optional ignore-auto noconfirm) + (apply #'epa--list-keys epa-list-keys-arguments)) + (defun epa--marked-keys () (or (save-excursion (set-buffer epa-keys-buffer) @@ -420,14 +423,7 @@ If ARG is non-nil, mark the current line." (if key (list key)))))) -;;;###autoload -(defun epa-select-keys (context prompt &optional names secret) - "Display a user's keyring and ask him to select keys. -CONTEXT is an epg-context. -PROMPT is a string to prompt with. -NAMES is a list of strings to be matched with keys. If it is nil, all -the keys are listed. -If SECRET is non-nil, list secret keys instead of public keys." +(defun epa--select-keys (prompt keys) (save-excursion (unless (and epa-keys-buffer (buffer-live-p epa-keys-buffer)) @@ -439,8 +435,8 @@ If SECRET is non-nil, list secret keys instead of public keys." (erase-buffer) (insert prompt "\n" (substitute-command-keys "\ -- `\\[epa-mark]' to mark a key on the line -- `\\[epa-unmark]' to unmark a key on the line\n")) +- `\\[epa-mark-key]' to mark a key on the line +- `\\[epa-unmark-key]' to unmark a key on the line\n")) (widget-create 'link :notify (lambda (&rest ignore) (abort-recursive-edit)) :help-echo @@ -454,19 +450,7 @@ If SECRET is non-nil, list secret keys instead of public keys." "Click here or \\[exit-recursive-edit] to finish") "OK") (insert "\n\n") - (if names - (while names - (epa--insert-keys context (car names) secret) - (if (get-text-property (point) 'epa-list-keys) - (epa-mark)) - (goto-char (point-max)) - (setq names (cdr names))) - (if secret - (progn - (epa--insert-keys context nil secret) - (if (get-text-property (point) 'epa-list-keys) - (epa-mark))) - (epa--insert-keys context nil nil))) + (epa--insert-keys keys) (widget-setup) (set-keymap-parent (current-local-map) widget-keymap) (setq epa-exit-buffer-function #'abort-recursive-edit) @@ -480,6 +464,19 @@ If SECRET is non-nil, list secret keys instead of public keys." (delete-window (get-buffer-window epa-keys-buffer))) (kill-buffer epa-keys-buffer)))) +;;;###autoload +(defun epa-select-keys (context prompt &optional names secret) + "Display a user's keyring and ask him to select keys. +CONTEXT is an epg-context. +PROMPT is a string to prompt with. +NAMES is a list of strings to be matched with keys. If it is nil, all +the keys are listed. +If SECRET is non-nil, list secret keys instead of public keys." + (let ((keys (epg-list-keys context names secret))) + (if (> (length keys) 1) + (epa--select-keys prompt keys) + keys))) + (defun epa--format-fingerprint-1 (fingerprint unit-size block-size) (let ((unit 0)) (with-temp-buffer @@ -882,10 +879,11 @@ Don't use this command in Lisp programs!" (error "No cleartext tail")) (epa-verify-region cleartext-start cleartext-end)))))) -(if (fboundp 'select-safe-coding-system) - (defalias 'epa--select-safe-coding-system 'select-safe-coding-system) - (defun epa--select-safe-coding-system (from to) - buffer-file-coding-system)) +(eval-and-compile + (if (fboundp 'select-safe-coding-system) + (defalias 'epa--select-safe-coding-system 'select-safe-coding-system) + (defun epa--select-safe-coding-system (from to) + buffer-file-coding-system))) ;;;###autoload (defun epa-sign-region (start end signers mode) @@ -943,15 +941,16 @@ If no one is selected, default secret key is used. " 'start-open t 'end-open t))))) -(if (fboundp 'derived-mode-p) - (defalias 'epa--derived-mode-p 'derived-mode-p) - (defun epa--derived-mode-p (&rest modes) - "Non-nil if the current major mode is derived from one of MODES. +(eval-and-compile + (if (fboundp 'derived-mode-p) + (defalias 'epa--derived-mode-p 'derived-mode-p) + (defun epa--derived-mode-p (&rest modes) + "Non-nil if the current major mode is derived from one of MODES. Uses the `derived-mode-parent' property of the symbol to trace backwards." - (let ((parent major-mode)) - (while (and (not (memq parent modes)) - (setq parent (get parent 'derived-mode-parent)))) - parent))) + (let ((parent major-mode)) + (while (and (not (memq parent modes)) + (setq parent (get parent 'derived-mode-parent)))) + parent)))) ;;;###autoload (defun epa-encrypt-region (start end recipients sign signers)