aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-13 00:56:38 -0500
committerCraig Jennings <c@cjennings.net>2026-06-13 00:56:38 -0500
commita631938c95ee7974a1d5489ad3aba713c4f0a0d5 (patch)
treeb0e9fe7b88fa3f0707f4787429cbf2554a2a91af
parent2cc54965d614151c8d8df7c0c857cbcd4aedf1af (diff)
downloaddotemacs-a631938c95ee7974a1d5489ad3aba713c4f0a0d5.tar.gz
dotemacs-a631938c95ee7974a1d5489ad3aba713c4f0a0d5.zip
fix(keys): revert 4a1ecf64, restore the M-S- launcher bindings
4a1ecf64 rebound eww/elfeed/calibredb from M-S-e/r/b to the uppercase Meta events M-E/M-R/M-B, on the theory that the keyboard emits the uppercase event and the lowercase-shift spec never matched. It was wrong. keyboard-compat.el installs a key-translation-map entry (M-E -> M-S-e, etc.) in GUI frames, so the original M-S- bindings did reach the launchers. Binding M-E directly while that translation stayed in place rewrote the keypress to the now-unbound M-S-e, breaking all three in GUI on the next restart. The audit and the review missed it because they checked key-binding, which ignores key-translation-map, and the running daemon still held the pre-fix bindings as stale state. This restores M-S-e/r/b, deletes the key-binding-only test that certified the broken config, and reclassifies the task as not-a-bug. The real problem, that these chords are dead outside GUI, is the subject of the keybinding-console-safety spec.
-rw-r--r--modules/calibredb-epub-config.el2
-rw-r--r--modules/elfeed-config.el2
-rw-r--r--modules/eww-config.el2
-rw-r--r--tests/test-launcher-meta-shift-keys.el32
-rw-r--r--todo.org6
5 files changed, 6 insertions, 38 deletions
diff --git a/modules/calibredb-epub-config.el b/modules/calibredb-epub-config.el
index 20262e6e..a17bf8c9 100644
--- a/modules/calibredb-epub-config.el
+++ b/modules/calibredb-epub-config.el
@@ -112,7 +112,7 @@ which re-applies `calibredb-search-filter' instead."
(use-package calibredb
:commands calibredb
:bind
- ("M-B" . calibredb) ;; Meta+Shift+b emits the uppercase event; overrides backward-word
+ ("M-S-b" . calibredb) ;; was M-B, overrides backward-word
;; use built-in filter by tag, add clear-filters
(:map calibredb-search-mode-map
("l" . calibredb-filter-by-tag)
diff --git a/modules/elfeed-config.el b/modules/elfeed-config.el
index 4f408915..ad7bda83 100644
--- a/modules/elfeed-config.el
+++ b/modules/elfeed-config.el
@@ -33,7 +33,7 @@
(use-package elfeed
:bind
- ("M-R" . cj/elfeed-open) ;; Meta+Shift+r emits the uppercase event
+ ("M-S-r" . cj/elfeed-open) ;; was M-R
(:map elfeed-show-mode-map
("w" . eww-open-in-new-buffer))
(:map elfeed-search-mode-map
diff --git a/modules/eww-config.el b/modules/eww-config.el
index 18648c1b..066fae98 100644
--- a/modules/eww-config.el
+++ b/modules/eww-config.el
@@ -67,7 +67,7 @@
(use-package eww
:ensure nil ;; built-in
:bind
- (("M-E" . eww) ;; Meta+Shift+e emits the uppercase event; overrides forward-sentence
+ (("M-S-e" . eww) ;; was M-E, overrides forward-sentence
:map eww-mode-map
("<" . eww-back-url)
(">" . eww-forward-url)
diff --git a/tests/test-launcher-meta-shift-keys.el b/tests/test-launcher-meta-shift-keys.el
deleted file mode 100644
index 574a8d68..00000000
--- a/tests/test-launcher-meta-shift-keys.el
+++ /dev/null
@@ -1,32 +0,0 @@
-;;; test-launcher-meta-shift-keys.el --- Meta+Shift launcher keys reach their commands -*- lexical-binding: t; -*-
-
-;;; Commentary:
-;; Meta+Shift+<letter> emits the uppercase event (M-E, M-R, M-B), so a
-;; binding written as "M-S-e" on a lowercase letter is never reached by
-;; the keychord. These launchers must be bound under the uppercase
-;; event the keyboard actually produces.
-
-;;; Code:
-
-(require 'ert)
-(require 'testutil-general)
-
-(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
-(require 'eww-config)
-(require 'elfeed-config)
-(require 'calibredb-epub-config)
-
-(ert-deftest test-launcher-meta-shift-e-opens-eww ()
- "Normal: M-E (Meta+Shift+e) is bound to `eww'."
- (should (eq (key-binding (kbd "M-E")) 'eww)))
-
-(ert-deftest test-launcher-meta-shift-r-opens-elfeed ()
- "Normal: M-R (Meta+Shift+r) is bound to `cj/elfeed-open'."
- (should (eq (key-binding (kbd "M-R")) 'cj/elfeed-open)))
-
-(ert-deftest test-launcher-meta-shift-b-opens-calibredb ()
- "Normal: M-B (Meta+Shift+b) is bound to `calibredb'."
- (should (eq (key-binding (kbd "M-B")) 'calibredb)))
-
-(provide 'test-launcher-meta-shift-keys)
-;;; test-launcher-meta-shift-keys.el ends here
diff --git a/todo.org b/todo.org
index 8c18109a..8662866e 100644
--- a/todo.org
+++ b/todo.org
@@ -859,9 +859,9 @@ From the 2026-06 config audit, =modules/dwim-shell-config.el=:
** TODO [#B] prog hooks mutate global state per buffer :bug:quick:solo:
From the 2026-06 config audit: =prog-go.el:64=, =prog-c.el:73=, =prog-shell.el:77= call global =(electric-pair-mode t)= from buffer setup hooks — one Go/C/shell buffer turns on pairing in org/text everywhere (python/webdev correctly use =electric-pair-local-mode=). =prog-general.el:79-80= — =display-line-numbers-type 'relative= setq/setq-default run from the hook AFTER the mode is enabled, so the first prog buffer of a session gets absolute numbers. Local-mode for the three; move the line-number setqs to top level.
-** DONE [#B] M-S- launcher keys dead: eww, elfeed, calibredb unreachable :bug:quick:solo:
-CLOSED: [2026-06-12 Fri]
-Fixed: rewrote the three =:bind= specs as =M-E= / =M-R= / =M-B= (=eww-config.el=, =elfeed-config.el=, =calibredb-epub-config.el=) so the uppercase event the keyboard actually emits is bound. 3 ERT tests in =tests/test-launcher-meta-shift-keys.el= assert =(key-binding (kbd "M-E"))= etc. resolve to =eww= / =cj/elfeed-open= / =calibredb= (red before, green after). Verified live in the daemon. Open follow-ups (not done here, kept scoped): the "same class" =M-S-i= binding in text-config, and an audit of the keyboard-compat translation layer that makes Weather's =M-S-w= work.
+** CANCELLED [#B] M-S- launcher keys dead: eww, elfeed, calibredb unreachable :bug:quick:solo:
+CLOSED: [2026-06-13 Sat]
+Not a bug. The audit used =key-binding=, which ignores =key-translation-map=, so it read the M-S- launcher chords as dead. They work in GUI: =keyboard-compat.el= installs a =key-translation-map= entry (=M-E -> M-S-e=, etc.) in GUI frames, so Meta+Shift+letter reaches eww/elfeed/calibredb. The "fix" =4a1ecf64= bound =M-E= directly and broke them instead; reverted here. The real console-reachability problem (the chords are dead outside GUI) is the subject of [[file:docs/design/keybinding-console-safety-spec.org][the keybinding-console-safety spec]].
** TODO [#B] ai-rewrite: chosen directive never reaches the request :bug:solo:
=modules/ai-rewrite.el:64= — the directive is let-bound around =(call-interactively #'gptel-rewrite)=, but gptel-rewrite is a transient prefix that returns when the menu shows; the send resolves the directive AFTER the binding unwound (verified against ~/code/gptel/gptel-rewrite.el:780-799). The picker's choice is silently dropped — the module's core feature is inert. Set =gptel--rewrite-directive= buffer-locally (restore via =gptel-post-rewrite-functions=) or use a self-removing global hook entry. From the 2026-06 config audit.