summaryrefslogtreecommitdiff
path: root/emacs/init.el
diff options
context:
space:
mode:
authorThomas Ulmer <thomasmulmer02@gmail.com>2025-12-20 11:37:54 -0800
committerThomas Ulmer <thomasmulmer02@gmail.com>2025-12-20 11:37:54 -0800
commit9199a4c1eb8c77c76d2ed98c0fa88fcae2b0cc4f (patch)
tree8ccfe173554ba4671db9d1af39c121204c06f810 /emacs/init.el
parent9dfc3885317fd4e46a05ca60d5b46a9b57f202b8 (diff)
emacs: terminal key shadowing fix
Diffstat (limited to 'emacs/init.el')
-rw-r--r--emacs/init.el121
1 files changed, 79 insertions, 42 deletions
diff --git a/emacs/init.el b/emacs/init.el
index a39fbae..8c0abd4 100644
--- a/emacs/init.el
+++ b/emacs/init.el
@@ -182,6 +182,20 @@ given keymap or in the global keymap."
'(0 1 2 3 4 5 6 7 8 9)))
(my/c-x-n-to-m-n)
+(defun my/keymap-keys (map)
+ "Return a list of all key sequences in a keymap MAP recursively."
+ (mapcan (lambda (c)
+ (let ((ks (car c))
+ (km (cdr c))
+ (acc nil))
+ (map-keymap (lambda (key bind)
+ (let ((kss (vconcat ks (vector key))))
+ (when (commandp bind)
+ (push kss acc))))
+ km)
+ acc))
+ (accessible-keymaps map)))
+
(defun my/eshell (&optional arg)
"Create a new eshell or switch to an existing one.
With ARG, make anew shell. If the current buffer is an eshell, switch
@@ -225,6 +239,43 @@ current layout."
(set-window-configuration right t t)
(setq my/layout-pair (cons right left))))
+(progn ; my global keybinds
+ (define-minor-mode my/keys-mode
+ "Minor mode collecting global keybinds"
+ :global t
+ :keymap (make-sparse-keymap))
+
+ ;; The keymaps in `emulation-mode-map-alists' take precedence over
+ ;; `minor-mode-map-alist'
+ (add-to-list 'emulation-mode-map-alists
+ '((my/keys-mode . my/keys-keymap)))
+
+ (setq delete-pair-blink-delay 0)
+
+ (keymap-set my/keys-mode-map "C-x C-C" 'save-buffers-kill-terminal)
+ (keymap-set my/keys-mode-map "C-x C-c" 'my/close-or-kill)
+ (keymap-set my/keys-mode-map "C-x -" 'my/swap-other-window-buffer)
+ (keymap-set my/keys-mode-map "C-x w o" 'my/toggle-window-other-reachability)
+ (keymap-set my/keys-mode-map "M-w" 'copy-region-as-kill) ; make copying not flash cursor
+ (keymap-set my/keys-mode-map "M-(" 'my/wrap-region-paren)
+ (keymap-set my/keys-mode-map "M-z" 'my/zap-whitespace)
+ (keymap-set my/keys-mode-map "C-M-z" 'my/wrap-sexp)
+ (keymap-set my/keys-mode-map "M-o" 'other-window)
+ (keymap-set my/keys-mode-map "M-RET" 'my/eshell)
+ (keymap-set my/keys-mode-map "M-C" 'calc)
+ (keymap-set my/keys-mode-map "M-K" 'my/kill-buffer)
+ (keymap-set my/keys-mode-map "M-D" 'my/vc-on-root)
+ (keymap-set my/keys-mode-map "M-U" 'scroll-lock-mode)
+ (keymap-set my/keys-mode-map "M-Q" 'auto-fill-mode)
+ (keymap-set my/keys-mode-map "M-A" 'beginning-of-line-text)
+ (keymap-set my/keys-mode-map "M-R" 'my/layout-swap)
+ (keymap-set my/keys-mode-map "C-c R" 'raise-sexp)
+ (keymap-set my/keys-mode-map "C-c r" 'delete-pair)
+ (keymap-set my/keys-mode-map "M-S" 'surround-prefix)
+ (keymap-set my/keys-mode-map "M-\"" 'my/activate-mark)
+
+ (my/keys-mode 1))
+
(use-package server ; allow emacsclient
:demand t
:config
@@ -464,6 +515,34 @@ current layout."
("C-l" . eshell/clear))
:hook (eshell-mode . eldoc-mode))
+(use-package eat ; terminal override to make eshell behave better
+ :demand t
+ :custom
+ (eat-enable-auto-line-mode t)
+ :config
+ (eat-eshell-mode)
+ (eat-eshell-visual-command-mode)
+ (let* ((desired-global-binds (my/keymap-keys my/keys-mode-map))
+ (desired-prefixes (mapcar (lambda (ks)
+ (let ((k1 (elt ks 0))
+ (meta-mask ?\M-\0))
+ (if (numberp k1)
+ (if (equal ?\e k1)
+ (vector k1 (elt ks 1))
+ (let ((k-no-m (logand k1 (lognot meta-mask)))
+ (k-has-m (not (zerop (logand k1 meta-mask)))))
+ (if k-has-m
+ (vector ?\e k-no-m)
+ (vector k1))))
+ (vector k1))))
+ desired-global-binds)))
+ (mapc (lambda (ks)
+ (add-to-list 'eat-semi-char-non-bound-keys ks)
+ (add-to-list 'eat-eshell-semi-char-non-bound-keys ks))
+ desired-prefixes)
+ (eat-update-semi-char-mode-map)
+ (eat-eshell-update-semi-char-mode-map)))
+
(use-package shelldon
:demand t
:config
@@ -484,12 +563,6 @@ current layout."
("M-&" . 'shelldon)
("M-*" . 'shelldon-loop))
-(use-package eat ; terminal override to make eshell behave better
- :demand t
- :config
- (eat-eshell-mode)
- (eat-eshell-visual-command-mode))
-
(progn ; comint, doesn't play with use-package
(require 'comint)
(setq-default comint-scroll-to-bottom-on-input t)
@@ -768,42 +841,6 @@ current layout."
(advice-add 'ispell-mode :before 'debug)
(setq-default text-mode-hook (cons 'ispell-minor-mode (remove 'ispell-mode text-mode-hook))))
-(progn ; my global keybinds
- (define-minor-mode my/keys-mode
- "Minor mode collecting global keybinds"
- :global t
- :keymap (make-sparse-keymap))
-
- ;; The keymaps in `emulation-mode-map-alists' take precedence over
- ;; `minor-mode-map-alist'
- (add-to-list 'emulation-mode-map-alists
- '((my/keys-mode . my/keys-keymap)))
-
- (setq delete-pair-blink-delay 0)
-
- (keymap-set my/keys-mode-map "C-x C-C" 'save-buffers-kill-terminal)
- (keymap-set my/keys-mode-map "C-x C-c" 'my/close-or-kill)
- (keymap-set my/keys-mode-map "C-x -" 'my/swap-other-window-buffer)
- (keymap-set my/keys-mode-map "C-x w o" 'my/toggle-window-other-reachability)
- (keymap-set my/keys-mode-map "M-w" 'copy-region-as-kill) ; make copying not flash cursor
- (keymap-set my/keys-mode-map "M-(" 'my/wrap-region-paren)
- (keymap-set my/keys-mode-map "M-z" 'my/zap-whitespace)
- (keymap-set my/keys-mode-map "C-M-z" 'my/wrap-sexp)
- (keymap-set my/keys-mode-map "M-o" 'other-window)
- (keymap-set my/keys-mode-map "M-RET" 'my/eshell)
- (keymap-set my/keys-mode-map "M-C" 'calc)
- (keymap-set my/keys-mode-map "M-K" 'my/kill-buffer)
- (keymap-set my/keys-mode-map "M-D" 'my/vc-on-root)
- (keymap-set my/keys-mode-map "M-U" 'scroll-lock-mode)
- (keymap-set my/keys-mode-map "M-Q" 'auto-fill-mode)
- (keymap-set my/keys-mode-map "M-A" 'beginning-of-line-text)
- (keymap-set my/keys-mode-map "M-R" 'my/layout-swap)
- (keymap-set my/keys-mode-map "C-c R" 'raise-sexp)
- (keymap-set my/keys-mode-map "C-c r" 'delete-pair)
- (keymap-set my/keys-mode-map "M-S" 'surround-prefix)
- (keymap-set my/keys-mode-map "M-\"" 'my/activate-mark)
-
- (my/keys-mode 1))
(use-package time
:custom