Function: ghostel--define-terminal-keys
ghostel--define-terminal-keys is a natively compiled function defined
in ghostel.el.
Signature
(ghostel--define-terminal-keys MAP &optional NO-EXCEPTIONS)
Documentation
Populate MAP with terminal key-sending bindings.
When NO-EXCEPTIONS is non-nil, also bind the keys in
ghostel-keymap-exceptions (used by char mode).
Source Code
;; Defined in /nix/store/1252krff0gb2kisjcpp45m50cpdskfrl-emacs-packages-deps/share/emacs/site-lisp/ghostel.el
;;; Keymap
(defun ghostel--define-terminal-keys (map &optional no-exceptions)
"Populate MAP with terminal key-sending bindings.
When NO-EXCEPTIONS is non-nil, also bind the keys in
`ghostel-keymap-exceptions' (used by char mode)."
;; Self-insert characters
(define-key map [remap self-insert-command] #'ghostel--self-insert)
;; Special keys — routed through the ghostty key encoder which
;; respects terminal modes and handles all modifier combinations.
;; Use angle-bracket forms so modifier prefixes compose correctly.
;; Skip keys in `ghostel-keymap-exceptions' unless NO-EXCEPTIONS is
;; non-nil (char mode binds everything).
(dolist (key '("<return>" "<tab>" "<backspace>" "<escape>"
"<up>" "<down>" "<right>" "<left>"
"<home>" "<end>" "<prior>" "<next>"
"<deletechar>" "<insert>"
"<f1>" "<f2>" "<f3>" "<f4>" "<f5>" "<f6>"
"<f7>" "<f8>" "<f9>" "<f10>" "<f11>" "<f12>"))
(when (or no-exceptions (not (member key ghostel-keymap-exceptions)))
(define-key map (kbd key) #'ghostel--send-event))
(dolist (mod '("S-" "C-" "M-" "C-S-" "M-S-" "C-M-"))
(let ((key-str (concat mod key)))
(when (or no-exceptions
(not (member key-str ghostel-keymap-exceptions)))
(ignore-errors
(define-key map (kbd key-str) #'ghostel--send-event))))))
;; Bare aliases for unmodified keys (RET=\r, TAB=\t, DEL=\x7f)
(define-key map (kbd "RET") #'ghostel--send-event)
(define-key map (kbd "TAB") #'ghostel--send-event)
(define-key map (kbd "DEL") #'ghostel--send-event)
;; Emacs reports S-TAB as <backtab>
(define-key map (kbd "<backtab>") #'ghostel--send-event)
;; Control keys - bind all C-<letter> to go through the key encoder
;; (C0 byte in legacy mode, CSI-u when kitty mode is active).
;; C-i = TAB and C-m = RET are equivalent to <tab>/<return> (bound above).
;; C-y is reserved for ghostel-yank in semi-char mode.
;; C-g is bound separately via `ghostel--rebuild-semi-char-keymap'.
(let ((skip (if no-exceptions '(?i ?m ?g) '(?i ?m ?y ?g))))
(dolist (c (number-sequence ?a ?z))
(let ((key-str (format "C-%c" c)))
(unless (or (memq c skip)
(and (not no-exceptions)
(member key-str ghostel-keymap-exceptions)))
(define-key map (kbd key-str) #'ghostel--send-event)))))
;; Meta keys - bind M-<printable ASCII> so the full set reaches the terminal.
;; Skip ?\[ and ?O: those are escape-sequence prefixes (CSI / SS3)
;; used by Emacs input decoding for arrow/function keys in TTY mode.
(dolist (c (number-sequence ?! ?~))
(unless (memq c '(?\[ ?O))
(let ((key-str (format "M-%c" c)))
(when (or no-exceptions
(not (member key-str ghostel-keymap-exceptions)))
(ignore-errors
(define-key map (kbd key-str) #'ghostel--send-event))))))
;; M-SPC: `(format "M-%c" ?\s)' yields "M- ", which `kbd' rejects.
(let ((key-str "M-SPC"))
(when (or no-exceptions
(not (member key-str ghostel-keymap-exceptions)))
(define-key map (kbd key-str) #'ghostel--send-event)))
;; TTY double-tap ESC: a second ESC byte within
;; `ghostel-tty-escape-delay' passes the lone-ESC filter raw as [27 27].
;; Send it as alt+escape (GUI M-<escape> parity) rather than pending
;; on the global `ESC ESC ESC' prefix.
(let ((key-str "ESC ESC"))
(when (or no-exceptions
(not (member key-str ghostel-keymap-exceptions)))
(define-key map (kbd key-str) #'ghostel--send-event)))
;; C-M-<letter>, plus C-] / C-/ and their C-M- forms.
;; The non-letter keys the encoder maps to a control byte.
(dolist (key-str (append
(mapcar (lambda (c) (format "C-M-%c" c))
(number-sequence ?a ?z))
'("C-]" "C-/" "C-M-]" "C-M-/")))
(when (or no-exceptions
(not (member key-str ghostel-keymap-exceptions)))
(define-key map (kbd key-str) #'ghostel--send-event)))
;; M-DEL: TTY Emacs delivers Alt-Backspace as ESC + 0x7f, which
;; resolves to ?\M-\d. The `M-<backspace>' form above only covers
;; the `[M-backspace]' symbol path; without this binding, TTY
;; Alt-Backspace falls through to global `backward-kill-word'.
(define-key map (kbd "M-DEL") #'ghostel--send-event)
;; Ctrl+Space is NUL. A TTY delivers it as `C-@'. GUI Emacs as the distinct
;; event `C-SPC', which only char mode captures. In semi-char `C-SPC' falls
;; through to the global map so mark commands run there.
(define-key map (kbd "C-@") #'ghostel--send-event)
;; Char mode extras: also bind non-letter exception keys so nothing
;; gets stolen by Emacs while a TUI app runs.
(when no-exceptions
(define-key map (kbd "C-SPC") #'ghostel--send-event)
(define-key map (kbd "C-\\") #'ghostel--send-event)
(define-key map (kbd "M-:") #'ghostel--send-event)))