[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/cider 24b9891e0b 1/2: Allow connecting to nbb via connect-
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/cider 24b9891e0b 1/2: Allow connecting to nbb via connect-clj (#3061) (#3272) |
Date: |
Sat, 3 Dec 2022 06:58:30 -0500 (EST) |
branch: elpa/cider
commit 24b9891e0b4603dca7519427d02ff4af2cfac57a
Author: Benjamin <38900087+benjamin-asdf@users.noreply.github.com>
Commit: GitHub <noreply@github.com>
Allow connecting to nbb via connect-clj (#3061) (#3272)
This is for nbb, scittle, joyride.
Better support for "pain" repls, support "cljs" without setup.
We want to:
1. connect with a plain nREPL client
2. make any assumptions explicit about the nREPL server/runtime
3. connect cljs buffers with those plain repls
1. Check for cider middleware being present, before using it
(already being done)
2. Check for cider-library-present-p, before relying on anything in
the runtime.
3. Make assumptions about the runtime explicit
My suggestion is to solve these problems is `cider-connection-capabilities`.
Currently, there was an implicit assumption about the compilation
error format.
Changes to `cider-repls`:
Now returns cljs, if the repl capabilities include 'cljs.
This way we can make a "plain" clj client, upgrade on connect with
cljs capability and have it be connected in cljs buffers.
This is more a concession / workaround the current repl-type setup.
Here's the slack discussion that lead to this PR:
https://clojurians.slack.com/archives/C04CAKAGADU
---
CHANGELOG.md | 2 ++
cider-connection.el | 34 +++++++++++++++++++++-
cider-eval.el | 19 +++++++++---
cider-overlays.el | 1 +
cider-repl.el | 3 +-
cider.el | 6 +++-
doc/modules/ROOT/nav.adoc | 1 +
.../ROOT/pages/platforms/scittle_and_friends.adoc | 29 ++++++++++++++++++
test/cider-connection-tests.el | 20 +++++++++++++
9 files changed, 108 insertions(+), 7 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4792e29ff8..a0cad9b5d8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,6 +17,8 @@
- [#3251](https://github.com/clojure-emacs/cider/pull/3251): Disable undo in
`*cider-stacktrace*` buffers.
- Consecutive overlays will not be spuriously deleted.
- [#3260](https://github.com/clojure-emacs/cider/pull/3260): Scroll REPL
buffer in other frame.
+- [#3061](https://github.com/clojure-emacs/cider/issues/3061): Allow
+ connect-clj for plain cljs repls (nbb etc).
## 1.5.0 (2022-08-24)
diff --git a/cider-connection.el b/cider-connection.el
index dace071292..ab71b34801 100644
--- a/cider-connection.el
+++ b/cider-connection.el
@@ -343,6 +343,19 @@ buffer."
(when cider-auto-mode
(cider-enable-on-existing-clojure-buffers))
+ (setf cider-connection-capabilities
+ (append
+ (pcase (cider-runtime)
+ ('clojure '(clojure jvm-compilation-errors))
+ ('babashka '(babashka jvm-compilation-errors))
+ (_ '()))
+ (when
+ ;; see `cider-sync-tooling-eval', but it is defined on a
higher layer
+ (nrepl-dict-get
+ (nrepl-sync-request:eval "cljs.core/demunge"
(current-buffer) nil 'tooling)
+ "value")
+ '(cljs))))
+
(run-hooks 'cider-connected-hook)))))
(defun cider--disconnected-handler ()
@@ -437,6 +450,19 @@ about this buffer (like variable `cider-repl-type')."
(plist-get nrepl-endpoint :host)
(plist-get nrepl-endpoint :port))))))
+(defvar-local cider-connection-capabilities '()
+ "A list of some of the capabilites of this connection buffer.
+Aka what assumptions we make about the runtime.
+This is more general than
+`cider-nrepl-op-supported-p' and `cider-library-present-p'.
+But does not need to replace them.")
+
+(defun cider-connection-has-capability-p (capability :optional
connection-buffer)
+ "Return non nil when the cider connection has CAPABILITY.
+By default it assumes the connection buffer is current."
+ (with-current-buffer (or connection-buffer (current-buffer))
+ (member capability cider-connection-capabilities)))
+
;;; Connection Management Commands
@@ -885,7 +911,13 @@ no linked session or there is no REPL of TYPE within the
current session."
(cond ((null buffer-repl-type) nil)
((or (null type) (eq type 'multi) (eq type 'any)) t)
((listp type) (member buffer-repl-type type))
- (t (string= type buffer-repl-type)))))
+ (t
+ (or (string= type buffer-repl-type)
+ (let ((capabilities
+ (buffer-local-value 'cider-connection-capabilities
buffer)))
+ (cond ((listp type)
+ (cl-some (lambda (it) (member it capabilities)) type))
+ (t (member type capabilities)))))))))
(defun cider--get-host-from-session (session)
"Returns the host associated with SESSION."
diff --git a/cider-eval.el b/cider-eval.el
index 6e1fd4440e..da20f78ad9 100644
--- a/cider-eval.el
+++ b/cider-eval.el
@@ -462,6 +462,13 @@ Uses the value of the `out' slot in RESPONSE."
(cider-nrepl-sync-request:eval
"(clojure.stacktrace/print-cause-trace *e)")))
+(defun cider-default-err-eval-print-handler ()
+ "Display the last exception without middleware support.
+When clojure.stracktrace is not present."
+ (cider--handle-err-eval-response
+ (cider-nrepl-sync-request:eval
+ "(println (ex-data *e))")))
+
(defun cider--render-stacktrace-causes (causes &optional error-types)
"If CAUSES is non-nil, render its contents into a new error buffer.
Optional argument ERROR-TYPES contains a list which should determine the
@@ -498,9 +505,10 @@ into a new error buffer."
(defun cider-default-err-handler ()
"This function determines how the error buffer is shown.
It delegates the actual error content to the eval or op handler."
- (if (cider-nrepl-op-supported-p "stacktrace")
- (cider-default-err-op-handler)
- (cider-default-err-eval-handler)))
+ (cond ((cider-nrepl-op-supported-p "stacktrace")
(cider-default-err-op-handler))
+ ((cider-library-present-p "clojure.stacktrace")
(cider-default-err-eval-handler))
+ (t (cider-default-err-eval-print-handler))))
+
;; The format of the error messages emitted by Clojure's compiler changed in
;; Clojure 1.10. That's why we're trying to match error messages to both the
@@ -739,7 +747,10 @@ when `cider-auto-inspect-after-eval' is non-nil."
(cider-emit-interactive-eval-output out))
(lambda (_buffer err)
(cider-emit-interactive-eval-err-output err)
- (unless cider-show-error-buffer
+
+ (when (or (not cider-show-error-buffer)
+ (not
(cider-connection-has-capability-p 'jvm-compilation-errors)))
+
;; Display errors as temporary overlays
(let ((cider-result-use-clojure-font-lock
nil))
(cider--display-interactive-eval-result
diff --git a/cider-overlays.el b/cider-overlays.el
index 3c56e8060f..614388a07f 100644
--- a/cider-overlays.el
+++ b/cider-overlays.el
@@ -303,6 +303,7 @@ focused."
(let* ((font-value (if cider-result-use-clojure-font-lock
(cider-font-lock-as-clojure value)
value))
+ (font-value (string-trim-right font-value))
(used-overlay (when (and point cider-use-overlays)
(cider--make-result-overlay font-value
:where point
diff --git a/cider-repl.el b/cider-repl.el
index eff5f99bae..80f47ec046 100644
--- a/cider-repl.el
+++ b/cider-repl.el
@@ -153,7 +153,8 @@ you'd like to use the default Emacs behavior use
(make-obsolete-variable 'cider-repl-print-level 'cider-print-options "0.21")
(defvar cider-repl-require-repl-utils-code
- '((clj . "(clojure.core/apply clojure.core/require
clojure.main/repl-requires)")
+ '((clj . "(when-let [requires (resolve 'clojure.main/repl-requires)]
+ (clojure.core/apply clojure.core/require @requires))")
(cljs . "(require '[cljs.repl :refer [apropos dir doc find-doc print-doc
pst source]])")))
(defcustom cider-repl-init-code (list (cdr (assoc 'clj
cider-repl-require-repl-utils-code)))
diff --git a/cider.el b/cider.el
index b79c89a0ad..0bf5972918 100644
--- a/cider.el
+++ b/cider.el
@@ -778,9 +778,13 @@ Generally you should not disable this unless you run into
some faulty check."
:safe #'booleanp
:package-version '(cider . "0.17.0"))
+(defun cider-clojurescript-present-p ()
+ "Return non nil when ClojureScript is present."
+ (nrepl-dict-get (cider-sync-tooling-eval "cljs.core/demunge") "value"))
+
(defun cider-verify-clojurescript-is-present ()
"Check whether ClojureScript is present."
- (unless (cider-library-present-p "cljs.core")
+ (unless (cider-clojurescript-present-p)
(user-error "ClojureScript is not available. See
https://docs.cider.mx/cider/basics/clojurescript for details")))
(defun cider-verify-piggieback-is-present ()
diff --git a/doc/modules/ROOT/nav.adoc b/doc/modules/ROOT/nav.adoc
index fd76a3f748..599eb069a1 100644
--- a/doc/modules/ROOT/nav.adoc
+++ b/doc/modules/ROOT/nav.adoc
@@ -13,6 +13,7 @@
* Alternative Platforms
** xref:platforms/overview.adoc[Overview]
** xref:platforms/babashka.adoc[Babashka]
+** xref:platforms/scittle_and_friends.adoc[Scittle and Friends]
* Using CIDER
** xref:usage/interactive_programming.adoc[Interactive Programming]
** xref:usage/cider_mode.adoc[Using cider-mode]
diff --git a/doc/modules/ROOT/pages/platforms/scittle_and_friends.adoc
b/doc/modules/ROOT/pages/platforms/scittle_and_friends.adoc
new file mode 100644
index 0000000000..5c72c6460a
--- /dev/null
+++ b/doc/modules/ROOT/pages/platforms/scittle_and_friends.adoc
@@ -0,0 +1,29 @@
+= Scittle, Nbb, Joyride, and future plain repls
+
+The default cider (clj-repl) should be capable of connecting to any
+nrepl server that provides minimal functionality.
+
+As such, all of these work:
+https://github.com/babashka/nbb[nbb],
+https://github.com/babashka/scittle[scittle],
https://github.com/BetterThanTomorrow/joyride[joyride]
+
+First start an nrepl server (the project's Readme usually has a section
+on starting a nrepl server).
+
+You can use
+
+kbd:[M-x `cider-connect-clj` <RET>]
+
+to connect to any plain Clojure(Script) nrepl server.
+
+Features:
+
+* Eval, load file etc.
+* Errors as overlays. (The default cider error buffer is not implemented
currently).
+* Other nrepl features the server provides; This might be rather minimal.
+
+Nbb, Scittle and Joyride all have quite cool completions already.
+
+== Note
+
+For nbb you can alternatively connect via cljs, see xref:platform/nbb.adoc[Nbb]
diff --git a/test/cider-connection-tests.el b/test/cider-connection-tests.el
index 1ff79dd52c..a096d0a034 100644
--- a/test/cider-connection-tests.el
+++ b/test/cider-connection-tests.el
@@ -370,6 +370,26 @@
(expect (cider-repls) :to-equal (list a b))
(kill-buffer b)
(expect (cider-repls) :to-equal (list a))
+ (sesman-unregister 'CIDER session))))))
+
+ (describe "cljs capability"
+ (it "Upgraded clj repl counts as cljs"
+ (let ((default-directory (expand-file-name "/tmp/some-dir")))
+ (cider-test-with-buffers
+ (a b)
+ (let ((session (list "some-session" a b)))
+ (with-current-buffer a
+ (setq cider-repl-type 'clj))
+ (with-current-buffer b
+ (setq cider-repl-type 'cljs))
+ (sesman-register 'CIDER session)
+ (expect (cider-repls 'cljs) :to-equal (list b))
+
+ (with-current-buffer a
+ (setf cider-connection-capabilities
+ (append cider-connection-capabilities '(cljs))))
+
+ (expect (cider-repls) :to-equal (list a b))
(sesman-unregister 'CIDER session)))))))
(describe "cider--connection-info"