fix(vi-mode): fix keymap indicator on zle-line-finish (#9620)
* Update VI_KEYMAP on zle-line-finish. Fixes next prompt draw.
* Also fix vi-mode prompt redraw in case previous prompt was canceled
* Do not redraw fix prompt if VI_MODE_RESET_PROMPT_ON_MODE_CHANGE is unset
* Use a local variable instead of global in function
Diff
1diff --git a/plugins/vi-mode/vi-mode.plugin.zsh b/plugins/vi-mode/vi-mode.plugin.zsh
2index 7f14961ad18115c356f15c1027b67437d76afd31..dd4afdd8b4f90f4a39c5bb4a2ca04fa63f6b794c 100644
3--- a/plugins/vi-mode/vi-mode.plugin.zsh
4+++ b/plugins/vi-mode/vi-mode.plugin.zsh
5@@ -50,13 +50,17 @@ zle -N zle-keymap-select
6 # These "echoti" statements were originally set in lib/key-bindings.zsh
7 # Not sure the best way to extend without overriding.
8 function zle-line-init() {
9+ local prev_vi_keymap
10+ prev_vi_keymap="${VI_KEYMAP:-}"
11 typeset -g VI_KEYMAP=main
12+ [[ "$prev_vi_keymap" != 'main' ]] && [[ "${VI_MODE_RESET_PROMPT_ON_MODE_CHANGE:-}" = true ]] && zle reset-prompt
13 (( ! ${+terminfo[smkx]} )) || echoti smkx
14 _vi-mode-set-cursor-shape-for-keymap "${VI_KEYMAP}"
15 }
16 zle -N zle-line-init
1718 function zle-line-finish() {
19+ typeset -g VI_KEYMAP=main
20 (( ! ${+terminfo[rmkx]} )) || echoti rmkx
21 _vi-mode-set-cursor-shape-for-keymap default
22 }