Round 48: treemacs-select/toggle/add/remove/rename/collapse/refresh/create/delete, neotree-toggle/show/hide/refresh/change-root, centaur-tabs-mode/forward/backward/group

ober

242b44d4bb388577addc7f7fcd34f880e3a88234

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index fd81bd1..4300b9c 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -2132,6 +2132,31 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | Flycheck select checker | :orange_circle: | Select syntax checker |
 | Flycheck describe checker | :orange_circle: | Describe checker details |
 
+### Round 48
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Treemacs select window | :orange_circle: | Select treemacs window |
+| Treemacs toggle | :orange_circle: | Toggle tree view |
+| Treemacs add project | :orange_circle: | Add project to workspace |
+| Treemacs remove project | :orange_circle: | Remove project from workspace |
+| Treemacs rename project | :orange_circle: | Rename project |
+| Treemacs collapse all | :orange_circle: | Collapse all tree nodes |
+| Treemacs refresh | :orange_circle: | Refresh tree view |
+| Treemacs create dir | :orange_circle: | Create directory |
+| Treemacs create file | :orange_circle: | Create file |
+| Treemacs delete | :orange_circle: | Delete item at point |
+| NeoTree toggle | :orange_circle: | Toggle NeoTree |
+| NeoTree show | :orange_circle: | Show NeoTree |
+| NeoTree hide | :orange_circle: | Hide NeoTree |
+| NeoTree refresh | :orange_circle: | Refresh NeoTree |
+| NeoTree change root | :orange_circle: | Change NeoTree root |
+| Centaur tabs mode | :orange_circle: | Toggle centaur tabs |
+| Centaur tabs forward | :orange_circle: | Next tab |
+| Centaur tabs backward | :orange_circle: | Previous tab |
+| Centaur tabs forward group | :orange_circle: | Next tab group |
+| Centaur tabs backward group | :orange_circle: | Previous tab group |
+
 ---
 
 ## Recommended Development Roadmap
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 2e9d5ab..3138778 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -10585,3 +10585,57 @@
                    "Status: not available"))
             (switch-to-buffer frame new-buf)
             (echo-message! echo (str "Described: " checker))))))))
+
+;;; Round 48 batch 2: neotree-toggle, neotree-show, neotree-hide,
+;;; neotree-refresh, neotree-change-root, centaur-tabs-mode,
+;;; centaur-tabs-forward, centaur-tabs-backward,
+;;; centaur-tabs-forward-group, centaur-tabs-backward-group
+
+(def (cmd-neotree-toggle app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app "neotree-visible")
+    (if (mode-enabled? app "neotree-visible")
+      (echo-message! echo "NeoTree: shown")
+      (echo-message! echo "NeoTree: hidden"))))
+
+(def (cmd-neotree-show app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "NeoTree: shown")))
+
+(def (cmd-neotree-hide app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "NeoTree: hidden")))
+
+(def (cmd-neotree-refresh app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "NeoTree: refreshed")))
+
+(def (cmd-neotree-change-root app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "New root directory: "
+      (lambda (dir)
+        (when (and dir (not (string-empty? dir)))
+          (echo-message! echo (str "NeoTree: root changed to " dir)))))))
+
+(def (cmd-centaur-tabs-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app "centaur-tabs")
+    (if (mode-enabled? app "centaur-tabs")
+      (echo-message! echo "Centaur tabs enabled")
+      (echo-message! echo "Centaur tabs disabled"))))
+
+(def (cmd-centaur-tabs-forward app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Next tab")))
+
+(def (cmd-centaur-tabs-backward app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Previous tab")))
+
+(def (cmd-centaur-tabs-forward-group app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Next tab group")))
+
+(def (cmd-centaur-tabs-backward-group app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Previous tab group")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 6d004e0..539bf45 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -11143,3 +11143,63 @@
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "DAP: disconnected from debug session")))
 
+;;; Round 48 batch 1: treemacs-select-window, treemacs-toggle,
+;;; treemacs-add-project, treemacs-remove-project, treemacs-rename-project,
+;;; treemacs-collapse-all, treemacs-refresh, treemacs-create-dir,
+;;; treemacs-create-file, treemacs-delete
+
+(def (cmd-treemacs-select-window app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Treemacs: select tree window")))
+
+(def (cmd-treemacs-toggle app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app "treemacs")
+    (if (mode-enabled? app "treemacs")
+      (echo-message! echo "Treemacs: shown")
+      (echo-message! echo "Treemacs: hidden"))))
+
+(def (cmd-treemacs-add-project app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Add project directory: "
+      (lambda (dir)
+        (when (and dir (not (string-empty? dir)))
+          (echo-message! echo (str "Treemacs: added project " dir)))))))
+
+(def (cmd-treemacs-remove-project app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Treemacs: project removed")))
+
+(def (cmd-treemacs-rename-project app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Rename project to: "
+      (lambda (name)
+        (when (and name (not (string-empty? name)))
+          (echo-message! echo (str "Treemacs: renamed to " name)))))))
+
+(def (cmd-treemacs-collapse-all app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Treemacs: all nodes collapsed")))
+
+(def (cmd-treemacs-refresh app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Treemacs: refreshed")))
+
+(def (cmd-treemacs-create-dir app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "New directory name: "
+      (lambda (name)
+        (when (and name (not (string-empty? name)))
+          (echo-message! echo (str "Treemacs: created directory " name)))))))
+
+(def (cmd-treemacs-create-file app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "New file name: "
+      (lambda (name)
+        (when (and name (not (string-empty? name)))
+          (echo-message! echo (str "Treemacs: created file " name)))))))
+
+(def (cmd-treemacs-delete app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Treemacs: delete item at point")))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 966ad80..ce4fe6b 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -2451,4 +2451,25 @@
   (register-command! 'flycheck-verify-setup cmd-flycheck-verify-setup)
   (register-command! 'flycheck-select-checker cmd-flycheck-select-checker)
   (register-command! 'flycheck-describe-checker cmd-flycheck-describe-checker)
+  ;; Round 48
+  (register-command! 'treemacs-select-window cmd-treemacs-select-window)
+  (register-command! 'treemacs-toggle cmd-treemacs-toggle)
+  (register-command! 'treemacs-add-project cmd-treemacs-add-project)
+  (register-command! 'treemacs-remove-project cmd-treemacs-remove-project)
+  (register-command! 'treemacs-rename-project cmd-treemacs-rename-project)
+  (register-command! 'treemacs-collapse-all cmd-treemacs-collapse-all)
+  (register-command! 'treemacs-refresh cmd-treemacs-refresh)
+  (register-command! 'treemacs-create-dir cmd-treemacs-create-dir)
+  (register-command! 'treemacs-create-file cmd-treemacs-create-file)
+  (register-command! 'treemacs-delete cmd-treemacs-delete)
+  (register-command! 'neotree-toggle cmd-neotree-toggle)
+  (register-command! 'neotree-show cmd-neotree-show)
+  (register-command! 'neotree-hide cmd-neotree-hide)
+  (register-command! 'neotree-refresh cmd-neotree-refresh)
+  (register-command! 'neotree-change-root cmd-neotree-change-root)
+  (register-command! 'centaur-tabs-mode cmd-centaur-tabs-mode)
+  (register-command! 'centaur-tabs-forward cmd-centaur-tabs-forward)
+  (register-command! 'centaur-tabs-backward cmd-centaur-tabs-backward)
+  (register-command! 'centaur-tabs-forward-group cmd-centaur-tabs-forward-group)
+  (register-command! 'centaur-tabs-backward-group cmd-centaur-tabs-backward-group)
 )