Вы уже нашли, zle-keymap-selectчто выполняется при изменении режима. Вы можете использовать его для установки какого-либо другого визуального индикатора, отличного от приглашения, в зависимости от того, что ваш терминал поддерживает (и, конечно, ваш вкус в отображении индикатора режима).
Существует стандартная возможность terminfo для изменения формы курсора. Однако некоторые терминалы отображают один и тот же курсор в обоих режимах. Идея Xterm о менее видимом курсоре состоит в том, чтобы заставить его мигать (и это должно быть включено с помощью -bcаргумента командной строки или cursorBlinkресурса).
zle-keymap-select () {
case $KEYMAP in
vicmd) print -rn -- $terminfo[cvvis];; # block cursor
viins|main) print -rn -- $terminfo[cnorm];; # less visible cursor
esac
}
С некоторыми терминалами вы также можете изменить цвет курсора с помощью print -n '\e]12;pink\a'(по названию цвета) или print -n '\e]12;#abcdef\a'(по спецификации RGB). Эти последовательности описаны в документации xterm, в ctlseqsфайле; современные эмуляторы терминала обычно эмулируют xterm, хотя они могут не поддерживать все его функции.
CTRL+Cв режиме vi-command, запрос будет сброшен, но при этом вы увидите, что вы находитесь в командном режиме, когда вы действительно находитесь в режиме вставки.zle-line-initвсегда следует менять индикатор на режим вставки. По какой-то причине$KEYMAPне обновляется должным образом при вызове zle-line-init.