jacking-nbb
Table of Contents
A cider jack in command for nbb.
Introduction
Nbb is a beatiful parasite. A node script that is an interpreter for Clojurescript. You get the upsides of Node.js + it is Clojure.
Want to try out some npm packages?
Sure, just make a package.json
, works instant, is part of the design
principles of nbb.
You get Clojures immutable data structures, polymorphism constructs, a repl, etc.
On the tooling side, you might be surprised how far nbb gets with very little.
Scratching (in space) is very usefull and nbb is a natural fit for a quick cljs repl.
Update 2:
You can jack in Nbb
nowadays with
cider-jack-in-cljs
then select nbb
.
Alternatively, if you have cider
d292d8d7eea5d3a12c138687133761a7256b1705
We can define jack in commands like so:
(defun cider-jack-in-nbb-2 ()
"Start a Cider nREPL server with the `nbb nrepl-server` command."
(interactive)
(cider-jack-in '(:jack-in-cmd "nbb nrepl-server")))
You can also set a project jack-in-cmd in .dir-locals
by setting
cider-jack-in-cmd
locally.
((nil
(cider-jack-in-cmd . "nbb nrepl-server")))
This is especially useful, if you have an nbb project. You can now
call cider-jack-in-clj
without the need to select anything further anymore.
Note: Commands and elisp below are workarounds we do not need anymore because Cider supports Nbb much better since recently!
Update:
This is no longer needed with cider 1.6. There is a dedicated nbb cider build tool now. I still also think my proposal here would be useful.
;; the equivalent of the proposed change
(advice-add
'cider--update-jack-in-cmd
:before-until
(defun cider-dont-update-jack-in-cmd-when-given (params)
(when (plist-get params :jack-in-cmd) params)))
;; now a nbb jack in command becomes:
(cider-jack-in '(:jack-in-cmd "nbb nrepl-server"))
Jack-in command
cider repl workaround
We currently need this workaround for sci-based cljs repls for cider:
(cider-register-cljs-repl-type 'nbb-or-scittle-or-joyride "(+ 1 2 3)")
(defun mm/cider-connected-hook ()
(when (eq 'nbb-or-scittle-or-joyride cider-cljs-repl-type)
(setq-local cider-show-error-buffer nil)
(cider-set-repl-type 'cljs)))
(add-hook 'cider-connected-hook #'mm/cider-connected-hook)
Note: You do not need this workaround in recent versions of cider anymore.
the command
Unfortunately, cider does not have the concept of a nbb repl currently.
I think cider-jack-in-resolve-command
and similar functions could be
thrown out and replaced with data.
So I went 1 level deeper to bypass ciders auto-detection of project type (+ jack in cmd):
(defun mm/cider-jack-in-nbb ()
"Start a nbb nrepl process and connect."
(interactive)
(let* ((cider-allow-jack-in-without-project t)
(orig-buffer (current-buffer))
(params '(:jack-in-cmd "nbb nrepl-server :port 0"
:cljs-repl-type nbb-or-scittle-or-joyride))
(params (cider--update-project-dir
params)))
(nrepl-start-server-process
(plist-get params :project-dir)
(plist-get params :jack-in-cmd)
(lambda (server-buffer)
(with-current-buffer
orig-buffer
(cider-connect-sibling-cljs
params
server-buffer))))))
This is what I wanted to say:
(defun mm/cider-jack-in-nbb ()
"Start an nbb nrepl process and connect."
(interactive)
(cider-jack-in-cljs
'(:jack-in-cmd "nbb nrepl-server :port 0"
:cljs-repl-type nbb-or-scittle-or-joyride)))
hack for the remaining issue
With this, you should get an error "ClojureScript is not available…".
Until there is a fix in cider, you can hack it by redefining cider-verify-clojurescript-is-present
:
;;; FIXME: https://github.com/clojure-emacs/cider/issues/3255
(defun cider-verify-clojurescript-is-present ()
"Check whether ClojureScript is present."
(unless (nrepl-dict-get (cider-sync-tooling-eval "cljs.core/inc") "value")
(user-error "ClojureScript is not available. See https://docs.cider.mx/cider/basics/clojurescript for details")))
Results
Hehe, insta nbb repl. Works good.