diff options
| author | Craig Jennings <c@cjennings.net> | 2026-06-06 12:32:59 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-06-06 12:32:59 -0500 |
| commit | 46b6403cc688490ea923f13819b562a4a22c5d30 (patch) | |
| tree | 6d42db92676a1b71a3bcc1dffcbcafff22085ca8 | |
| parent | e3c3fc8abd5e9e6552e9038c45ee05d220c6e18f (diff) | |
| download | dotemacs-46b6403cc688490ea923f13819b562a4a22c5d30.tar.gz dotemacs-46b6403cc688490ea923f13819b562a4a22c5d30.zip | |
fix(signal): register C-; M prefix via canonical helper
The C-; M Signal prefix didn't take effect on a fresh Emacs launch. signal-config.el was the only feature module that bound into cj/custom-keymap directly, wrapped in (with-eval-after-load 'keybindings (when (boundp 'cj/custom-keymap) ...)). The boundp guard turned a load-order miss into a silent no-op, so the binding never landed at startup. A later live-reload always papered over it because keybindings was loaded by then.
I switched to the documented cj/register-prefix-map helper and added (require 'keybindings) at the top, matching every other prefix map. The require guarantees keybindings loads before registration, so the guard is gone.
I verified at a full emacs --batch init.el launch, the actual failing scenario, that C-; M resolves to the signel prefix. I added a contract test asserting the registration, since the boundp guard was robust under unit timings and only failed at full launch.
| -rw-r--r-- | modules/signal-config.el | 10 | ||||
| -rw-r--r-- | tests/test-signal-config.el | 10 |
2 files changed, 16 insertions, 4 deletions
diff --git a/modules/signal-config.el b/modules/signal-config.el index 102ece86f..317e35203 100644 --- a/modules/signal-config.el +++ b/modules/signal-config.el @@ -16,6 +16,7 @@ ;;; Code: (require 'seq) +(require 'keybindings) ;; provides cj/custom-keymap + cj/register-prefix-map (defun cj/signal--jstr (value) "Return VALUE if it is a non-blank string, else nil. @@ -291,10 +292,11 @@ that on first use." Leaves =l= unbound for now -- the future =cj/signel-link= command lands in a later pass. See =docs/design/signal-client.org= scope summary.") -(declare-function cj/custom-keymap "keybindings" ()) -(with-eval-after-load 'keybindings - (when (boundp 'cj/custom-keymap) - (keymap-set cj/custom-keymap "M" cj/signel-prefix-map))) +;; Register the messages prefix under C-; M via the documented helper. +;; keybindings.el owns cj/custom-keymap; the (require 'keybindings) above +;; guarantees it is loaded before this runs, so no load-order guard is +;; needed. This is the same pattern every other feature module uses. +(cj/register-prefix-map "M" cj/signel-prefix-map "signal messages") (provide 'signal-config) ;;; signal-config.el ends here diff --git a/tests/test-signal-config.el b/tests/test-signal-config.el index 3be63362d..7556efdbe 100644 --- a/tests/test-signal-config.el +++ b/tests/test-signal-config.el @@ -368,6 +368,16 @@ commands the workflow spec names." (should (eq (keymap-lookup cj/signel-prefix-map "SPC") #'cj/signel-connect))) +(ert-deftest test-signal-config-prefix-map-registered-under-c-semi-m () + "Normal: loading signal-config registers `cj/signel-prefix-map' under +`M' in `cj/custom-keymap', so C-; M reaches the signel prefix. Guards +the wiring contract that the load-order bug broke: signal-config must +register through `cj/register-prefix-map', not a boundp-guarded direct +mutation that silently no-ops when keybindings loaded in a different +order." + (require 'keybindings) + (should (eq (keymap-lookup cj/custom-keymap "M") cj/signel-prefix-map))) + ;;; display-buffer-alist entry for *Signel: ...* chat buffers (ert-deftest test-signal-config-chat-buffer-display-rule-uses-bottom-30 () |
