Compare commits

Author SHA1 Message Date
Robby RussellandClaude Opus 5.5 4c184381d0 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 <noreply@anthropic.com>
2026-10-08 17:03:38 -07:00
2 changed files with 23 additions and 49 deletions
+17
View File
@@ -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
+6 -49
View File
@@ -202,54 +202,6 @@ if is_tty; then
RESET=$(printf '\033[0m')
fi
# Logo lines, split by `|` into one segment per rainbow color
BANNER=(
' |__ | | | | |__ '
' ____ |/ /_ | ____ ___ |__ __ | ____ |_____|/ /_ '
' / __ \|/ __ \ | / __ `__ \|/ / / / | /_ / |/ ___/| __ \ '
'/ /_/ /| / / / | / / / / / /| /_/ / | / /_|(__ )| / / / '
'\____/|_/ /_/ | /_/ /_/ /_/|\__, / | /___/|____/|_/ /_/ '
' | | | /____/ | | | '
)
# Print the first $1 columns of the logo
print_banner_frame() {
local line i
local -i remaining
local -a segments
for line in $BANNER; do
remaining=$1
segments=("${(@s:|:)line}")
for (( i = 1; i <= $#segments && remaining > 0; i++ )); do
printf '%s%s' "${RAINBOW[i]}" "${segments[i][1,remaining]}"
(( remaining -= ${#segments[i]} ))
done
printf '%s\n' "$RESET"
done
}
# Draw the logo left to right on a terminal, all at once otherwise
print_banner() {
local -i width=${#${BANNER[2]//|}} step=4 col
if ! is_tty || ! zmodload zsh/zselect 2>/dev/null; then
print_banner_frame $width
return
fi
setopt localtraps
trap 'printf "\033[?25h"; exit 130' INT
printf '\033[?25l'
for (( col = step; ; col += step )); do
(( col > width )) && col=width
print_banner_frame $col
(( col == width )) && break
printf '\033[%dA' $#BANNER
zselect -t 2
done
printf '\033[?25h'
}
# Update upstream remote to ohmyzsh org
git remote -v | while read remote url extra; do
case "$url" in
@@ -351,7 +303,12 @@ if perform_update; then
fi
if [[ $verbose_mode == default ]]; then
print_banner
printf '%s %s__ %s %s %s %s %s__ %s\n' $RAINBOW $RESET
printf '%s ____ %s/ /_ %s ____ ___ %s__ __ %s ____ %s_____%s/ /_ %s\n' $RAINBOW $RESET
printf '%s / __ \\%s/ __ \\ %s / __ `__ \\%s/ / / / %s /_ / %s/ ___/%s __ \\ %s\n' $RAINBOW $RESET
printf '%s/ /_/ /%s / / / %s / / / / / /%s /_/ / %s / /_%s(__ )%s / / / %s\n' $RAINBOW $RESET
printf '%s\\____/%s_/ /_/ %s /_/ /_/ /_/%s\\__, / %s /___/%s____/%s_/ /_/ %s\n' $RAINBOW $RESET
printf '%s %s %s %s /____/ %s %s %s %s\n' $RAINBOW $RESET
printf '\n'
printf "${BLUE}%s${RESET}\n\n" "$message"
printf "${BLUE}${BOLD}%s %s %s %s${RESET}\n" \