anchor.diff:                                   (list *gpg-program* "--decrypt" ,gpg-file)
                                    :output out))))
                (with-input-from-string (,stream ,clear-data)
  -               (prog1
  +               (prog1             ; TODO: Shouldn't we `unwind-protect' instead?
                      (progn
                        ,@body)
                    ,(when (eq (getf options :direction) :io)
  -                    `(gpg-write ,stream ,gpg-file))))))
  -        `(let ((,result nil))
  -           (with-input-from-string (,in (with-output-to-string (,stream)
  -                                          (setf ,result (progn ,@body))))
  -             (gpg-write ,in ,gpg-file))
  +                    ;; TODO: Need to handle error when gpg-file key is not avilable.
  +                    `(gpg-write ,stream ,gpg-file (gpg-recipient ,gpg-file)))))))
  +        `(let ((,result nil)
  +               (,recipient (gpg-recipient ,gpg-file)))
  +           (if ,recipient
  +               (with-input-from-string (,in (with-output-to-string (,stream)
  +                                              (setf ,result (progn ,@body))))
  +                 (gpg-write ,in ,gpg-file ,recipient))
  +               (with-result (,recipient (read-from-minibuffer
  +                                        (make-minibuffer
  +                                         :input-prompt "Recipient:"
  +                                         :completion-function (gpg-key-completion-filter)
  +                                         :empty-complete-immediate t)))
  +                 (with-input-from-string (,in (with-output-to-string (,stream)
  +                                                (setf ,result (progn ,@body))))
  +                   (gpg-write ,in ,gpg-file (gpg-key-key-id ,recipient)))))
  +           ;; TODO: We need synchronous minibuffer prompts to return value for result.
              ,result))))
   
   (defmacro with-maybe-gpg-file ((stream filespec &rest options) &body body)
  
positive.code: Other options are not supported.  File is overwritten if it exists, while
  nothing is done if file is missing."
    ;; TODO: Support all of `open' options.
    (alex:with-gensyms (in clear-data result)
      (if (match (getf options :direction)
            ((or :io :input nil) t))
          `(when (uiop:file-exists-p ,gpg-file)
  
negative.code:         (values key mail name))
        *gpg-default-recipient*))
  
  (defun gpg-write (stream gpg-file recipient)
    "Write STREAM to GPG-FILE using RECIPIENT key."
    (if recipient
        ;; TODO: Handle GPG errors.
        (uiop:run-program
         (list *gpg-program* "--output" gpg-file "--recipient" recipient
               "--batch" "--yes" "--encrypt")
         :input stream)
        ;; TODO: Ask for recipient manually.
        (echo-warning "Set `*gpg-default-recipient*' to save ~s." gpg-file)))
  
  (defmacro with-gpg-file ((stream gpg-file &rest options) &body body)
    "Like `with-open-file' but use
  