这是一个延续我的 以前的问题。我目前有以下内容~/.zsh.d/functions.sh
function zle-line-init zle-keymap-select {
psvar[1]="${${KEYMAP/vicmd/}/(main|viins)/-- INSERT --}"
zle reset-prompt
}
precmd() {
psvar[2]=()
vcs_info
[[ -n $vcs_info_msg_0_ ]] && psvar[2]="$vcs_info_msg_0_"
}
以及我的相关部分~/.zshrc
if [ -d ~/.zsh.d ]; then
for i in ~/.zsh.d/*; do
if [ -r $i ]; then
source $i
fi
done
unset i
fi
zle -N zle-line-init
zle -N zle-keymap-select
autoload -Uz colors && colors
autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' formats '[%b]'
zstyle ':vcs_info:*' branchformats '[%b|%r]'
zstyle ':vcs_info:*' actionformats '[%b|%a]'
# 063 is a blue
# vimode implentation
psvar[1]='-- INSERT --'
local down=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
local mode="%F{063}%1 %(1v.%1v.)%f"
local up=$terminfo[rc]
local vimode=$down$mode$up
# current working directory as blue
local cwd='%F{063}%1~%f'
# display git branch if git repo
local git='%(2v.%F{099}%2v%f.)'
# if root then red # else blue %
local prompt_char='%(!.%F{red}%#%f.%F{063}%#%f)'
PS1=$'%{$vimode%} $cwd $git $prompt_char '
RPS1='%m'
preexec () { print -rn -- $terminfo[el]; }
-- INSERT --
这工作正常,除了第一次启动 shell 时它不会显示,之后它按预期工作。
欢迎其他改进建议。
更新我决定解决这个问题,尽管我仍然不知道为什么它会起作用。现在我已经设置psvar[1]
为-- INSERT --
开箱即用,因为我知道它将在开始时插入。但这感觉不是一个合适的解决方案。
答案1
在我的黑客中,我似乎通过设置修复了它
psvar[1]='-- INSERT --'
在用我的 vimode 做任何其他事情之前...我不确定我对我的解决方案是否 100% 满意,但它起作用了。