update.
[elisp/semi.git] / pgg.el
diff --git a/pgg.el b/pgg.el
index 9d8ac6e..e6fa06d 100644 (file)
--- a/pgg.el
+++ b/pgg.el
@@ -145,6 +145,7 @@ and END to the keyring.")
      (funcall (intern (format "pgg-make-scheme-%s" 
                              ,scheme)))))
 
+;;;###autoload
 (defun pgg-encrypt-region (start end rcpts)
   (interactive
    (list (region-beginning)(region-end)
@@ -162,6 +163,7 @@ and END to the keyring.")
          (insert-buffer-substring pgg-errors-buffer))))
     status))
 
+;;;###autoload
 (defun pgg-decrypt-region (start end)
   (interactive "r")
   (let* ((packet (cdr (assq 1 (pgg-parse-armor-region start end))))
@@ -185,11 +187,13 @@ and END to the keyring.")
          (insert-buffer-substring pgg-errors-buffer))))
     status))
 
-(defun pgg-sign-region (start end)
+;;;###autoload
+(defun pgg-sign-region (start end &optional cleartext)
   (interactive "r")
   (let* ((entity (pgg-make-scheme pgg-default-scheme))
         (status (luna-send entity 'sign-region 
-                           entity start end (interactive-p))))
+                           entity start end 
+                           (or (interactive-p) cleartext))))
     (when (interactive-p)
       (if status
          (progn
@@ -200,6 +204,7 @@ and END to the keyring.")
          (insert-buffer-substring pgg-errors-buffer))))
     status))
 
+;;;###autoload
 (defun pgg-verify-region (start end &optional signature fetch)
   (interactive "r")
   (let* ((packet
@@ -224,7 +229,8 @@ and END to the keyring.")
         status)
     (and (stringp key)
         (setq key (concat "0x" (pgg-truncate-key-identifier key)))
-        (null (pgg-lookup-key-string key))
+        (null (let ((pgg-scheme scheme))
+                (pgg-lookup-key-string key)))
         (or fetch (interactive-p))
         (y-or-n-p (format "Key %s not found; attempt to fetch? " key))
         (setq keyserver 
@@ -234,22 +240,31 @@ and END to the keyring.")
     (setq status (luna-send entity 'verify-region 
                            entity start end signature))
     (when (interactive-p)
-      (if status
-         (progn
-           (delete-region start end)
-           (insert-buffer-substring pgg-output-buffer))
-       (with-output-to-temp-buffer pgg-echo-buffer
-         (set-buffer standard-output)
-         (insert-buffer-substring pgg-errors-buffer))))
+      (with-output-to-temp-buffer pgg-echo-buffer
+       (set-buffer standard-output)
+       (insert-buffer-substring 
+        (if status pgg-output-buffer pgg-errors-buffer))
+       ))
     status))
 
+;;;###autoload
 (defun pgg-insert-key ()
+  (interactive)
   (let ((entity (pgg-make-scheme (or pgg-scheme pgg-default-scheme))))
     (luna-send entity 'insert-key entity)))
 
+;;;###autoload
 (defun pgg-snarf-keys-region (start end)
-  (let ((entity (pgg-make-scheme (or pgg-scheme pgg-default-scheme))))
-    (luna-send entity 'snarf-keys-region entity start end)))
+  (interactive "r")
+  (let* ((entity (pgg-make-scheme (or pgg-scheme pgg-default-scheme)))
+        (status (luna-send entity 'snarf-keys-region entity start end)))
+    (when (interactive-p)
+      (with-output-to-temp-buffer pgg-echo-buffer
+       (set-buffer standard-output)
+       (insert-buffer-substring 
+        (if status pgg-output-buffer pgg-errors-buffer))
+       ))
+    status))
 
 (defun pgg-lookup-key-string (string &optional type)
   (let ((entity (pgg-make-scheme (or pgg-scheme pgg-default-scheme))))
@@ -337,6 +352,33 @@ and END to the keyring.")
 (defun pgg-remove-passphrase-cache (key)
   (unintern key pgg-passphrase-cache))
 
+(defmacro pgg-convert-lbt-region (start end lbt)
+  `(let ((pgg-conversion-end (set-marker (make-marker) ,end)))
+     (goto-char ,start)
+     (case ,lbt
+       (CRLF
+       (while (progn 
+                (end-of-line) 
+                (> (marker-position pgg-conversion-end) (point)))
+         (insert "\r")
+         (forward-line 1)))
+       (LF
+       (while (re-search-forward "\r$" pgg-conversion-end t)
+         (replace-match ""))))
+     ))
+
+(put 'pgg-as-lbt 'lisp-indent-function 3)
+
+(defmacro pgg-as-lbt (start end lbt &rest body)
+  `(let ((inhibit-read-only t)
+        buffer-read-only
+        buffer-undo-list)
+     (pgg-convert-lbt-region ,start ,end ,lbt)
+     (let ((,end (point)))
+       ,@body)
+     (push nil buffer-undo-list)
+     (undo)))
+
 
 ;;; @ postprocess macros
 ;;;