summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rw-r--r--cider-cheatsheet.el41
-rw-r--r--cider-mode.el1
-rw-r--r--cider-repl.el2
4 files changed, 45 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index af76c643..25ef5c89 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,7 @@
* [#1976](https://github.com/clojure-emacs/cider/issues/1976): Add new interactive command `cider-connect-clojurescript`.
* Add a menu for `cider-browse-ns-mode`.
* [#2160](https://github.com/clojure-emacs/cider/issues/2160): Make it possible to configure the default `*print-level*` and `*print-length*` via defcustoms (`cider-repl-print-level` and `cider-repl-print-length`).
+* New interactive command `cider-cheatsheet` allows you to browse the Clojure Cheatsheet with an Emacs interface.
### Bugs Fixed
diff --git a/cider-cheatsheet.el b/cider-cheatsheet.el
index 0b40f779..36fbe4d8 100644
--- a/cider-cheatsheet.el
+++ b/cider-cheatsheet.el
@@ -28,6 +28,9 @@
;;; Code:
+(require 'cider-doc)
+(require 'seq)
+
(defconst cider-cheatsheet-hierarchy
'(("Primitives"
("Numbers"
@@ -508,6 +511,44 @@ Note that some Clojure symbols appear in more than once. This is entirely
intentional. For instance, `map` belongs in the sections on collections
and transducers.")
+(defun cider-cheatsheet--expand-vars (list)
+ "Expand the symbols in LIST to fully-qualified var names.
+
+This list is supposed to have the following format:
+
+ (my-ns var1 var2 var3)"
+ (let ((ns (car list))
+ (vars (cdr list)))
+ (if (eq ns :special)
+ (mapcar #'symbol-name vars)
+ (mapcar (lambda (var) (format "%s/%s" ns var)) vars))))
+
+(defun cider-cheatsheet--select-var (var-list)
+ "Expand the symbols in VAR-LIST to fully-qualified var names.
+
+The list can hold one or more lists inside - one per each namespace."
+ (let ((namespaced-vars (seq-mapcat #'cider-cheatsheet--expand-vars
+ (seq-remove (lambda (list)
+ (eq (car list) :url))
+ var-list))))
+ (cider-doc-lookup (completing-read "Select var: " namespaced-vars))))
+
+;;;###autoload
+(defun cider-cheatsheet ()
+ "Navigate `cider-cheatsheet-hierarchy' with `completing-read'.
+
+When you make it to a Clojure var its doc buffer gets displayed."
+ (interactive)
+ (let ((section nil)
+ (cheatsheet-data cider-cheatsheet-hierarchy))
+ (while (stringp (caar cheatsheet-data))
+ (let* ((sections (seq-filter #'stringp (mapcar #'car cheatsheet-data)))
+ (sel-section (completing-read "Select cheatsheet section: " sections))
+ (section-data (seq-find (lambda (elem) (equal (car elem) sel-section)) cheatsheet-data)))
+ (setq section sel-section)
+ (setq cheatsheet-data (cdr section-data))))
+ (cider-cheatsheet--select-var cheatsheet-data)))
+
(provide 'cider-cheatsheet)
;;; cider-cheatsheet.el ends here
diff --git a/cider-mode.el b/cider-mode.el
index f2e575f7..15f0381d 100644
--- a/cider-mode.el
+++ b/cider-mode.el
@@ -301,6 +301,7 @@ Configure `cider-cljs-*-repl' to change the ClojureScript REPL to use for your b
["Browse classpath" cider-classpath]
["Browse classpath entry" cider-open-classpath-entry])
("Misc"
+ ["Clojure Cheatsheet" cider-cheatsheet]
["Flush completion cache" cider-completion-flush-caches]))
"Menu for CIDER interactions.")
diff --git a/cider-repl.el b/cider-repl.el
index bc0c9d44..130896c0 100644
--- a/cider-repl.el
+++ b/cider-repl.el
@@ -1581,6 +1581,8 @@ constructs."
["Quit" cider-quit]
["Restart" cider-restart]
"--"
+ ["Clojure Cheatsheet" cider-cheatsheet]
+ "--"
["A sip of CIDER" cider-drink-a-sip]
["View manual online" cider-view-manual]
["View refcard online" cider-view-refcard]