emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/cider 186b497656: [Fix #3200] Improve browse-ns interface


From: ELPA Syncer
Subject: [nongnu] elpa/cider 186b497656: [Fix #3200] Improve browse-ns interface with filters and groupings (#3217)
Date: Tue, 28 Jun 2022 01:58:10 -0400 (EDT)

branch: elpa/cider
commit 186b4976565a18fcb00e1685a44a87a8559eadcc
Author: Zachary Romero <zacromero@posteo.net>
Commit: GitHub <noreply@github.com>

    [Fix #3200] Improve browse-ns interface with filters and groupings (#3217)
    
    Major re-work of the browse-ns interface, as well as fixing
    misc bug.
    
    - cider-browse-ns--thing-at-point didn't distinguish a ns without '.'
    - Added helper nrepl-dict-filter to filter entries in a nrepl-dict
    - added grouping feature and corresponding keybindings
    - added filtering features and corresponding keybindings
    - added new local vars to aid in re-displaying buffer
---
 CHANGELOG.md                                    |   1 +
 cider-browse-ns.el                              | 391 +++++++++++++++++++++---
 cider-client.el                                 |   9 +
 cider-debug.el                                  |  21 +-
 doc/modules/ROOT/assets/images/ns_browser.png   | Bin 292793 -> 217749 bytes
 doc/modules/ROOT/pages/usage/misc_features.adoc |  26 ++
 nrepl-dict.el                                   |  12 +
 test/cider-browse-ns-tests.el                   |   7 +-
 8 files changed, 416 insertions(+), 51 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5da369b039..5291ffb405 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@
 ## Changes
 
 * Upgrade injected `cider-nrepl` to 
[0.28.5](https://github.com/clojure-emacs/cider-nrepl/releases/tag/v0.28.5).
+* [#3200](https://github.com/clojure-emacs/cider/issues/3200): Improve 
cider-browse-ns interface to allow selective hiding of var types as well as 
grouping options.  Include private vars in result list.
 
 ## 1.4.1 (2022-05-25)
 
diff --git a/cider-browse-ns.el b/cider-browse-ns.el
index 8c864cc87c..76e5c05600 100644
--- a/cider-browse-ns.el
+++ b/cider-browse-ns.el
@@ -42,12 +42,41 @@
 
 (require 'subr-x)
 (require 'easymenu)
+(require 'button)
+(require 'cl-lib)
 (require 'thingatpt)
 
+
+(defgroup cider-browse-ns nil
+  "Display contents of namespaces for CIDER."
+  :prefix "cider-browse-ns-"
+  :group 'cider)
+
+(defface cider-browse-ns-extra-info-face
+  '((t (:inherit shadow)))
+  "Face for displaying extra info of namespace vars."
+  :package-version '(cider . "1.4.0"))
+
+(defcustom cider-browse-ns-default-filters nil
+  "List of default hide filters to apply to browse-ns buffer.
+
+Available options include `private', `test', `macro', `function', and
+`var'."
+  :type 'list
+  :package-version '(cider . "1.4.0"))
+
 (defconst cider-browse-ns-buffer "*cider-ns-browser*")
 
 (defvar-local cider-browse-ns-current-ns nil)
 
+(defvar-local cider-browse-ns-filters nil)
+(defvar-local cider-browse-ns-show-all nil)
+(defvar-local cider-browse-ns-group-by nil)
+(defvar-local cider-browse-ns-items nil)
+(defvar-local cider-browse-ns-title nil)
+(defvar-local cider-browse-ns-group-by nil)
+
+
 ;; Mode Definition
 
 (defvar cider-browse-ns-mode-map
@@ -59,6 +88,18 @@
     (define-key map "^" #'cider-browse-ns-all)
     (define-key map "n" #'next-line)
     (define-key map "p" #'previous-line)
+
+    (define-key map "a" #'cider-browse-ns-toggle-all)
+
+    (define-key map (kbd "h p") #'cider-browse-ns-toggle-hide-private)
+    (define-key map (kbd "h t") #'cider-browse-ns-toggle-hide-test)
+    (define-key map (kbd "h m") #'cider-browse-ns-toggle-hide-macro)
+    (define-key map (kbd "h f") #'cider-browse-ns-toggle-hide-function)
+    (define-key map (kbd "h v") #'cider-browse-ns-toggle-hide-var)
+
+    (define-key map (kbd "g t") #'cider-browse-ns-group-by-type)
+    (define-key map (kbd "g v") #'cider-browse-ns-group-by-visibility)
+
     (easy-menu-define cider-browse-ns-mode-menu map
       "Menu for CIDER's namespace browser"
       '("Namespace Browser"
@@ -106,22 +147,256 @@ VAR-META is used to decide a font-lock face."
                 'mouse-face 'highlight
                 'keymap cider-browse-ns-mouse-map)))
 
-(defun cider-browse-ns--list (buffer title items &optional ns noerase)
-  "Reset contents of BUFFER.
-Display TITLE at the top and ITEMS are indented underneath.
-If NS is non-nil, it is added to each item as the
-`cider-browse-ns-current-ns' text property.  If NOERASE is non-nil, the
-contents of the buffer are not reset before inserting TITLE and ITEMS."
+(defun cider-browse-ns--ns-list (buffer title nss)
+  "List the namespaces NSS in BUFFER.
+
+Buffer is rendered with TITLE at the top and lists ITEMS filtered according
+to user settings."
+  (let ((dict (nrepl-dict)))
+    (dolist (ns nss)
+      (nrepl-dict-put dict ns (nrepl-dict "ns" "true")))
+    (cider-browse-ns--list buffer title dict nil)))
+
+(defun cider-browse-ns--list (buffer title items ns)
+  "Initialize rendering of browse-ns BUFFER.
+
+Initialize the buffer's TITLE, namespace NS, and the nrepl-dict ITEMS to be
+displayed."
   (with-current-buffer buffer
     (cider-browse-ns-mode)
-    (let ((inhibit-read-only t))
-      (unless noerase (erase-buffer))
-      (goto-char (point-max))
-      (insert (cider-propertize title 'ns) "\n")
-      (dolist (item items)
-        (insert (propertize (concat "  " item "\n")
-                            'cider-browse-ns-current-ns ns)))
-      (goto-char (point-min)))))
+    (setq-local cider-browse-ns-items items)
+    (setq-local cider-browse-ns-title title)
+    (setq-local cider-browse-ns-filters cider-browse-ns-default-filters)
+    (setq-local cider-browse-ns-current-ns ns))
+  (cider-browse-ns--render-buffer))
+
+(defun cider-browse-ns--meta-macro-p (var-meta)
+  "Return non-nil if VAR-META is the metadata of a macro."
+  (and (nrepl-dict-contains var-meta "arglists")
+       (string= (nrepl-dict-get var-meta "macro") "true")))
+
+(defun cider-browse-ns--meta-test-p (var-meta)
+  "Return non-nil if VAR-META is the metadata of a test."
+  (nrepl-dict-contains var-meta "test"))
+
+(defun cider-browse-ns--meta-function-p (var-meta)
+  "Return non-nil if VAR-META is the metadata of a function."
+  (and (nrepl-dict-contains var-meta "arglists")
+       (not (cider-browse-ns--meta-macro-p var-meta))))
+
+(defun cider-browse-ns--meta-private-p (var-meta)
+  "Return non-nil if VAR-META indicates a private element."
+  (string= (nrepl-dict-get var-meta "private") "true"))
+
+(defun cider-browse-ns--meta-var-p (var-meta)
+  "Return non-nil if VAR-META indicates a var."
+  (not (or (cider-browse-ns--meta-test-p var-meta)
+           (cider-browse-ns--meta-macro-p var-meta)
+           (cider-browse-ns--meta-function-p var-meta))))
+
+(defun cider-browse-ns--item-filter (_ var-meta)
+  "Return non-nil if item containing VAR-META should be listed in buffer."
+  (let ((function-filter-p (memq 'function cider-browse-ns-filters))
+        (var-filter-p (memq 'var cider-browse-ns-filters))
+        (private-filter-p (memq 'private cider-browse-ns-filters))
+        (test-filter-p (memq 'test cider-browse-ns-filters))
+        (macro-filter-p (memq 'macro cider-browse-ns-filters)))
+    ;; check if item should be displayed
+    (let* ((macro-p (cider-browse-ns--meta-macro-p var-meta))
+           (function-p (cider-browse-ns--meta-function-p var-meta))
+           (private-p (cider-browse-ns--meta-private-p var-meta))
+           (test-p (cider-browse-ns--meta-test-p var-meta))
+           (var-p (cider-browse-ns--meta-var-p var-meta)))
+      (or cider-browse-ns-show-all
+          (not (or (and macro-p macro-filter-p)
+                   (and function-p function-filter-p)
+                   (and test-p test-filter-p)
+                   (and var-p var-filter-p)
+                   (and private-p private-filter-p)))))))
+
+(defun cider-browse-ns--propertized-item (key items)
+  "Return propertized line of item KEY in nrepl-dict ITEMS."
+  (let* ((var-meta (nrepl-dict-get items key))
+         (face (cider-browse-ns--text-face (nrepl-dict-get items key)))
+         (private-p (string= (nrepl-dict-get var-meta "private") "true"))
+         (test-p (nrepl-dict-contains var-meta "test"))
+         (ns-p (nrepl-dict-contains var-meta "ns")))
+    (concat
+     (propertize key
+                 'font-lock-face face
+                 'ns ns-p)
+     " "
+     (cond
+      (test-p (propertize "(test) " 'face 'cider-browse-ns-extra-info-face))
+      (private-p (propertize "(-) " 'face 'cider-browse-ns-extra-info-face))
+      (t "")))))
+
+(defun cider-browse-ns--display-list (keys items max-length &optional label)
+  "Render the items of KEYS as condained in the nrepl-dict ITEMS.
+
+Pad the row to be MAX-LENGTH+1.  If LABEL is non-nil, add a header to the
+list of items."
+  (when keys
+    (when label
+      (insert "  " label ":\n"))
+    (dolist (key keys)
+      (let* ((doc (nrepl-dict-get-in items (list key "doc")))
+             (doc (when doc (read doc)))
+             (first-doc-line (cider-browse-ns--first-doc-line doc))
+             (item-line (cider-browse-ns--propertized-item key items)))
+        (insert "  ")
+        (insert item-line)
+        (when cider-browse-ns-current-ns
+          (insert (make-string (+ (- max-length (string-width item-line)) 1) 
?ยท))
+          (insert " " (propertize first-doc-line 'font-lock-face 
'font-lock-doc-face)))
+        (insert "\n")))
+    (insert "\n")))
+
+(defun cider-browse-ns--column-width (items)
+  "Determine the display width of displayed ITEMS."
+  (let* ((propertized-lines
+          (seq-map (lambda (key)
+                     (cider-browse-ns--propertized-item key items))
+                   (nrepl-dict-keys items))))
+    (if propertized-lines
+        (apply #'max (seq-map (lambda (entry) (string-width entry))
+                              propertized-lines))
+      0)))
+
+(defun cider-browse-ns--render-items (items)
+  "Render the nrepl-dict ITEMS to the browse-ns buffer."
+  (let* ((max-length (cider-browse-ns--column-width items)))
+    (cl-labels
+        ((keys-from-pred
+          (pred items)
+          (nrepl-dict-keys (nrepl-dict-filter (lambda (_ var-meta)
+                                                (funcall pred var-meta))
+                                              items))))
+      (cond
+       ((eql cider-browse-ns-group-by 'type)
+        (let* ((func-keys (keys-from-pred #'cider-browse-ns--meta-function-p 
items))
+               (macro-keys (keys-from-pred #'cider-browse-ns--meta-macro-p 
items))
+               (var-keys (keys-from-pred #'cider-browse-ns--meta-var-p items))
+               (test-keys (keys-from-pred #'cider-browse-ns--meta-test-p 
items)))
+          (cider-browse-ns--display-list func-keys items max-length 
"Functions")
+          (cider-browse-ns--display-list macro-keys items max-length "Macros")
+          (cider-browse-ns--display-list var-keys items max-length "Vars")
+          (cider-browse-ns--display-list test-keys items max-length "Tests")))
+       ((eql cider-browse-ns-group-by 'visibility)
+        (let* ((public-keys
+                (keys-from-pred
+                 (lambda (var-meta)
+                   (not (cider-browse-ns--meta-private-p var-meta)))
+                 items))
+               (private-keys (keys-from-pred #'cider-browse-ns--meta-private-p 
items)))
+          (cider-browse-ns--display-list public-keys items max-length "Public")
+          (cider-browse-ns--display-list private-keys items max-length 
"Private")))
+       (t
+        (cider-browse-ns--display-list
+         (nrepl-dict-keys items) items max-length))))))
+
+(defun cider-browse-ns--filter (flag)
+  "Toggle the filter indicated by FLAG and re-render the buffer."
+  (setq cider-browse-ns-filters
+        (if (memq flag cider-browse-ns-filters)
+            (remq flag cider-browse-ns-filters)
+          (cons flag cider-browse-ns-filters)))
+  (cider-browse-ns--render-buffer))
+
+(defun cider-browse-ns--button-filter (button)
+  "Handle filter action for BUTTON."
+  (let ((flag (button-get button 'filter)))
+    (cider-browse-ns--filter flag)))
+
+(defun cider-browse-ns--group (flag)
+  "Set the group-by option to FLAG and re-renderthe buffer."
+  (setq cider-browse-ns-group-by
+        (if (eql flag cider-browse-ns-group-by) nil flag))
+  (cider-browse-ns--render-buffer))
+
+(defun cider-browse-ns--button-group (button)
+  "Handle grouping action for BUTTON."
+  (let ((flag (button-get button 'group-by)))
+    (cider-browse-ns--group flag)))
+
+(defun cider-browse-ns--toggle-all (_button)
+  "Toggle the display-all visibility setting."
+  (setq cider-browse-ns-show-all (not cider-browse-ns-show-all))
+  (cider-browse-ns--render-buffer))
+
+(defun cider-browse-ns--render-header (&optional filtered-items-ct)
+  "Render the section at the top of the buffer displaying visibility controls.
+
+If FILTERED-ITEMS-CT is non-nil, then display a message of how many items
+are being filtered."
+  ;; Display Show line
+  (insert "  Show: ")
+  (insert-text-button "All"
+                      'follow-link t
+                      'action #'cider-browse-ns--toggle-all
+                      ;; 'help-echo (cider-stacktrace-tooltip)
+                      'face (if cider-browse-ns-show-all
+                                'cider-stacktrace-filter-active-face
+                              nil))
+  (insert "\n")
+  ;; Display Filters
+  (let ((filters '(("Private" private)
+                   ("Test" test)
+                   ("Macro" macro)
+                   ("Function" function)
+                   ("Var" var))))
+    (insert "  Hide: ")
+    (dolist (filter filters)
+      (seq-let (title key) filter
+        (let ((is-active (memq key cider-browse-ns-filters)))
+          (insert-text-button title
+                              'filter key
+                              'follow-link t
+                              'action #'cider-browse-ns--button-filter
+                              ;; 'help-echo (cider-stacktrace-tooltip)
+                              'face (if (and is-active (not 
cider-browse-ns-show-all))
+                                        'cider-stacktrace-filter-active-face
+                                      nil))
+          (insert " "))))
+    (when filtered-items-ct
+      (insert (format "(%d items filtered)" filtered-items-ct))))
+  (insert "\n")
+  ;; Groupings
+  (insert "  Group-by: ")
+  (let ((groupings '(("Type" type)
+                     ("Visibility" visibility))))
+    (dolist (grouping groupings)
+      (seq-let (title key) grouping
+        (let ((is-active (eql key cider-browse-ns-group-by)))
+          (insert-text-button title
+                              'group-by key
+                              'follow-link t
+                              'action #'cider-browse-ns--button-group
+                              ;; 'help-echo ()
+                              'face (if is-active
+                                        'cider-stacktrace-filter-active-face
+                                      nil)))
+        (insert " "))))
+  (insert "\n\n"))
+
+(defun cider-browse-ns--render-buffer (&optional buffer)
+  "Render the sections of the browse-ns buffer.
+
+Render occurs in BUFFER if non-nil.  This function is the main entrypoint
+for redisplaying the buffer when filters change."
+  (with-current-buffer (or buffer (current-buffer))
+    (let* ((inhibit-read-only t)
+           (point (point))
+           (filtered-items (nrepl-dict-filter #'cider-browse-ns--item-filter
+                                              cider-browse-ns-items))
+           (filtered-item-ct (- (length (nrepl-dict-keys 
cider-browse-ns-items))
+                                (length (nrepl-dict-keys filtered-items)))))
+      (erase-buffer)
+      (insert (propertize (cider-propertize cider-browse-ns-title 'ns) 'ns t) 
"\n")
+      (when cider-browse-ns-current-ns
+        (cider-browse-ns--render-header filtered-item-ct))
+      (cider-browse-ns--render-items filtered-items)
+      (goto-char point))))
 
 (defun cider-browse-ns--first-doc-line (doc)
   "Return the first line of the given DOC string.
@@ -137,19 +412,19 @@ string is returned."
          (t (concat first-line "..."))))
     "Not documented."))
 
-(defun cider-browse-ns--items (namespace)
-  "Return the items to show in the namespace browser of the given NAMESPACE.
-Each item consists of a ns-var and the first line of its docstring."
-  (let* ((ns-vars-with-meta (cider-sync-request:ns-vars-with-meta namespace))
-         (propertized-ns-vars (nrepl-dict-map #'cider-browse-ns--properties 
ns-vars-with-meta)))
-    (mapcar (lambda (ns-var)
-              (let* ((doc (nrepl-dict-get-in ns-vars-with-meta (list ns-var 
"doc")))
-                     ;; to avoid (read nil)
-                     ;; it prompts the user for a Lisp expression
-                     (doc (when doc (read doc)))
-                     (first-doc-line (cider-browse-ns--first-doc-line doc)))
-                (concat ns-var " " (propertize first-doc-line 'font-lock-face 
'font-lock-doc-face))))
-            propertized-ns-vars)))
+(defun cider-browse-ns--combined-vars-with-meta (namespace)
+  "Return the combined public and private vars in NAMESPACE.
+
+Private vars have the additional metadata \"private\": \"true\" in their
+var-meta map."
+  (let ((items (cider-sync-request:ns-vars-with-meta namespace))
+        (private-items (cider-sync-request:private-ns-vars-with-meta 
namespace)))
+    (when private-items
+      (dolist (key (nrepl-dict-keys private-items))
+        (let ((var-meta (nrepl-dict-put (nrepl-dict-get private-items key)
+                                        "private" "true")))
+          (setq items (nrepl-dict-put items key var-meta)))))
+    items))
 
 ;; Interactive Functions
 
@@ -160,8 +435,8 @@ Each item consists of a ns-var and the first line of its 
docstring."
   (with-current-buffer (cider-popup-buffer cider-browse-ns-buffer 'select nil 
'ancillary)
     (cider-browse-ns--list (current-buffer)
                            namespace
-                           (cider-browse-ns--items namespace))
-    (setq-local cider-browse-ns-current-ns namespace)))
+                           (cider-browse-ns--combined-vars-with-meta namespace)
+                           namespace)))
 
 ;;;###autoload
 (defun cider-browse-ns-all ()
@@ -169,24 +444,66 @@ Each item consists of a ns-var and the first line of its 
docstring."
   (interactive)
   (with-current-buffer (cider-popup-buffer cider-browse-ns-buffer 'select nil 
'ancillary)
     (let ((names (cider-sync-request:ns-list)))
-      (cider-browse-ns--list (current-buffer)
-                             "All loaded namespaces"
-                             (mapcar (lambda (name)
-                                       (cider-browse-ns--properties name nil))
-                                     names))
-      (setq-local cider-browse-ns-current-ns nil))))
+      (cider-browse-ns--ns-list
+       (current-buffer)
+       "All loaded namespaces"
+       (mapcar (lambda (name)
+                 (cider-browse-ns--properties name nil))
+               names)))))
 
 (defun cider-browse-ns--thing-at-point ()
   "Get the thing at point.
 Return a list of the type ('ns or 'var) and the value."
-  (let ((line (car (split-string (string-trim (thing-at-point 'line)) " "))))
-    (if (string-match "\\." line)
+  (let ((ns-p (get-text-property (point) 'ns))
+        (line (car (split-string (string-trim (thing-at-point 'line)) " "))))
+    (if (or ns-p (string-match "\\." line))
         `(ns ,line)
       `(var ,(format "%s/%s"
                      (or (get-text-property (point) 
'cider-browse-ns-current-ns)
                          cider-browse-ns-current-ns)
                      line)))))
 
+(defun cider-browse-ns-toggle-all ()
+  "Toggle showing all of the items in the browse-ns buffer."
+  (interactive)
+  (cider-browse-ns--toggle-all nil))
+
+(defun cider-browse-ns-toggle-hide-private ()
+  "Toggle visibility of private items displayed in browse-ns buffer."
+  (interactive)
+  (cider-browse-ns--filter 'private))
+
+(defun cider-browse-ns-toggle-hide-test ()
+  "Toggle visibility of test items displayed in browse-ns buffer."
+  (interactive)
+  (cider-browse-ns--filter 'test))
+
+(defun cider-browse-ns-toggle-hide-macro ()
+  "Toggle visibility of macro items displayed in browse-ns buffer."
+  (interactive)
+  (cider-browse-ns--filter 'macro))
+
+(defun cider-browse-ns-toggle-hide-function ()
+  "Toggle visibility of function items displayed in browse-ns buffer."
+  (interactive)
+  (cider-browse-ns--filter 'function))
+
+(defun cider-browse-ns-toggle-hide-var ()
+  "Toggle visibility of var items displayed in browse-ns buffer."
+  (interactive)
+  (cider-browse-ns--filter 'var))
+
+(defun cider-browse-ns-group-by-type ()
+  "Toggle visibility of var items displayed in browse-ns buffer."
+  (interactive)
+  (cider-browse-ns--group 'type))
+
+(defun cider-browse-ns-group-by-visibility ()
+  "Toggle visibility of var items displayed in browse-ns buffer."
+  (interactive)
+  (cider-browse-ns--group 'visibility))
+
+
 (declare-function cider-doc-lookup "cider-doc")
 
 (defun cider-browse-ns-doc-at-point ()
diff --git a/cider-client.el b/cider-client.el
index a8c159955f..d4b8832896 100644
--- a/cider-client.el
+++ b/cider-client.el
@@ -743,6 +743,15 @@ returned."
                 (cider-nrepl-send-sync-request)
                 (nrepl-dict-get "ns-vars-with-meta")))
 
+(defun cider-sync-request:private-ns-vars-with-meta (ns)
+  "Get a map of the vars in NS to its metadata information."
+  (thread-first `("op" "ns-vars-with-meta"
+                  "ns" ,ns
+                  "var-query" ,(nrepl-dict "private?" "t"
+                                           "include-meta-key" '("private")))
+                (cider-nrepl-send-sync-request)
+                (nrepl-dict-get "ns-vars-with-meta")))
+
 (defun cider-sync-request:ns-load-all ()
   "Load all project namespaces."
   (thread-first '("op" "ns-load-all")
diff --git a/cider-debug.el b/cider-debug.el
index cc6b1bc3b1..e846d71e85 100644
--- a/cider-debug.el
+++ b/cider-debug.el
@@ -103,6 +103,8 @@ configure `cider-debug-prompt' instead."
 
 
 ;;; Implementation
+(declare-function cider-browse-ns--combined-vars-with-meta "cider-browse-ns")
+
 (defun cider-browse-instrumented-defs ()
   "List all instrumented definitions."
   (interactive)
@@ -110,22 +112,15 @@ configure `cider-debug-prompt' instead."
                                (nrepl-dict-get "list"))))
       (with-current-buffer (cider-popup-buffer cider-browse-ns-buffer t)
         (let ((inhibit-read-only t))
-          (erase-buffer)
           (dolist (list all)
             (let* ((ns (car list))
-                   (ns-vars-with-meta (cider-sync-request:ns-vars-with-meta 
ns))
-                   ;; seq of metadata maps of the instrumented vars
-                   (instrumented-meta (mapcar (apply-partially 
#'nrepl-dict-get ns-vars-with-meta)
-                                              (cdr list))))
+                   (ns-vars-with-meta 
(cider-browse-ns--combined-vars-with-meta ns))
+                   (instrumented-meta (nrepl-dict-filter (lambda (k _)
+                                                           (member k list))
+                                                         ns-vars-with-meta)))
               (cider-browse-ns--list (current-buffer) ns
-                                     (seq-mapn #'cider-browse-ns--properties
-                                               (cdr list)
-                                               instrumented-meta)
-
-                                     ns 'noerase)
-              (goto-char (point-max))
-              (insert "\n"))))
-        (goto-char (point-min)))
+                                     instrumented-meta
+                                     ns)))))
     (message "No currently instrumented definitions")))
 
 (defun cider--debug-response-handler (response)
diff --git a/doc/modules/ROOT/assets/images/ns_browser.png 
b/doc/modules/ROOT/assets/images/ns_browser.png
index bd8d7438d2..2c5ac4c7c5 100644
Binary files a/doc/modules/ROOT/assets/images/ns_browser.png and 
b/doc/modules/ROOT/assets/images/ns_browser.png differ
diff --git a/doc/modules/ROOT/pages/usage/misc_features.adoc 
b/doc/modules/ROOT/pages/usage/misc_features.adoc
index 1f8ddd4b00..607b2952cf 100644
--- a/doc/modules/ROOT/pages/usage/misc_features.adoc
+++ b/doc/modules/ROOT/pages/usage/misc_features.adoc
@@ -224,6 +224,11 @@ image::ns_browser.png[Namespace Browser]
 You can also browse all available namespaces with kbd:[M-x]
 `cider-browse-ns-all`.
 
+The UI contains buttons in the header which allow you to control how
+the buffer is displayed (see below for keybindings).  You may also
+configure the `cider-browse-ns-default-filters` variable to a list of
+the element types you want to be hidden by default.
+
 There are a bunch of useful keybindings that are defined in browser buffers.
 
 |===
@@ -244,6 +249,27 @@ There are a bunch of useful keybindings that are defined 
in browser buffers.
 | kbd:[n]
 | Go to next line.
 
+| kbd:[h p]
+| Toggle visibility of private items.
+
+| kbd:[h t]
+| Toggle visibility of tests.
+
+| kbd:[h m]
+| Toggle visibility of macros.
+
+| kbd:[h f]
+| Toggle visibility of functions.
+
+| kbd:[h v]
+| Toggle visibility of vars.
+
+| kbd:[g t]
+| Group items by type (function, macro, var, etc.).
+
+| kbd:[g v]
+| Group items by visibility (public vs. private).
+
 | kbd:[p]
 | Go to previous line.
 |===
diff --git a/nrepl-dict.el b/nrepl-dict.el
index 2d82c2ea8c..8db5a772ed 100644
--- a/nrepl-dict.el
+++ b/nrepl-dict.el
@@ -128,6 +128,18 @@ also always return a sequence (since the result will be 
flattened)."
   (when dict
     (apply #'append (nrepl-dict-map function dict))))
 
+(defun nrepl-dict-filter (function dict)
+  "For all key-values of DICT, return new dict where FUNCTION returns non-nil.
+
+FUNCTION should be a function taking two arguments, key and value."
+  (let ((new-map (nrepl-dict))
+        (keys (nrepl-dict-keys dict)))
+    (dolist (key keys)
+      (let ((val (nrepl-dict-get dict key)))
+        (when (funcall function key val)
+          (nrepl-dict-put new-map key val))))
+    new-map))
+
 
 ;;; More specific functions
 (defun nrepl--cons (car list-or-dict)
diff --git a/test/cider-browse-ns-tests.el b/test/cider-browse-ns-tests.el
index 13775a2ab1..854df69258 100644
--- a/test/cider-browse-ns-tests.el
+++ b/test/cider-browse-ns-tests.el
@@ -50,6 +50,7 @@
             '(dict "blank?"
                    (dict "arglists" "fn arg list"
                          "doc" "\"True if s is nil, empty, or contains only 
whitespace.\"")))
+    (spy-on 'cider-sync-request:private-ns-vars-with-meta :and-return-value 
'(dict))
 
     (with-temp-buffer
       (setq cider-browse-ns-buffer (buffer-name (current-buffer)))
@@ -59,7 +60,11 @@
       (search-forward "blank")
       (expect (get-text-property (point) 'font-lock-face) :to-equal 
'font-lock-function-name-face)
       (search-forward "True")
-      (expect (get-text-property (point) 'font-lock-face) :to-equal 
'font-lock-doc-face))))
+      (expect (get-text-property (point) 'font-lock-face) :to-equal 
'font-lock-doc-face)
+      ;; filter out the functions and ensure that blank? doesn't show up
+      (cider-browse-ns-toggle-hide-function)
+      (goto-char (point-min))
+      (expect (not (search-forward "blank" nil t))))))
 
 (describe "cider-browse-ns--first-doc-line"
   (it "returns Not documented if the doc string is missing"



reply via email to

[Prev in Thread] Current Thread [Next in Thread]