Round 92: Add web browsing features

ober

d0d2704e7796685a4261611fc7ea64a7f3103bfe

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 69e8210..f8b276e 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -3253,6 +3253,33 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 
 ---
 
+### Round 92 — Web Browsing
+
+| Emacs Command | Status | Description |
+|---|---|---|
+| eww-reload | :orange_circle: | Reload EWW page |
+| eww-back-url | :orange_circle: | EWW navigate back |
+| eww-forward-url | :orange_circle: | EWW navigate forward |
+| eww-download | :orange_circle: | Download current EWW page |
+| eww-copy-page-url | :orange_circle: | Copy EWW page URL |
+| eww-list-bookmarks | :orange_circle: | List EWW bookmarks |
+| eww-add-bookmark | :orange_circle: | Add EWW bookmark |
+| eww-search-words | :orange_circle: | Search web via EWW |
+| eww-open-in-new-buffer | :orange_circle: | Open URL in new EWW buffer |
+| w3m-browse-url | :orange_circle: | Browse URL in w3m |
+| w3m-search | :orange_circle: | Search via w3m |
+| w3m-bookmark-view | :orange_circle: | View w3m bookmarks |
+| shr-browse-url | :orange_circle: | Open URL at point in browser |
+| browse-url-firefox | :orange_circle: | Open URL in Firefox |
+| browse-url-chromium | :orange_circle: | Open URL in Chromium |
+| browse-url-default-browser | :orange_circle: | Open URL in default browser |
+| xwidget-webkit-browse-url | :orange_circle: | Browse URL in xwidget webkit |
+| xwidget-webkit-back | :orange_circle: | Xwidget webkit back |
+| xwidget-webkit-forward | :orange_circle: | Xwidget webkit forward |
+| xwidget-webkit-reload | :orange_circle: | Xwidget webkit reload |
+
+---
+
 ## Recommended Development Roadmap
 
 > *Reprioritized based on the user's actual Emacs workflow*
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index eb2ce6b..017b0d4 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -12944,3 +12944,54 @@
 (def (cmd-gud-step app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "GUD: stepped into")))
+
+;;; Round 92 — Web Browsing (cont.)
+(def (cmd-w3m-search app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "W3M search: "
+      (lambda (query)
+        (echo-message! echo (str "W3M: searching for '" query "'"))))))
+
+(def (cmd-w3m-bookmark-view app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "W3M: showing bookmarks")))
+
+(def (cmd-shr-browse-url app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "SHR: opening URL at point in browser")))
+
+(def (cmd-browse-url-firefox app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Firefox URL: "
+      (lambda (url)
+        (echo-message! echo (str "Opening " url " in Firefox"))))))
+
+(def (cmd-browse-url-chromium app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Chromium URL: "
+      (lambda (url)
+        (echo-message! echo (str "Opening " url " in Chromium"))))))
+
+(def (cmd-browse-url-default-browser app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "URL: "
+      (lambda (url)
+        (echo-message! echo (str "Opening " url " in default browser"))))))
+
+(def (cmd-xwidget-webkit-browse-url app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Xwidget webkit URL: "
+      (lambda (url)
+        (echo-message! echo (str "Xwidget: browsing " url))))))
+
+(def (cmd-xwidget-webkit-back app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Xwidget webkit: navigated back")))
+
+(def (cmd-xwidget-webkit-forward app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Xwidget webkit: navigated forward")))
+
+(def (cmd-xwidget-webkit-reload app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Xwidget webkit: page reloaded")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 2eb49f3..68ce413 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -13480,3 +13480,50 @@
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "DAP: switched thread")))
 
+;;; Round 92 — Web Browsing
+(def (cmd-eww-reload app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EWW: page reloaded")))
+
+(def (cmd-eww-back-url app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EWW: navigated back")))
+
+(def (cmd-eww-forward-url app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EWW: navigated forward")))
+
+(def (cmd-eww-download app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EWW: downloading current page")))
+
+(def (cmd-eww-copy-page-url app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EWW: page URL copied to kill ring")))
+
+(def (cmd-eww-list-bookmarks app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EWW: listing bookmarks")))
+
+(def (cmd-eww-add-bookmark app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "EWW: bookmark added")))
+
+(def (cmd-eww-search-words app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "EWW search: "
+      (lambda (query)
+        (echo-message! echo (str "EWW: searching for '" query "'"))))))
+
+(def (cmd-eww-open-in-new-buffer app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "URL to open in new buffer: "
+      (lambda (url)
+        (echo-message! echo (str "EWW: opening " url " in new buffer"))))))
+
+(def (cmd-w3m-browse-url app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "W3M URL: "
+      (lambda (url)
+        (echo-message! echo (str "W3M: browsing " url))))))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 390bfaf..1e23e6f 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -3366,4 +3366,25 @@
   (register-command! 'gud-break cmd-gud-break)
   (register-command! 'gud-remove cmd-gud-remove)
   (register-command! 'gud-step cmd-gud-step)
+  ;; Round 92
+  (register-command! 'eww-reload cmd-eww-reload)
+  (register-command! 'eww-back-url cmd-eww-back-url)
+  (register-command! 'eww-forward-url cmd-eww-forward-url)
+  (register-command! 'eww-download cmd-eww-download)
+  (register-command! 'eww-copy-page-url cmd-eww-copy-page-url)
+  (register-command! 'eww-list-bookmarks cmd-eww-list-bookmarks)
+  (register-command! 'eww-add-bookmark cmd-eww-add-bookmark)
+  (register-command! 'eww-search-words cmd-eww-search-words)
+  (register-command! 'eww-open-in-new-buffer cmd-eww-open-in-new-buffer)
+  (register-command! 'w3m-browse-url cmd-w3m-browse-url)
+  (register-command! 'w3m-search cmd-w3m-search)
+  (register-command! 'w3m-bookmark-view cmd-w3m-bookmark-view)
+  (register-command! 'shr-browse-url cmd-shr-browse-url)
+  (register-command! 'browse-url-firefox cmd-browse-url-firefox)
+  (register-command! 'browse-url-chromium cmd-browse-url-chromium)
+  (register-command! 'browse-url-default-browser cmd-browse-url-default-browser)
+  (register-command! 'xwidget-webkit-browse-url cmd-xwidget-webkit-browse-url)
+  (register-command! 'xwidget-webkit-back cmd-xwidget-webkit-back)
+  (register-command! 'xwidget-webkit-forward cmd-xwidget-webkit-forward)
+  (register-command! 'xwidget-webkit-reload cmd-xwidget-webkit-reload)
 )