From 557fce4325f5dcdce89a925553edf0a22f3910b6 Mon Sep 17 00:00:00 2001
From: Jose Antonio Ortega Ruiz <jao@gnu.org>
Date: Sun, 14 Nov 2010 23:18:40 +0100
Subject: Better geiser-implementation-help (for Geiser hackers)

---
 elisp/geiser-impl.el | 78 +++++++++++++++++++++++++++-------------------------
 1 file changed, 40 insertions(+), 38 deletions(-)

(limited to 'elisp')

diff --git a/elisp/geiser-impl.el b/elisp/geiser-impl.el
index 40beb37..4266cbc 100644
--- a/elisp/geiser-impl.el
+++ b/elisp/geiser-impl.el
@@ -14,6 +14,8 @@
 (require 'geiser-custom)
 (require 'geiser-base)
 
+(require 'help-fns)
+
 
 ;;; Customization:
 
@@ -91,26 +93,26 @@ determine its scheme flavour."
 (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))
@@ -171,7 +173,7 @@ determine its scheme flavour."
 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 below.
+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
@@ -181,23 +183,23 @@ Omitted method names will return nil to their callers.
 
 Here's how a typical call to this macro looks like:
 
-(define-geiser-implementation guile
-  (binary geiser-guile--binary)
-  (arglist geiser-guile--parameters)
-  (repl-startup geiser-guile--startup)
-  (prompt-regexp geiser-guile--prompt-regexp)
-  (debugger-prompt-regexp geiser-guile--debugger-prompt-regexp)
-  (enter-debugger geiser-guile--enter-debugger)
-  (marshall-procedure geiser-guile--geiser-procedure)
-  (find-module geiser-guile--get-module)
-  (enter-command geiser-guile--enter-command)
-  (exit-command geiser-guile--exit-command)
-  (import-command geiser-guile--import-command)
-  (find-symbol-begin geiser-guile--symbol-begin)
-  (display-error geiser-guile--display-error)
-  (display-help)
-  (check-buffer geiser-guile--guess)
-  (keywords geiser-guile--keywords))
+  (define-geiser-implementation guile
+    (binary geiser-guile--binary)
+    (arglist geiser-guile--parameters)
+    (repl-startup geiser-guile--startup)
+    (prompt-regexp geiser-guile--prompt-regexp)
+    (debugger-prompt-regexp geiser-guile--debugger-prompt-regexp)
+    (enter-debugger geiser-guile--enter-debugger)
+    (marshall-procedure geiser-guile--geiser-procedure)
+    (find-module geiser-guile--get-module)
+    (enter-command geiser-guile--enter-command)
+    (exit-command geiser-guile--exit-command)
+    (import-command geiser-guile--import-command)
+    (find-symbol-begin geiser-guile--symbol-begin)
+    (display-error geiser-guile--display-error)
+    (display-help)
+    (check-buffer geiser-guile--guess)
+    (keywords geiser-guile--keywords))
 "
   (let ((name (if (listp name) (car name) name))
         (parent (and (listp name) (cadr name))))
-- 
cgit v1.2.3