diff options
Diffstat (limited to 'plugins/vi-mode/vi-mode.plugin.zsh')
-rw-r--r-- | plugins/vi-mode/vi-mode.plugin.zsh | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/plugins/vi-mode/vi-mode.plugin.zsh b/plugins/vi-mode/vi-mode.plugin.zsh index 4424bb29a..c91ba05ba 100644 --- a/plugins/vi-mode/vi-mode.plugin.zsh +++ b/plugins/vi-mode/vi-mode.plugin.zsh @@ -1,34 +1,31 @@ -# Ensures that $terminfo values are valid and updates editor information when -# the keymap changes. -function zle-keymap-select zle-line-init zle-line-finish { - # The terminal must be in application mode when ZLE is active for $terminfo - # values to be valid. - if (( ${+terminfo[smkx]} )); then - printf '%s' ${terminfo[smkx]} - fi - if (( ${+terminfo[rmkx]} )); then - printf '%s' ${terminfo[rmkx]} - fi +# Updates editor information when the keymap changes. +function zle-keymap-select() { + # update keymap variable for the prompt + VI_KEYMAP=$KEYMAP zle reset-prompt zle -R } -# Ensure that the prompt is redrawn when the terminal size changes. -TRAPWINCH() { - zle && { zle reset-prompt; zle -R } +zle -N zle-keymap-select + +function vi-accept-line() { + VI_KEYMAP=main + zle accept-line } -zle -N zle-line-init -zle -N zle-line-finish -zle -N zle-keymap-select -zle -N edit-command-line +zle -N vi-accept-line bindkey -v +# use custom accept-line widget to update $VI_KEYMAP +bindkey -M vicmd '^J' vi-accept-line +bindkey -M vicmd '^M' vi-accept-line + # allow v to edit the command line (standard behaviour) autoload -Uz edit-command-line +zle -N edit-command-line bindkey -M vicmd 'v' edit-command-line # allow ctrl-p, ctrl-n for navigate history (standard behaviour) @@ -40,13 +37,21 @@ bindkey '^?' backward-delete-char bindkey '^h' backward-delete-char bindkey '^w' backward-kill-word +# allow ctrl-r and ctrl-s to search the history +bindkey '^r' history-incremental-search-backward +bindkey '^s' history-incremental-search-forward + +# allow ctrl-a and ctrl-e to move to beginning/end of line +bindkey '^a' beginning-of-line +bindkey '^e' end-of-line + # if mode indicator wasn't setup by theme, define default if [[ "$MODE_INDICATOR" == "" ]]; then MODE_INDICATOR="%{$fg_bold[red]%}<%{$fg[red]%}<<%{$reset_color%}" fi function vi_mode_prompt_info() { - echo "${${KEYMAP/vicmd/$MODE_INDICATOR}/(main|viins)/}" + echo "${${VI_KEYMAP/vicmd/$MODE_INDICATOR}/(main|viins)/}" } # define right prompt, if it wasn't defined by a theme |