diff options
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | cider-cheatsheet.el | 41 | ||||
-rw-r--r-- | cider-mode.el | 1 | ||||
-rw-r--r-- | cider-repl.el | 2 |
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] |