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))

Reply via email to