Round 159: Add 20 Magit, Git-link, Blamer, Smerge extended commands

ober

0df970b79e90ed024096a7be0be43e3ad938a235

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 5589811..0acba61 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -4583,6 +4583,31 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | ebib-import-file | :orange_circle: | Import file into Ebib |
 | ebib-push-citation | :orange_circle: | Push Ebib citation to buffer |
 
+### Round 159 — Magit, Git-link, Blamer, Smerge Extended
+
+| Feature | Status | Notes |
+|---|---|---|
+| `magit-merge` | :orange_circle: | Merge branch |
+| `magit-merge-abort` | :orange_circle: | Abort merge |
+| `magit-merge-squash` | :orange_circle: | Squash merge |
+| `git-link-commit` | :orange_circle: | Copy commit URL |
+| `git-link-homepage` | :orange_circle: | Copy repo homepage URL |
+| `git-messenger-popup-message` | :orange_circle: | Show commit message for line |
+| `git-messenger-popup-diff` | :orange_circle: | Show diff for commit |
+| `git-messenger-popup-show` | :orange_circle: | Show full commit info |
+| `blamer-mode` | :orange_circle: | Inline git blame mode |
+| `blamer-show-commit-info` | :orange_circle: | Show commit info |
+| `blamer-show-posframe-commit-info` | :orange_circle: | Show in posframe |
+| `magit-delta-mode` | :orange_circle: | Syntax highlighting in diffs |
+| `magit-todos-mode` | :orange_circle: | Show TODOs in magit |
+| `magit-todos-list` | :orange_circle: | List all TODOs |
+| `git-auto-commit-mode` | :orange_circle: | Auto-commit on save |
+| `smerge-resolve` | :orange_circle: | Resolve conflict |
+| `smerge-ediff` | :orange_circle: | Ediff for conflict |
+| `smerge-combine-with-next` | :orange_circle: | Combine with next conflict |
+| `smerge-refine` | :orange_circle: | Word-level diff |
+| `smerge-auto-leave` | :orange_circle: | Auto-leave when resolved |
+
 ### Round 158 — Jinx, Flycheck, Flymake, Langtool, Writegood
 
 | Feature | Status | Notes |
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index d7b8b69..a7f5ac7 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -16167,3 +16167,56 @@
 (def (cmd-flymake-reporting-backends app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Flymake: showing reporting backends")))
+
+;; ============================================================
+;; Round 159 — Blamer, Magit-delta, Smerge extended (batch 2)
+;; ============================================================
+
+(def (cmd-blamer-show-posframe-commit-info app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Blamer: showing commit info in posframe")))
+
+(def (cmd-magit-delta-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'magit-delta)
+    (if (mode-enabled? app 'magit-delta)
+      (echo-message! echo "Magit-delta mode enabled (syntax highlighting in diffs)")
+      (echo-message! echo "Magit-delta mode disabled"))))
+
+(def (cmd-magit-todos-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'magit-todos)
+    (if (mode-enabled? app 'magit-todos)
+      (echo-message! echo "Magit-todos mode enabled")
+      (echo-message! echo "Magit-todos mode disabled"))))
+
+(def (cmd-magit-todos-list app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Magit-todos: listing all TODOs in repository")))
+
+(def (cmd-git-auto-commit-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'git-auto-commit)
+    (if (mode-enabled? app 'git-auto-commit)
+      (echo-message! echo "Git auto-commit mode enabled")
+      (echo-message! echo "Git auto-commit mode disabled"))))
+
+(def (cmd-smerge-resolve app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Smerge: resolved conflict at point")))
+
+(def (cmd-smerge-ediff app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Smerge: opened ediff for conflict")))
+
+(def (cmd-smerge-combine-with-next app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Smerge: combined conflict with next")))
+
+(def (cmd-smerge-refine app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Smerge: refined conflict (word-level diff)")))
+
+(def (cmd-smerge-auto-leave app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Smerge: auto-leaving (no more conflicts)")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 4a9b4f6..4967357 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -16806,3 +16806,54 @@
 (def (cmd-writegood-grade-level app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Writegood: computed grade level (scaffolded)")))
+
+;; ============================================================
+;; Round 159 — Magit, Git-link, Blamer, Smerge (batch 1)
+;; ============================================================
+
+(def (cmd-magit-merge app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Merge branch: "
+      (lambda (branch)
+        (echo-message! echo (str "Magit: merging " branch))))))
+
+(def (cmd-magit-merge-abort app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Magit: merge aborted")))
+
+(def (cmd-magit-merge-squash app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Squash-merge branch: "
+      (lambda (branch)
+        (echo-message! echo (str "Magit: squash-merging " branch))))))
+
+(def (cmd-git-link-commit app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Git-link: copied commit URL to kill ring")))
+
+(def (cmd-git-link-homepage app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Git-link: copied repository homepage URL")))
+
+(def (cmd-git-messenger-popup-message app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Git-messenger: showing commit message for line")))
+
+(def (cmd-git-messenger-popup-diff app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Git-messenger: showing diff for commit")))
+
+(def (cmd-git-messenger-popup-show app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Git-messenger: showing full commit info")))
+
+(def (cmd-blamer-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'blamer)
+    (if (mode-enabled? app 'blamer)
+      (echo-message! echo "Blamer mode enabled (inline git blame)")
+      (echo-message! echo "Blamer mode disabled"))))
+
+(def (cmd-blamer-show-commit-info app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Blamer: showing commit info for current line")))
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 9665465..fbf654a 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -4772,4 +4772,25 @@
   (register-command! 'flycheck-mode-line-status-text cmd-flycheck-mode-line-status-text)
   (register-command! 'flymake-running-backends cmd-flymake-running-backends)
   (register-command! 'flymake-reporting-backends cmd-flymake-reporting-backends)
+  ;; Round 159
+  (register-command! 'magit-merge cmd-magit-merge)
+  (register-command! 'magit-merge-abort cmd-magit-merge-abort)
+  (register-command! 'magit-merge-squash cmd-magit-merge-squash)
+  (register-command! 'git-link-commit cmd-git-link-commit)
+  (register-command! 'git-link-homepage cmd-git-link-homepage)
+  (register-command! 'git-messenger-popup-message cmd-git-messenger-popup-message)
+  (register-command! 'git-messenger-popup-diff cmd-git-messenger-popup-diff)
+  (register-command! 'git-messenger-popup-show cmd-git-messenger-popup-show)
+  (register-command! 'blamer-mode cmd-blamer-mode)
+  (register-command! 'blamer-show-commit-info cmd-blamer-show-commit-info)
+  (register-command! 'blamer-show-posframe-commit-info cmd-blamer-show-posframe-commit-info)
+  (register-command! 'magit-delta-mode cmd-magit-delta-mode)
+  (register-command! 'magit-todos-mode cmd-magit-todos-mode)
+  (register-command! 'magit-todos-list cmd-magit-todos-list)
+  (register-command! 'git-auto-commit-mode cmd-git-auto-commit-mode)
+  (register-command! 'smerge-resolve cmd-smerge-resolve)
+  (register-command! 'smerge-ediff cmd-smerge-ediff)
+  (register-command! 'smerge-combine-with-next cmd-smerge-combine-with-next)
+  (register-command! 'smerge-refine cmd-smerge-refine)
+  (register-command! 'smerge-auto-leave cmd-smerge-auto-leave)
 )