From 4c184381d0c0c0edc03a3ea49209f154ba1b7998 Mon Sep 17 00:00:00 2001 From: Robby Russell Date: Thu, 8 Oct 2026 17:03:38 -0700 Subject: [PATCH] fix(key-bindings): make numeric keypad work in application mode We switch the terminal into application keypad mode (smkx) so terminfo key bindings are valid, but that also makes the numeric keypad send escape sequences (\eOp..\eOy, \eOM, ...) that were never bound. Keypad Enter rang the bell instead of running the command. Map each keypad sequence back to the plain key with `bindkey -s`, so it behaves exactly like the main keyboard key in emacs, viins and vicmd. Fixes #13928 Co-Authored-By: Claude Opus 5.5 --- lib/key-bindings.zsh | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/key-bindings.zsh b/lib/key-bindings.zsh index 0d2cecb6a..687244422 100644 --- a/lib/key-bindings.zsh +++ b/lib/key-bindings.zsh @@ -110,6 +110,23 @@ bindkey -M emacs '^[[1;5D' backward-word bindkey -M viins '^[[1;5D' backward-word bindkey -M vicmd '^[[1;5D' backward-word +# [Keypad] - application mode (enabled above) makes the keypad send escape +# sequences instead of characters, so map them back to the plain keys +() { + local seq key + local -A keypad=( + '^[Op' '0' '^[Oq' '1' '^[Or' '2' '^[Os' '3' '^[Ot' '4' + '^[Ou' '5' '^[Ov' '6' '^[Ow' '7' '^[Ox' '8' '^[Oy' '9' + '^[On' '.' '^[Ol' ',' '^[Ok' '+' '^[Om' '-' '^[Oj' '*' + '^[Oo' '/' '^[OX' '=' '^[OM' '^M' + ) + for seq key in "${(@kv)keypad}"; do + bindkey -M emacs -s "$seq" "$key" + bindkey -M viins -s "$seq" "$key" + bindkey -M vicmd -s "$seq" "$key" + done +} + bindkey '\ew' kill-region # [Esc-w] - Kill from the cursor to the mark bindkey -s '\el' '^q ls\n' # [Esc-l] - run command: ls