I wonder if librep development is completely dead?  The librep mailing
list certainly appears to be.  Anyway, I tinkered with rep.util.repl a
bit and added tab completion for interpreter special commands such as
,apropos and ,describe.  Since the completion works on a word basis
and a comma can also stand for unquote, completion alternatives for
words beginning with a comma are chosen from all bound symbols and
special commands.

-- 
        Timo Korvola            <URL:http://www.iki.fi/tkorvola>

diff --git a/lisp/rep/util/repl.jl b/lisp/rep/util/repl.jl
index 4a5334c..19dfcbb 100644
--- a/lisp/rep/util/repl.jl
+++ b/lisp/rep/util/repl.jl
@@ -51,6 +51,12 @@
   (define (repl-eval form)
     (eval form (intern-structure (repl-struct (fluid current-repl)))))
 
+  (define (repl-boundp sym)
+    (condition-case nil
+        (progn (repl-eval sym)
+               t)
+      (void-value nil)))
+
   ;; returns t if repl should run again
   (define (repl-iterate repl input)
     (setq input (concat (repl-pending repl) input))
@@ -135,13 +141,13 @@
          (write standard-output #\newline)))))
 
   (define (completion-generator w)
-    (apropos (concat #\^ (quote-regexp w))
-            (lambda (x)
-              (condition-case nil
-                  (progn
-                    (repl-eval x)
-                    t)
-                (void-value nil)))))
+    (if (string-head-eq w ",")
+        ;; Either a special command or unquote.
+        (mapcar (lambda (x) (concat "," (symbol-name x)))
+                (apropos (concat #\^ (quote-regexp (substring w 1)))
+                         (lambda (x) (or (repl-boundp x)
+                                         (assq x repl-commands)))))
+      (apropos (concat #\^ (quote-regexp w)) repl-boundp)))
 
   (define (repl-completions repl word)
     (let-fluids ((current-repl repl))
@@ -404,12 +410,7 @@ commands may be abbreviated to their unique leading 
characters.\n\n")
    'apropos
    (lambda (re)
      (require 'rep.lang.doc)
-     (let ((funs (apropos re (lambda (x)
-                              (condition-case nil
-                                  (progn
-                                    (repl-eval x)
-                                    t)
-                                (void-value nil))))))
+     (let ((funs (apropos re repl-boundp)))
        (mapc (lambda (x)
               (describe-value (repl-eval x) x)) funs)))
    "\"REGEXP\"")

Reply via email to