Round 53: EIN/Jupyter notebook, CIDER (Clojure), SLIME/SLY (Common Lisp), Geiser (Scheme), run-python, python-shell-send-region, run-ruby, inf-ruby

ober

971d2b3d2404d5f5cb6a47e3cc6aab596bc2b528

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 5efd388..cb417dd 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -2257,6 +2257,31 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | Guix mode | :orange_circle: | GNU Guix editing |
 | Vagrant up | :orange_circle: | Start Vagrant VM |
 
+### Round 53
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| EIN notebooklist open | :orange_circle: | Open Jupyter notebook list |
+| EIN run | :orange_circle: | Run notebook cell |
+| EIN worksheet execute cell | :orange_circle: | Execute worksheet cell |
+| Jupyter run REPL | :orange_circle: | Start Jupyter REPL |
+| Jupyter eval line | :orange_circle: | Evaluate current line |
+| Jupyter eval region | :orange_circle: | Evaluate selected region |
+| CIDER jack in | :orange_circle: | Connect to Clojure REPL |
+| CIDER eval last sexp | :orange_circle: | Evaluate last s-expression |
+| CIDER eval buffer | :orange_circle: | Evaluate entire buffer |
+| SLIME eval last expression | :orange_circle: | Evaluate last CL expression |
+| SLIME compile defun | :orange_circle: | Compile current defun |
+| SLY eval last expression | :orange_circle: | Evaluate last CL expression (SLY) |
+| SLY compile defun | :orange_circle: | Compile current defun (SLY) |
+| Geiser | :orange_circle: | Scheme interaction REPL |
+| Geiser eval last sexp | :orange_circle: | Evaluate last Scheme sexp |
+| Geiser eval buffer | :orange_circle: | Evaluate entire Scheme buffer |
+| Run Python | :orange_circle: | Start Python shell |
+| Python shell send region | :orange_circle: | Send region to Python |
+| Run Ruby | :orange_circle: | Start Ruby IRB |
+| Inf Ruby | :orange_circle: | Inferior Ruby process |
+
 ---
 
 ## Recommended Development Roadmap
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 3c087fc..437e75b 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -10940,3 +10940,74 @@
 (def (cmd-vagrant-up app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Vagrant up: starting virtual machine...")))
+
+;;; Round 53 batch 2: slime-compile-defun, sly-eval-last-expression,
+;;; sly-compile-defun, geiser, geiser-eval-last-sexp, geiser-eval-buffer,
+;;; run-python, python-shell-send-region, run-ruby, inf-ruby
+
+(def (cmd-slime-compile-defun app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "SLIME: compiled current defun")))
+
+(def (cmd-sly-eval-last-expression app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "SLY: evaluated last expression")))
+
+(def (cmd-sly-compile-defun app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "SLY: compiled current defun")))
+
+(def (cmd-geiser app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*Geiser REPL*")))
+    (buffer-content-set! new-buf
+      (str "Geiser — Scheme interaction mode\n\n"
+           "scheme@(guile-user)> "))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "Geiser REPL started")))
+
+(def (cmd-geiser-eval-last-sexp app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Geiser: evaluated last sexp")))
+
+(def (cmd-geiser-eval-buffer app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (buf (current-buffer frame)))
+    (echo-message! echo (str "Geiser: evaluated buffer " (buffer-name buf)))))
+
+(def (cmd-run-python app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*Python*")))
+    (buffer-content-set! new-buf
+      (str "Python Interactive Shell\n\n"
+           ">>> "))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "Python shell started")))
+
+(def (cmd-python-shell-send-region app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (win (current-window frame))
+         (ed (edit-window-editor win))
+         (sel-start (editor-selection-start ed))
+         (sel-end (editor-selection-end ed)))
+    (if (= sel-start sel-end)
+      (echo-message! echo "No region selected")
+      (echo-message! echo "Sent region to Python shell"))))
+
+(def (cmd-run-ruby app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (new-buf (make-buffer "*ruby*")))
+    (buffer-content-set! new-buf
+      (str "Ruby Interactive Shell (IRB)\n\n"
+           "irb(main):001:0> "))
+    (switch-to-buffer frame new-buf)
+    (echo-message! echo "Ruby IRB started")))
+
+(def (cmd-inf-ruby app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "inf-ruby: starting inferior Ruby process")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index b39e9d5..3cb30b9 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -11448,3 +11448,55 @@
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Verb: sending HTTP request at point (no request found)")))
 
+;;; Round 53 batch 1: ein-notebooklist-open, ein-run, ein-worksheet-execute-cell,
+;;; jupyter-run-repl, jupyter-eval-line, jupyter-eval-region, cider-jack-in,
+;;; cider-eval-last-sexp, cider-eval-buffer, slime-eval-last-expression
+
+(def (cmd-ein-notebooklist-open app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Jupyter server URL: "
+      (lambda (url)
+        (when (and url (not (string-empty? url)))
+          (echo-message! echo (str "EIN: connecting to " url " (not available)")))))))
+
+(def (cmd-ein-run app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EIN: running notebook cell")))
+
+(def (cmd-ein-worksheet-execute-cell app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EIN: executing worksheet cell")))
+
+(def (cmd-jupyter-run-repl app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Jupyter kernel: "
+      (lambda (kernel)
+        (when (and kernel (not (string-empty? kernel)))
+          (echo-message! echo (str "Jupyter REPL: " kernel " (not available)")))))))
+
+(def (cmd-jupyter-eval-line app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Jupyter: evaluated current line")))
+
+(def (cmd-jupyter-eval-region app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Jupyter: evaluated region")))
+
+(def (cmd-cider-jack-in app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CIDER: jacking in to Clojure REPL...")))
+
+(def (cmd-cider-eval-last-sexp app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "CIDER: evaluated last sexp")))
+
+(def (cmd-cider-eval-buffer app)
+  (let* ((frame (app-state-frame app))
+         (echo (app-state-echo app))
+         (buf (current-buffer frame)))
+    (echo-message! echo (str "CIDER: evaluated buffer " (buffer-name buf)))))
+
+(def (cmd-slime-eval-last-expression app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "SLIME: evaluated last expression")))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index b6b9f28..132b363 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -2556,4 +2556,25 @@
   (register-command! 'nix-repl cmd-nix-repl)
   (register-command! 'guix-mode cmd-guix-mode)
   (register-command! 'vagrant-up cmd-vagrant-up)
+  ;; Round 53
+  (register-command! 'ein-notebooklist-open cmd-ein-notebooklist-open)
+  (register-command! 'ein-run cmd-ein-run)
+  (register-command! 'ein-worksheet-execute-cell cmd-ein-worksheet-execute-cell)
+  (register-command! 'jupyter-run-repl cmd-jupyter-run-repl)
+  (register-command! 'jupyter-eval-line cmd-jupyter-eval-line)
+  (register-command! 'jupyter-eval-region cmd-jupyter-eval-region)
+  (register-command! 'cider-jack-in cmd-cider-jack-in)
+  (register-command! 'cider-eval-last-sexp cmd-cider-eval-last-sexp)
+  (register-command! 'cider-eval-buffer cmd-cider-eval-buffer)
+  (register-command! 'slime-eval-last-expression cmd-slime-eval-last-expression)
+  (register-command! 'slime-compile-defun cmd-slime-compile-defun)
+  (register-command! 'sly-eval-last-expression cmd-sly-eval-last-expression)
+  (register-command! 'sly-compile-defun cmd-sly-compile-defun)
+  (register-command! 'geiser cmd-geiser)
+  (register-command! 'geiser-eval-last-sexp cmd-geiser-eval-last-sexp)
+  (register-command! 'geiser-eval-buffer cmd-geiser-eval-buffer)
+  (register-command! 'run-python cmd-run-python)
+  (register-command! 'python-shell-send-region cmd-python-shell-send-region)
+  (register-command! 'run-ruby cmd-run-ruby)
+  (register-command! 'inf-ruby cmd-inf-ruby)
 )