portal 2024-11-25

Hi emacs users, how to send cider-eval-last-sexp result to portal?

I send all evaluations to portal automatically, https://practical.li/clojure/data-inspector/portal/#editor-nrepl-middleware., for example:

:repl/inspect
{:extra-deps
 {nrepl/nrepl          {:mvn/version "1.0.0"}
  cider/cider-nrepl    {:mvn/version "0.30.0"}
  djblue/portal        {:mvn/version "0.40.0"}
  clj-commons/clj-yaml {:mvn/version "0.7.0"}}
 :main-opts ["-m" "nrepl.cmdline"
             "--middleware"
             "[cider.nrepl/cider-middleware,portal.nrepl/wrap-portal]"]}

🎉 1

I have the following in a .dir-locals.el that I stow into my work project

((nil . ((eval . (progn
                   (make-variable-buffer-local 'cider-jack-in-nrepl-middlewares)
                   (add-to-list 'cider-jack-in-nrepl-middlewares "portal.nrepl/wrap-portal")

                   ... other middlewares like shadow.cljs and flowstorm
                   ))
         )))
and use the following helpers to manage the portal lifecycle during a cider jack-in session
(defun portal.api/open ()
  (interactive)
  (cider-nrepl-sync-request:eval
   "(do (ns dev) (def portal ((requiring-resolve 'portal.api/open) {:theme :portal.colors/material-ui})) (add-tap (requiring-resolve 'portal.api/submit)))"))

(defun portal.api/clear ()
  (interactive)
  (cider-nrepl-sync-request:eval "(portal.api/clear)"))

(defun portal.api/close ()
  (interactive)
  (cider-nrepl-sync-request:eval "(portal.api/close)"))

💯 1
🙏 1