branch: elpa/inf-clojure
commit d0e48eb4a057d0dbce7806b25d7a3b2b064379ea
Author: Bozhidar Batsov <[email protected]>
Commit: Bozhidar Batsov <[email protected]>
[Fix #57] Add inf-clojure-show-var-meta command
Display a var's metadata in the REPL via C-c C-S-m.
Adds a var-meta feature form for all REPL types.
---
CHANGELOG.md | 4 ++++
inf-clojure.el | 28 ++++++++++++++++++++++++----
test/inf-clojure-tests.el | 6 ++++--
3 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 43b6018f48..c0da7862d9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,10 @@
## master (unreleased)
+### New features
+
+- [#57](https://github.com/clojure-emacs/inf-clojure/issues/57): Add
`inf-clojure-show-var-meta` command (`C-c C-S-m`) to display a var's metadata.
+
### Changes
- Unify `reload` and `reload-all` forms with `inf-clojure-repl-features`,
enabling per-REPL-type dispatch. The standalone `inf-clojure-reload-form` and
`inf-clojure-reload-all-form` defcustoms have been removed.
diff --git a/inf-clojure.el b/inf-clojure.el
index 5722311416..1fb83bec6d 100644
--- a/inf-clojure.el
+++ b/inf-clojure.el
@@ -102,7 +102,8 @@ Keys in OVERRIDES take precedence over those in BASE."
(macroexpand . "(clojure.core/macroexpand '%s)")
(macroexpand-1 . "(clojure.core/macroexpand-1 '%s)")
(reload . "(require '%s :reload)")
- (reload-all . "(require '%s :reload-all)"))
+ (reload-all . "(require '%s :reload-all)")
+ (var-meta . "(clojure.core/meta (clojure.core/resolve '%s))"))
"Base feature forms shared by Clojure-family REPLs.
Individual REPL types override specific entries (e.g. `arglists')
via `inf-clojure--merge-repl-features'.")
@@ -117,7 +118,8 @@ via `inf-clojure--merge-repl-features'.")
(macroexpand . "(cljs.core/macroexpand '%s)")
(macroexpand-1 . "(cljs.core/macroexpand-1 '%s)")
(reload . "(require '%s :reload)")
- (reload-all . "(require '%s :reload-all)")))
+ (reload-all . "(require '%s :reload-all)")
+ (var-meta . "(cljs.core/meta (cljs.core/resolve '%s))")))
(planck . ((load . "(load-file \"%s\")")
(doc . "(planck.repl/doc %s)")
(source . "(planck.repl/source %s)")
@@ -129,7 +131,8 @@ via `inf-clojure--merge-repl-features'.")
(macroexpand-1 . "(macroexpand-1 '%s)")
(completion . "(seq (js->clj (#'planck.repl/get-completions
\"%s\")))")
(reload . "(require '%s :reload)")
- (reload-all . "(require '%s :reload-all)")))
+ (reload-all . "(require '%s :reload-all)")
+ (var-meta . "(cljs.core/meta (cljs.core/resolve '%s))")))
(joker . ((load . "(load-file \"%s\")")
(doc . "(joker.repl/doc %s)")
(arglists .
@@ -143,7 +146,8 @@ via `inf-clojure--merge-repl-features'.")
(macroexpand . "(macroexpand '%s)")
(macroexpand-1 . "(macroexpand-1 '%s)")
(reload . "(require '%s :reload)")
- (reload-all . "(require '%s :reload-all)")))
+ (reload-all . "(require '%s :reload-all)")
+ (var-meta . "(joker.core/meta (joker.core/resolve '%s))")))
(babashka . ,(copy-alist inf-clojure--clojure-repl-base-features))
(node-babashka . ,(copy-alist inf-clojure--clojure-repl-base-features))
(clojure . ,(copy-alist inf-clojure--clojure-repl-base-features))
@@ -342,6 +346,7 @@ Either \"no process\" or \"buffer-name(repl-type)\""
(define-key map (kbd "C-c C-a") #'inf-clojure-show-arglists)
(define-key map (kbd "C-c C-v") #'inf-clojure-show-var-documentation)
(define-key map (kbd "C-c C-s") #'inf-clojure-show-var-source)
+ (define-key map (kbd "C-c C-S-m") #'inf-clojure-show-var-meta)
(define-key map (kbd "C-c C-S-a") #'inf-clojure-apropos)
(define-key map (kbd "C-c M-o") #'inf-clojure-clear-repl-buffer)
(define-key map (kbd "C-c C-q") #'inf-clojure-quit)
@@ -356,6 +361,7 @@ Either \"no process\" or \"buffer-name(repl-type)\""
["Show arglists" inf-clojure-show-arglists t]
["Show documentation for var" inf-clojure-show-var-documentation t]
["Show source for var" inf-clojure-show-var-source t]
+ ["Show metadata for var" inf-clojure-show-var-meta t]
["Apropos" inf-clojure-apropos t]
"--"
["Clear REPL" inf-clojure-clear-repl-buffer]
@@ -392,6 +398,7 @@ Either \"no process\" or \"buffer-name(repl-type)\""
(define-key map (kbd "C-c C-a") #'inf-clojure-show-arglists)
(define-key map (kbd "C-c C-v") #'inf-clojure-show-var-documentation)
(define-key map (kbd "C-c C-s") #'inf-clojure-show-var-source)
+ (define-key map (kbd "C-c C-S-m") #'inf-clojure-show-var-meta)
(define-key map (kbd "C-c M-n") #'inf-clojure-set-ns)
(define-key map (kbd "C-c C-q") #'inf-clojure-quit)
(define-key map (kbd "C-c M-c") #'inf-clojure-connect)
@@ -412,6 +419,7 @@ Either \"no process\" or \"buffer-name(repl-type)\""
["Show arglists" inf-clojure-show-arglists t]
["Show documentation for var" inf-clojure-show-var-documentation t]
["Show source for var" inf-clojure-show-var-source t]
+ ["Show metadata for var" inf-clojure-show-var-meta t]
["Show vars in ns" inf-clojure-show-ns-vars t]
["Apropos" inf-clojure-apropos t]
["Macroexpand" inf-clojure-macroexpand t]
@@ -1174,6 +1182,18 @@ prefix argument PROMPT-FOR-SYMBOL, it prompts for a
symbol name."
(source-form (inf-clojure-get-feature proc 'source)))
(inf-clojure--send-string proc (format source-form var))))
+(defun inf-clojure-show-var-meta (prompt-for-symbol)
+ "Send a command to the inferior Clojure to give metadata for VAR.
+When invoked with a prefix argument PROMPT-FOR-SYMBOL, it prompts
+for a symbol name."
+ (interactive "P")
+ (let* ((proc (inf-clojure-proc))
+ (var (if prompt-for-symbol
+ (car (inf-clojure-symprompt "Var meta"
(inf-clojure-symbol-at-point)))
+ (inf-clojure-symbol-at-point)))
+ (meta-form (inf-clojure-get-feature proc 'var-meta)))
+ (inf-clojure--send-string proc (format meta-form var))))
+
;;;; Response parsing
;;;; ================
diff --git a/test/inf-clojure-tests.el b/test/inf-clojure-tests.el
index c4cd495e4e..796a08bd0e 100644
--- a/test/inf-clojure-tests.el
+++ b/test/inf-clojure-tests.el
@@ -173,7 +173,7 @@ is a string\")
(it "provides all base features for clojure-family REPL types"
(let ((base-features '(load doc source apropos ns-vars set-ns
macroexpand macroexpand-1 arglists
- reload reload-all)))
+ reload reload-all var-meta)))
(dolist (repl-type '(clojure clojure-clr babashka node-babashka
lein-clr))
(dolist (feature base-features)
(expect (inf-clojure--get-feature repl-type feature nil)
@@ -186,11 +186,13 @@ is a string\")
(let ((clj-arglists (inf-clojure--get-feature 'clojure 'arglists nil))
(bb-arglists (inf-clojure--get-feature 'babashka 'arglists nil)))
(expect clj-arglists :to-equal bb-arglists)))
- (it "provides reload and reload-all for all REPL types"
+ (it "provides reload, reload-all and var-meta for all REPL types"
(dolist (repl-type '(clojure clojure-clr babashka node-babashka lein-clr
cljs planck joker))
(expect (inf-clojure--get-feature repl-type 'reload nil)
:not :to-be nil)
(expect (inf-clojure--get-feature repl-type 'reload-all nil)
+ :not :to-be nil)
+ (expect (inf-clojure--get-feature repl-type 'var-meta nil)
:not :to-be nil)))
(it "uses a different arglists catch clause for CLR REPL types"
(let ((clj-arglists (inf-clojure--get-feature 'clojure 'arglists nil))