 (defun geiser-implementation-help ()
   "Shows a buffer with help on defining new supported Schemes."
   (interactive)
-  (with-current-buffer (get-buffer-create "* Geiser implementation help*")
-    (setq buffer-read-only nil)
-    (delete-region (point-min) (point-max))
-    (insert "Use `define-geiser-implementation' to define new implementations"
-            "\n\n(define-geiser-implementation NAME &rest METHODS)\n\n"
-            (documentation 'define-geiser-implementation)
-            "\n\nMethods used to define an implementation:\n\n")
-    (let ((ms (sort (copy-list geiser-impl--method-docs)
-                    (lambda (a b) (string< (symbol-name (car a))
-                                      (symbol-name (car b)))))))
-      (dolist (m ms)
-        (geiser--insert-with-face (format "%s: " (car m)) 'bold)
-        (insert (cdr m))
-        (fill-paragraph)
-        (insert "\n\n")))
-    (goto-char (point-min))
-    (unless (eq major-mode 'help-mode) (help-mode))
-    (help-make-xrefs)
-    (setq buffer-read-only t)
-    (pop-to-buffer (current-buffer))))
+  (help-setup-xref (list #'geiser-implementation-help) t)
+  (save-excursion
+    (with-help-window (help-buffer)
+      (princ "Geiser: supporting new Scheme implementations.\n\n")
+      (princ "Use `define-geiser-implementation' to define ")
+      (princ "new implementations")
+      (princ "\n\n  (define-geiser-implementation NAME &rest METHODS)\n\n")
+      (princ (documentation 'define-geiser-implementation))
+      (princ "\n\nMethods used to define an implementation:\n\n")
+      (let ((ms (sort (copy-list geiser-impl--method-docs)
+                      (lambda (a b) (string< (symbol-name (car a))
+                                        (symbol-name (car b)))))))
+        (dolist (m ms)
+          (let ((p (with-current-buffer (help-buffer) (point))))
+            (princ (format "%s: " (car m)))
+            (princ (cdr m))
+            (with-current-buffer (help-buffer)
+              (fill-region-as-paragraph p (point)))
+            (princ "\n\n"))))
+      (with-current-buffer standard-output (buffer-string)))))
 
 (defun geiser-impl--register-local-method (var-name method fallback doc)
   (add-to-list 'geiser-impl--local-methods (list var-name method fallback))


(require 'geiser-custom)
(require 'geiser-base)



NAME can be either an unquoted symbol naming the implementation,
or a two-element list (NAME PARENT), with PARENT naming another
registered implementation from which to borrow methods not
defined in METHODS.

After NAME come the methods, each one a two element list of the
form (METHOD-NAME FUN-OR-VAR), where METHOD-NAME is one of the
