Round 310: Loginctl ext, Machinectl ext, Hostnamectl ext, Timedatectl ext, Localectl ext (20 commands)

ober

5a09f37a22a7e00b0de8d626658c52bb70584c8f

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 36c701a..5e19223 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 310 — Loginctl ext, Machinectl ext, Hostnamectl ext, Timedatectl ext, Localectl ext
+
+| Command | Status | Description |
+|---------|--------|-------------|
+| loginctl-list | :orange_circle: | List login sessions |
+| loginctl-user | :orange_circle: | Show user info |
+| loginctl-session | :orange_circle: | Show session info |
+| loginctl-seat | :orange_circle: | List seats |
+| machinectl-list | :orange_circle: | List machines |
+| machinectl-login | :orange_circle: | Login to machine |
+| machinectl-start | :orange_circle: | Start machine |
+| machinectl-stop | :orange_circle: | Stop machine |
+| hostnamectl-show | :orange_circle: | Show hostname info |
+| hostnamectl-set | :orange_circle: | Set hostname |
+| hostnamectl-icon | :orange_circle: | Set icon name |
+| hostnamectl-chassis | :orange_circle: | Set chassis type |
+| timedatectl-show | :orange_circle: | Show time/date |
+| timedatectl-set | :orange_circle: | Set time/date |
+| timedatectl-ntp | :orange_circle: | Toggle NTP |
+| timedatectl-timezone | :orange_circle: | Set timezone |
+| localectl-status | :orange_circle: | Show locale status |
+| localectl-set-locale | :orange_circle: | Set locale |
+| localectl-set-keymap | :orange_circle: | Set keymap |
+| localectl-list-keymaps | :orange_circle: | List keymaps |
+
 ### Round 309 — Power Profiles ext, CPUFreq ext, Thermal ext, TLP ext, PowerTOP ext
 
 | Command | Status | Description |
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index d6a6783..31a006d 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -23447,4 +23447,58 @@
 
 (def (cmd-powertop-html app)
   (let* ((echo (app-state-echo app)))
-    (echo-message! echo "PowerTOP: generating HTML report")))
\ No newline at end of file
+    (echo-message! echo "PowerTOP: generating HTML report")))
+
+;;; Round 310 — Hostnamectl ext, Timedatectl ext, Localectl ext (batch 2)
+
+(def (cmd-hostnamectl-icon app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Icon name: "
+      (lambda (icon)
+        (echo-message! echo (str "Hostnamectl: icon " icon))))))
+
+(def (cmd-hostnamectl-chassis app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Chassis type: "
+      (lambda (chassis)
+        (echo-message! echo (str "Hostnamectl: chassis " chassis))))))
+
+(def (cmd-timedatectl-show app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Timedatectl: showing time/date")))
+
+(def (cmd-timedatectl-set app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Time (YYYY-MM-DD HH:MM:SS): "
+      (lambda (time)
+        (echo-message! echo (str "Timedatectl: setting " time))))))
+
+(def (cmd-timedatectl-ntp app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Timedatectl: toggling NTP")))
+
+(def (cmd-timedatectl-timezone app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Timezone: "
+      (lambda (tz)
+        (echo-message! echo (str "Timedatectl: setting timezone " tz))))))
+
+(def (cmd-localectl-status app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Localectl: showing status")))
+
+(def (cmd-localectl-set-locale app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Locale: "
+      (lambda (loc)
+        (echo-message! echo (str "Localectl: setting locale " loc))))))
+
+(def (cmd-localectl-set-keymap app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Keymap: "
+      (lambda (km)
+        (echo-message! echo (str "Localectl: setting keymap " km))))))
+
+(def (cmd-localectl-list-keymaps app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Localectl: listing keymaps")))
\ No newline at end of file
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 76dc82b..e79a035 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -24176,3 +24176,57 @@
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Thermald: viewing configuration")))
 
+;;; Round 310 — Loginctl ext, Machinectl ext, Hostnamectl ext (batch 1)
+
+(def (cmd-loginctl-list app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Loginctl: listing sessions")))
+
+(def (cmd-loginctl-user app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "User: "
+      (lambda (user)
+        (echo-message! echo (str "Loginctl: user " user))))))
+
+(def (cmd-loginctl-session app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Session ID: "
+      (lambda (sid)
+        (echo-message! echo (str "Loginctl: session " sid))))))
+
+(def (cmd-loginctl-seat app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Loginctl: listing seats")))
+
+(def (cmd-machinectl-list app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Machinectl: listing machines")))
+
+(def (cmd-machinectl-login app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Machine: "
+      (lambda (m)
+        (echo-message! echo (str "Machinectl: logging into " m))))))
+
+(def (cmd-machinectl-start app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Machine: "
+      (lambda (m)
+        (echo-message! echo (str "Machinectl: starting " m))))))
+
+(def (cmd-machinectl-stop app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Machine: "
+      (lambda (m)
+        (echo-message! echo (str "Machinectl: stopping " m))))))
+
+(def (cmd-hostnamectl-show app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Hostnamectl: showing hostname info")))
+
+(def (cmd-hostnamectl-set app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Hostname: "
+      (lambda (name)
+        (echo-message! echo (str "Hostnamectl: setting " name))))))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 6106d41..d4931e3 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -7927,4 +7927,25 @@
   (register-command! 'powertop-auto cmd-powertop-auto)
   (register-command! 'powertop-calibrate cmd-powertop-calibrate)
   (register-command! 'powertop-html cmd-powertop-html)
+  ;; Round 310
+  (register-command! 'loginctl-list cmd-loginctl-list)
+  (register-command! 'loginctl-user cmd-loginctl-user)
+  (register-command! 'loginctl-session cmd-loginctl-session)
+  (register-command! 'loginctl-seat cmd-loginctl-seat)
+  (register-command! 'machinectl-list cmd-machinectl-list)
+  (register-command! 'machinectl-login cmd-machinectl-login)
+  (register-command! 'machinectl-start cmd-machinectl-start)
+  (register-command! 'machinectl-stop cmd-machinectl-stop)
+  (register-command! 'hostnamectl-show cmd-hostnamectl-show)
+  (register-command! 'hostnamectl-set cmd-hostnamectl-set)
+  (register-command! 'hostnamectl-icon cmd-hostnamectl-icon)
+  (register-command! 'hostnamectl-chassis cmd-hostnamectl-chassis)
+  (register-command! 'timedatectl-show cmd-timedatectl-show)
+  (register-command! 'timedatectl-set cmd-timedatectl-set)
+  (register-command! 'timedatectl-ntp cmd-timedatectl-ntp)
+  (register-command! 'timedatectl-timezone cmd-timedatectl-timezone)
+  (register-command! 'localectl-status cmd-localectl-status)
+  (register-command! 'localectl-set-locale cmd-localectl-set-locale)
+  (register-command! 'localectl-set-keymap cmd-localectl-set-keymap)
+  (register-command! 'localectl-list-keymaps cmd-localectl-list-keymaps)
 )