fix: C-i in KKP supported terminals
"C-i" and "TAB" are equivalent to Emacs. In GUI Emacs, we can bind to [tab] instead of "TAB", permitted users to treat the two keys differently. However, [tab] is unavailable in TTY frames, so there was no avoiding sacrificing C-i keybinds there. With KKP support, though, that's no longer the case.
This commit is contained in:
parent
0a38eeef4c
commit
538ddf5e66
2 changed files with 28 additions and 22 deletions
|
@ -50,27 +50,23 @@ and Emacs states, and for non-evil users.")
|
|||
(setq w32-lwindow-modifier 'super
|
||||
w32-rwindow-modifier 'super)))
|
||||
|
||||
;; HACK: Emacs cannot distinguish between C-i from TAB. This is largely a
|
||||
;; byproduct of its history in the terminal, which can't distinguish them
|
||||
;; either, however, when GUIs came about Emacs created separate input events
|
||||
;; for more contentious keys like TAB and RET. Therefore [return] != RET,
|
||||
;; [tab] != TAB, and [backspace] != DEL.
|
||||
;;
|
||||
;; In the same vein, this keybind adds a [C-i] event, so users can bind to it
|
||||
;; independently of TAB. Otherwise, it falls back to keys bound to C-i.
|
||||
(define-key key-translation-map [?\C-i]
|
||||
(cmd! (if (let ((keys (this-single-command-raw-keys)))
|
||||
(and keys
|
||||
(not (cl-position 'tab keys))
|
||||
(not (cl-position 'kp-tab keys))
|
||||
(display-graphic-p)
|
||||
;; Fall back if no <C-i> keybind can be found, otherwise
|
||||
;; we've broken all pre-existing C-i keybinds.
|
||||
(let ((key
|
||||
(doom-lookup-key
|
||||
(vconcat (cl-subseq keys 0 -1) [C-i]))))
|
||||
(not (or (numberp key) (null key))))))
|
||||
[C-i] [?\C-i])))
|
||||
;; HACK: Emacs can't distinguish C-i from TAB in either GUI or TTY frames. This
|
||||
;; is a byproduct of its history with the terminal, which can't distinguish
|
||||
;; them either, however, Emacs has separate input events for many contentious
|
||||
;; keys like TAB and RET (like [tab] and [return], aka "<tab>" and
|
||||
;; "<return>"), which are only triggered in GUI frames, so here, I create one
|
||||
;; for C-i. Won't work in TTY frames, though. Doom's :os tty module has a
|
||||
;; workaround for that though.
|
||||
(define-key input-decode-map
|
||||
[?\C-i] (cmd! (if (when-let ((keys (this-single-command-raw-keys)))
|
||||
(and (display-graphic-p)
|
||||
(not (cl-position 'tab keys))
|
||||
(not (cl-position 'kp-tab keys))
|
||||
;; Fall back if no <C-i> keybind can be found,
|
||||
;; otherwise we've broken all pre-existing C-i
|
||||
;; keybinds.
|
||||
(key-binding (vconcat (cl-subseq keys 0 -1) [C-i]) nil t)))
|
||||
[C-i] [?\C-i])))
|
||||
|
||||
|
||||
;;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue