mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2026-10-20 04:12:06 +08:00
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>
163 lines
5.7 KiB
Bash
163 lines
5.7 KiB
Bash
# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html
|
|
# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Zle-Builtins
|
|
# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Standard-Widgets
|
|
|
|
# Make sure that the terminal is in application mode when zle is active, since
|
|
# only then values from $terminfo are valid
|
|
if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then
|
|
function zle-line-init() {
|
|
echoti smkx
|
|
}
|
|
function zle-line-finish() {
|
|
echoti rmkx
|
|
}
|
|
zle -N zle-line-init
|
|
zle -N zle-line-finish
|
|
fi
|
|
|
|
# Use emacs key bindings
|
|
bindkey -e
|
|
|
|
# [PageUp] - Up a line of history
|
|
if [[ -n "${terminfo[kpp]}" ]]; then
|
|
bindkey -M emacs "${terminfo[kpp]}" up-line-or-history
|
|
bindkey -M viins "${terminfo[kpp]}" up-line-or-history
|
|
bindkey -M vicmd "${terminfo[kpp]}" up-line-or-history
|
|
fi
|
|
# [PageDown] - Down a line of history
|
|
if [[ -n "${terminfo[knp]}" ]]; then
|
|
bindkey -M emacs "${terminfo[knp]}" down-line-or-history
|
|
bindkey -M viins "${terminfo[knp]}" down-line-or-history
|
|
bindkey -M vicmd "${terminfo[knp]}" down-line-or-history
|
|
fi
|
|
|
|
# Start typing + [Up-Arrow] - fuzzy find history forward
|
|
autoload -U up-line-or-beginning-search
|
|
zle -N up-line-or-beginning-search
|
|
|
|
bindkey -M emacs "^[[A" up-line-or-beginning-search
|
|
bindkey -M viins "^[[A" up-line-or-beginning-search
|
|
bindkey -M vicmd "^[[A" up-line-or-beginning-search
|
|
if [[ -n "${terminfo[kcuu1]}" ]]; then
|
|
bindkey -M emacs "${terminfo[kcuu1]}" up-line-or-beginning-search
|
|
bindkey -M viins "${terminfo[kcuu1]}" up-line-or-beginning-search
|
|
bindkey -M vicmd "${terminfo[kcuu1]}" up-line-or-beginning-search
|
|
fi
|
|
|
|
# Start typing + [Down-Arrow] - fuzzy find history backward
|
|
autoload -U down-line-or-beginning-search
|
|
zle -N down-line-or-beginning-search
|
|
|
|
bindkey -M emacs "^[[B" down-line-or-beginning-search
|
|
bindkey -M viins "^[[B" down-line-or-beginning-search
|
|
bindkey -M vicmd "^[[B" down-line-or-beginning-search
|
|
if [[ -n "${terminfo[kcud1]}" ]]; then
|
|
bindkey -M emacs "${terminfo[kcud1]}" down-line-or-beginning-search
|
|
bindkey -M viins "${terminfo[kcud1]}" down-line-or-beginning-search
|
|
bindkey -M vicmd "${terminfo[kcud1]}" down-line-or-beginning-search
|
|
fi
|
|
|
|
# [Home] - Go to beginning of line
|
|
if [[ -n "${terminfo[khome]}" ]]; then
|
|
bindkey -M emacs "${terminfo[khome]}" beginning-of-line
|
|
bindkey -M viins "${terminfo[khome]}" beginning-of-line
|
|
bindkey -M vicmd "${terminfo[khome]}" beginning-of-line
|
|
fi
|
|
# [End] - Go to end of line
|
|
if [[ -n "${terminfo[kend]}" ]]; then
|
|
bindkey -M emacs "${terminfo[kend]}" end-of-line
|
|
bindkey -M viins "${terminfo[kend]}" end-of-line
|
|
bindkey -M vicmd "${terminfo[kend]}" end-of-line
|
|
fi
|
|
|
|
# [Shift-Tab] - move through the completion menu backwards
|
|
if [[ -n "${terminfo[kcbt]}" ]]; then
|
|
bindkey -M emacs "${terminfo[kcbt]}" reverse-menu-complete
|
|
bindkey -M viins "${terminfo[kcbt]}" reverse-menu-complete
|
|
bindkey -M vicmd "${terminfo[kcbt]}" reverse-menu-complete
|
|
fi
|
|
|
|
# [Backspace] - delete backward
|
|
bindkey -M emacs '^?' backward-delete-char
|
|
bindkey -M viins '^?' backward-delete-char
|
|
bindkey -M vicmd '^?' backward-delete-char
|
|
# [Delete] - delete forward
|
|
if [[ -n "${terminfo[kdch1]}" ]]; then
|
|
bindkey -M emacs "${terminfo[kdch1]}" delete-char
|
|
bindkey -M viins "${terminfo[kdch1]}" delete-char
|
|
bindkey -M vicmd "${terminfo[kdch1]}" delete-char
|
|
else
|
|
bindkey -M emacs "^[[3~" delete-char
|
|
bindkey -M viins "^[[3~" delete-char
|
|
bindkey -M vicmd "^[[3~" delete-char
|
|
|
|
bindkey -M emacs "^[3;5~" delete-char
|
|
bindkey -M viins "^[3;5~" delete-char
|
|
bindkey -M vicmd "^[3;5~" delete-char
|
|
fi
|
|
|
|
# [Ctrl-Delete] - delete whole forward-word
|
|
bindkey -M emacs '^[[3;5~' kill-word
|
|
bindkey -M viins '^[[3;5~' kill-word
|
|
bindkey -M vicmd '^[[3;5~' kill-word
|
|
|
|
# [Ctrl-RightArrow] - move forward one word
|
|
bindkey -M emacs '^[[1;5C' forward-word
|
|
bindkey -M viins '^[[1;5C' forward-word
|
|
bindkey -M vicmd '^[[1;5C' forward-word
|
|
# [Ctrl-LeftArrow] - move backward one word
|
|
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
|
|
bindkey '^r' history-incremental-search-backward # [Ctrl-r] - Search backward incrementally for a specified string. The string may begin with ^ to anchor the search to the beginning of the line.
|
|
bindkey ' ' magic-space # [Space] - don't do history expansion
|
|
|
|
|
|
# Edit the current command line in $VISUAL (or $EDITOR / `vi` if not set)
|
|
autoload -U edit-command-line
|
|
zle -N edit-command-line
|
|
bindkey '\C-x\C-e' edit-command-line
|
|
|
|
# file rename magick
|
|
bindkey "^[m" copy-prev-shell-word
|
|
|
|
# consider emacs keybindings:
|
|
|
|
#bindkey -e ## emacs key bindings
|
|
#
|
|
#bindkey '^[[A' up-line-or-search
|
|
#bindkey '^[[B' down-line-or-search
|
|
#bindkey '^[^[[C' emacs-forward-word
|
|
#bindkey '^[^[[D' emacs-backward-word
|
|
#
|
|
#bindkey -s '^X^Z' '%-^M'
|
|
#bindkey '^[e' expand-cmd-path
|
|
#bindkey '^[^I' reverse-menu-complete
|
|
#bindkey '^X^N' accept-and-infer-next-history
|
|
#bindkey '^W' kill-region
|
|
#bindkey '^I' complete-word
|
|
## Fix weird sequence that rxvt produces
|
|
#bindkey -s '^[[Z' '\t'
|
|
#
|