Racket: new commands to show and hide test submodules
authorJose Antonio Ortega Ruiz <jao@gnu.org>
Sun, 25 Aug 2013 04:22:05 +0000 (25 06:22 +0200)
committerJose Antonio Ortega Ruiz <jao@gnu.org>
Sun, 25 Aug 2013 04:22:05 +0000 (25 06:22 +0200)
The new commands, being racket-specific, are called
geiser-racket-{show,hide,toggle}-tests, and have no default binding in
geiser-mode (since they don't have any meaning in Guile).

The implementation is based on more generic functions in geiser-edit
that allow hiding of any top-level form, given its name, so we will
probably find new forms to hide in the future.

Hiding is limited to top-level forms, which i think is fine for the only
use case we have in mind right now.

NEWS
elisp/geiser-edit.el
elisp/geiser-racket.el

diff --git a/NEWS b/NEWS
index a97af0a..5f3b250 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,8 @@
 
   New features:
 
+   - Racket: new commands geiser-racket-{show, hide, toggle}-tests,
+     for hiding test modules in code buffers.
    - Racket: interaction with submodules (entering them and evaluation
      within their scope).
    - New commands geiser-eval-buffer (C-c C-b) and
index 5d5cd1b..f75e303 100644 (file)
@@ -181,6 +181,34 @@ or following links in error buffers.")
       (goto-char p)
       (error "No %s error" msg))))
 
+\f
+;;; Visibility
+(defun geiser-edit--cloak (form)
+  (intern (format "geiser-edit-cloak-%s" form)))
+
+(defun geiser-edit--hide (form)
+  (geiser-edit--show form)
+  (let ((cloak (geiser-edit--cloak form)))
+    (save-excursion
+      (goto-char (point-min))
+      (while (re-search-forward (format "(%s\\b" (regexp-quote form)) nil t)
+        (let* ((beg (match-beginning 0))
+               (end (progn (ignore-errors (goto-char beg) (forward-sexp))
+                           (point))))
+          (when (> end beg)
+            (overlay-put (make-overlay beg end) 'invisible cloak)))))
+    (add-to-invisibility-spec (cons cloak t))))
+
+(defun geiser-edit--show (form)
+  (let ((cloak (geiser-edit--cloak form)))
+    (remove-overlays nil nil 'invisible cloak)
+    (remove-from-invisibility-spec (cons cloak t))))
+
+(defun geiser-edit--toggle-visibility (form)
+  (if (and (listp buffer-invisibility-spec)
+           (assoc (geiser-edit--cloak form) buffer-invisibility-spec))
+      (geiser-edit--show form)
+    (geiser-edit--hide form)))
 
 \f
 ;;; Commands:
index 4fbc017..9e00c4d 100644 (file)
@@ -370,6 +370,27 @@ using start-geiser, a procedure in the geiser/server module."
     (setq geiser-image-cache-dir
           (geiser-eval--send/result '(:eval (image-cache) geiser/user)))))
 
+\f
+;;; Additional commands
+
+(defconst geiser-racket--test-module "module+ test")
+
+(defun geiser-racket-toggle-tests ()
+  "Toggle visibility of test module fragments of the form (module+ test).
+
+When hidden, the test module forms are shown as an ellipsis."
+  (interactive)
+  (geiser-edit--toggle-visibility geiser-racket--test-module))
+
+(defun geiser-racket-show-tests ()
+  "Unconditionally shows all test modules."
+  (interactive)
+  (geiser-edit--show geiser-racket--test-module))
+
+(defun geiser-racket-hide-tests ()
+  "Unconditionally hides all visible test modules."
+  (interactive)
+  (geiser-edit--hide geiser-racket--test-module))
 
 \f
 ;;; Implementation definition: