From fbc65dfc767da1dc3b28262eae041e9d303752c2 Mon Sep 17 00:00:00 2001
From: Jose Antonio Ortega Ruiz <jao@gnu.org>
Date: Mon, 16 Feb 2009 00:46:31 +0100
Subject: New command: module documentation.

---
 elisp/geiser-autodoc.el    |  2 +-
 elisp/geiser-completion.el | 15 ++++++-------
 elisp/geiser-custom.el     | 11 +++++-----
 elisp/geiser-doc.el        | 52 ++++++++++++++++++++++++++++++++++++++++++++++
 elisp/geiser-mode.el       |  9 ++++++--
 elisp/geiser-repl.el       |  1 +
 6 files changed, 75 insertions(+), 15 deletions(-)

(limited to 'elisp')

diff --git a/elisp/geiser-autodoc.el b/elisp/geiser-autodoc.el
index d7d6a08..7a63ef4 100644
--- a/elisp/geiser-autodoc.el
+++ b/elisp/geiser-autodoc.el
@@ -39,7 +39,7 @@
   "Options for displaying autodoc strings in the echo area."
   :group 'geiser)
 
-(geiser-custom--defface fuel-font-lock-markup-title
+(geiser-custom--defface autodoc-current-arg
   'bold geiser-autodoc "highlighting current argument in autodoc messages")
 
 (defcustom geiser-autodoc-delay 0.2
diff --git a/elisp/geiser-completion.el b/elisp/geiser-completion.el
index 814a587..22b36a1 100644
--- a/elisp/geiser-completion.el
+++ b/elisp/geiser-completion.el
@@ -26,6 +26,7 @@
 
 (require 'geiser-eval)
 (require 'geiser-log)
+(require 'geiser-syntax)
 (require 'geiser-base)
 
 
@@ -172,13 +173,13 @@ terminates a current completion."
 
 (defvar geiser-completion--module-history nil)
 
-(defun geiser-completion--read-module ()
-  (let ((minibuffer-local-completion-map geiser-completion--module-minibuffer-map)
-        (modules (geiser-completion--module-list))
-        (prompt "Module name: "))
-    (if modules
-        (completing-read prompt modules nil nil nil geiser-completion--module-history)
-      (read-string prompt nil geiser-completion--module-history))))
+(defun geiser-completion--read-module (&optional prompt default history)
+  (let ((minibuffer-local-completion-map geiser-completion--module-minibuffer-map))
+    (completing-read (or prompt "Module name: ")
+                     (geiser-completion--module-list)
+                     nil nil
+                     (or default (geiser-syntax--buffer-module))
+                     (or history geiser-completion--module-history))))
 
 (defun geiser--respecting-message (format &rest format-args)
   "Display TEXT as a message, without hiding any minibuffer contents."
diff --git a/elisp/geiser-custom.el b/elisp/geiser-custom.el
index 591d11a..27bcd33 100644
--- a/elisp/geiser-custom.el
+++ b/elisp/geiser-custom.el
@@ -43,11 +43,12 @@
   :group 'faces)
 
 (defmacro geiser-custom--defface (face def group doc)
-  `(defface ,face (face-default-spec ,def)
-     ,(format "Face for %s." doc)
-     :group ',group
-     :group 'geiser-faces
-     :group 'faces))
+  (let ((face (intern (format "geiser-font-lock-%s" face))))
+    `(defface ,face (face-default-spec ,def)
+       ,(format "Face for %s." doc)
+       :group ',group
+       :group 'geiser-faces
+       :group 'faces)))
 
 (put 'geiser-custom--defface 'lisp-indent-function 1)
 
diff --git a/elisp/geiser-doc.el b/elisp/geiser-doc.el
index 9dcb951..6bb1d10 100644
--- a/elisp/geiser-doc.el
+++ b/elisp/geiser-doc.el
@@ -26,9 +26,24 @@
 
 (require 'geiser-completion)
 (require 'geiser-eval)
+(require 'geiser-syntax)
 (require 'geiser-popup)
+(require 'geiser-custom)
 (require 'geiser-base)
 
+
+;;; Customization:
+
+(defgroup geiser-doc nil
+  "Options for documentation buffers."
+  :group 'geiser)
+
+(geiser-custom--defface doc-title
+  'bold geiser-doc "article titles in documentation buffers")
+
+(geiser-custom--defface doc-link
+  'link geiser-doc "links in documentation buffers")
+
 
 ;;; Documentation buffer:
 
@@ -40,6 +55,26 @@
 (defun geiser-doc--get-docstring (symbol)
   (geiser-eval--send/result `(:gs ((:ge docstring) ',symbol))))
 
+(defun geiser-doc--get-module-children (module)
+  (geiser-eval--send/result `(:gs ((:ge module-children) (quote (:scm ,module))))))
+
+
+;;; Auxiliary functions:
+
+(defun geiser-doc--insert-title (title)
+  (let ((p (point)))
+    (insert title)
+    (put-text-property p (point) 'face 'geiser-font-lock-doc-title))
+  (newline))
+
+(defun geiser-doc--insert-list (title lst)
+  (when lst
+    (geiser-doc--insert-title title)
+    (newline)
+    (dolist (w lst)
+      (insert (format "\t- %s\n" w)))
+    (newline)))
+
 
 ;;; Commands:
 
@@ -58,6 +93,23 @@ With prefix argument, ask for symbol (with completion)."
             (insert ds))
           (geiser-doc--pop-to-buffer))))))
 
+(defun geiser-doc-module (module)
+  "Display information about a given module."
+  (interactive (list (geiser-completion--read-module)))
+  (let ((children (geiser-doc--get-module-children module)))
+    (if (not children)
+        (message "No info available for %s" module)
+      (geiser-doc--with-buffer
+        (erase-buffer)
+        (geiser-doc--insert-title (format "%s" module))
+        (newline)
+        (geiser-doc--insert-list "Procedures:" (cdr (assoc 'procs children)))
+        (geiser-doc--insert-list "Variables:" (cdr (assoc 'vars children)))
+        (geiser-doc--insert-list "Submodules:" (cdr (assoc 'modules children)))
+        (goto-char (point-min)))
+      (geiser-doc--pop-to-buffer))))
+
+
 
 (provide 'geiser-doc)
 ;;; geiser-doc.el ends here
diff --git a/elisp/geiser-mode.el b/elisp/geiser-mode.el
index 84455e7..b023c3d 100644
--- a/elisp/geiser-mode.el
+++ b/elisp/geiser-mode.el
@@ -147,6 +147,10 @@ interacting with the Geiser REPL is at your disposal.
 
 ;;; Keys:
 
+(defun geiser-mode--triple-chord (p k c)
+  (define-key geiser-mode-map (vector '(control ?c) `(control ,p) k) c)
+  (define-key geiser-mode-map (vector '(control ?c) `(control ,p) `(control ,k)) c))
+
 (define-key geiser-mode-map "\C-c\C-z" 'switch-to-guile)
 (define-key geiser-mode-map "\C-c\C-l" 'geiser-load-current-buffer)
 (define-key geiser-mode-map "\C-c\C-k" 'geiser-compile-current-buffer)
@@ -162,8 +166,9 @@ interacting with the Geiser REPL is at your disposal.
 (define-key geiser-mode-map "\C-c\C-r" 'geiser-send-region)
 (define-key geiser-mode-map "\C-c\M-r" 'geiser-send-region-and-go)
 
-(define-key geiser-mode-map "\C-c\C-a" 'geiser-autodoc-mode)
-(define-key geiser-mode-map "\C-c\C-d" 'geiser-doc-symbol-at-point)
+(geiser-mode--triple-chord ?d ?a 'geiser-autodoc-mode)
+(geiser-mode--triple-chord ?d ?d 'geiser-doc-symbol-at-point)
+(geiser-mode--triple-chord ?d ?m 'geiser-doc-module)
 
 (define-key geiser-mode-map "\C-c\M-c" 'geiser-compile-definition)
 (define-key geiser-mode-map "\C-c\C-c" 'geiser-compile-definition-and-go)
diff --git a/elisp/geiser-repl.el b/elisp/geiser-repl.el
index 5b58a0a..ea424e3 100644
--- a/elisp/geiser-repl.el
+++ b/elisp/geiser-repl.el
@@ -150,6 +150,7 @@ REPL buffer."
 (define-key geiser-repl-mode-map "\C-a" 'geiser-repl--bol)
 (define-key geiser-repl-mode-map "\C-ca" 'geiser-autodoc-mode)
 (define-key geiser-repl-mode-map "\C-cd" 'geiser-doc-symbol-at-point)
+(define-key geiser-repl-mode-map "\C-cm" 'geiser-doc-module)
 (define-key geiser-repl-mode-map "\C-ck" 'geiser-compile-file)
 (define-key geiser-repl-mode-map "\C-cl" 'geiser-load-file)
 
-- 
cgit v1.2.3