branch: elpa/cider
commit 5964bd30d9a18144333e9c437879755aa029ce61
Author: Kato Muso <[email protected]>
Commit: GitHub <[email protected]>

    Add an alternative way to display `cider-cheatsheet-select` (#3686)
    
    Instead of having the multi-step selection process, which is the default 
cider-cheatsheet-select behavior, we represent each candidate as a full path to 
a var when cider-cheatsheet-select is called with a prefix argument. This can 
be handy with fuzzy completion style and vertical candidates display.
---
 CHANGELOG.md        |  1 +
 cider-cheatsheet.el | 40 +++++++++++++++++++++++++++++-----------
 2 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1154d51786..97c8e10e4f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@
 - [#3681](https://github.com/clojure-emacs/cider/pull/3681): Add an 
alternative way to display cheatsheet in a buffer and make it the default.
   - Current `cider-cheatsheet` command is renamed to `cider-cheatsheet-select`.
   - New way to display cheatsheet in a buffer is available with 
`cider-cheatsheet` command.
+- [#3686](https://github.com/clojure-emacs/cider/pull/3686): Add an 
alternative way to display `cider-cheatsheet-select` when called with a prefix 
argument.
 - [#3632](https://github.com/clojure-emacs/cider/pull/3623): Add new 
configuration variable `cider-clojure-cli-global-aliases`.
 - [#3366](https://github.com/clojure-emacs/cider/pull/3366): Support display 
of error overlays with `#dbg!` and `#break!` reader macros.
 - [#3622](https://github.com/clojure-emacs/cider/pull/3461): Basic support for 
using CIDER from 
[clojure-ts-mode](https://github.com/clojure-emacs/clojure-ts-mode).
diff --git a/cider-cheatsheet.el b/cider-cheatsheet.el
index 86fc745b9c..6ab38fc60e 100644
--- a/cider-cheatsheet.el
+++ b/cider-cheatsheet.el
@@ -32,6 +32,7 @@
 (require 'cl-lib)
 (require 'map)
 (require 'seq)
+(require 'subr-x)
 
 (defconst cider-cheatsheet-hierarchy
   '(("Documentation"
@@ -549,18 +550,35 @@ This list is supposed to have the following format:
         (mapcar #'symbol-name vars)
       (mapcar (lambda (var) (format "%s/%s" ns var)) vars))))
 
+(defun cider-cheatsheet--flatten-hierarchy (hierarchy &optional sections)
+  "Transform HIERARCHY to lists each representing a path with SECTIONS before 
var."
+  (seq-mapcat (lambda (node)
+                (if (stringp (car node))
+                    (cider-cheatsheet--flatten-hierarchy (cdr node) (cons (car 
node) sections))
+                  (mapcar (lambda (var) (reverse (cons var sections)))
+                          (cider-cheatsheet--expand-vars node))))
+              hierarchy))
+
 ;;;###autoload
-(defun cider-cheatsheet-select ()
-  "Navigate cheatsheet sections and show documentation for selected var."
-  (interactive)
-  (let ((hierarchy cider-cheatsheet-hierarchy))
-    (while (stringp (caar hierarchy))
-      (let* ((sections (mapcar #'car hierarchy))
-             (section (completing-read "Select section: " sections)))
-        (setq hierarchy (map-elt hierarchy section))))
-    (let* ((vars (seq-mapcat #'cider-cheatsheet--expand-vars hierarchy))
-           (var (completing-read "Select var: " vars)))
-      (cider-doc-lookup var))))
+(defun cider-cheatsheet-select (&optional flat)
+  "Navigate cheatsheet sections and show documentation for selected var.
+
+With a prefix argument FLAT, represent each candidate as a full path to var."
+  (interactive "P")
+  (if flat
+      (let* ((hierarchy (cider-cheatsheet--flatten-hierarchy 
cider-cheatsheet-hierarchy))
+             (paths (mapcar (lambda (sections) (string-join sections " > ")) 
hierarchy))
+             (path (completing-read "Select path: " paths))
+             (var (car (last (split-string path " > ")))))
+        (cider-doc-lookup var))
+    (let ((hierarchy cider-cheatsheet-hierarchy))
+      (while (stringp (caar hierarchy))
+        (let* ((sections (mapcar #'car hierarchy))
+               (section (completing-read "Select section: " sections)))
+          (setq hierarchy (map-elt hierarchy section))))
+      (let* ((vars (seq-mapcat #'cider-cheatsheet--expand-vars hierarchy))
+             (var (completing-read "Select var: " vars)))
+        (cider-doc-lookup var)))))
 
 (cl-defun cider-cheatsheet--insert-hierarchy (hierarchy &optional (level 0))
   "Insert HIERARCHY with visual indentation for LEVEL."

Reply via email to