我希望左右提示在一行中,背景颜色跨越整行。用户输入应该在下一行。
hostname | ~/path/to/cwd branch master | insert mode
$ _
Run Code Online (Sandbox Code Playgroud)
对于我尝试使用的换行符$'\n'
,PS1
这也会导致在第二行中绘制正确的提示。
为了给整行着色,我试图%K{green}
在PS1
不关闭它的情况下输入,但是在左侧提示的最后一个字符之后背景着色立即停止。
我怎样才能实现这个提示?
你可以这样做:
branch=master mode=insert
setopt promptsubst
left='%m | %~'
PS1='%K{green}$left${(l,COLUMNS-${#${(%)left}},)${${:-$branch | $mode}//[%]/%%}}%k$ '
Run Code Online (Sandbox Code Playgroud)
我们使用${(l,length,)...}
left-pad 运算符来填充提示的右侧,$COLUMNS
减去左侧显示的长度。
要$mode
在您按下 时更新Insert,您可以:
update-mode() {
case $KEYMAP in
(main)
case $ZLE_STATE in
(*insert*) mode=insert;;
(*) mode=overwrite
esac;;
(*) mode=$KEYMAP
esac
[[ $mode = $oldmode ]] || zle reset-prompt
}
overwrite-mode() {
zle ".$WIDGET"
update-mode
}
zle -N overwrite-mode
Run Code Online (Sandbox Code Playgroud)
这会导致在您切换模式时重绘提示。
对于vi
模式,您还需要考虑进入插入模式的所有情况(在插入模式(a
/ A
、i
/ I
、c
/ C
、s
/ S
)或覆盖(R
)),您可以使用zle-keymap-select
特殊的钩子小部件(就像您一样)发现):
zle -N zle-keymap-select update-mode
Run Code Online (Sandbox Code Playgroud)
我将您的最终解决方案重写为:
bindkey -v
# Bind the <Insert> key.
bindkey $terminfo[kich1] overwrite-mode
setopt promptsubst
(){ # local scope
local left right invisible leftcontent
# User name.
left+='%B%F{black}%K{green} %n '
# Current working directory.
left+='%K{yellow} %~ '
# Version control branch.
right='${vcs_info_msg_0_:+${vcs_info_msg_0_//[%]/%%} }'
# Virtualenv.
export VIRTUAL_ENV_DISABLE_PROMP=1
right+='${VIRTUAL_ENV:+venv }'
# Editing mode. $ZLE_MODE shouldn't contain %, no need to escape
ZLE_MODE=insert
right+='%K{green} $ZLE_MODE'
# closing
right+=$' %k%f%b'
# Combine left and right prompt with spacing in between.
invisible='%([BSUbfksu]|([FBK]|){*})'
leftcontent=${(S)left//$~invisible}
rightcontent=${(S)right//$~invisible}
PS1="$left\${(l,COLUMNS-\${#\${(%):-$leftcontent$rightcontent}},)}$right%{"$'\n%}$ '
}
autoload vcs_info
precmd() vcs_info
update-mode() {
case $KEYMAP in
(main)
case $ZLE_STATE in
(*insert*) ZLE_MODE=insert;;
(*) ZLE_MODE=overwrite
esac;;
(*) ZLE_MODE=$KEYMAP
esac
[[ $ZLE_MODE = $oldmode ]] || zle reset-prompt
}
overwrite-mode() {
zle ".$WIDGET"
update-mode
}
zle -N overwrite-mode
zle -N zle-keymap-select update-mode
Run Code Online (Sandbox Code Playgroud)
这将最大限度地减少不必要的分叉和提示重绘的数量,并允许 shell 在所有情况下正确绘制提示,包括调整窗口大小时。
截屏:
归档时间: |
|
查看次数: |
1884 次 |
最近记录: |