왼쪽 및 오른쪽 프롬프트가 한 행에 있고 배경색이 전체 행에 걸쳐 있기를 원합니다. 사용자 입력은 다음 줄에 있어야 합니다.
hostname | ~/path/to/cwd branch master | insert mode
$ _
개행의 경우 $'\n'
in을 사용해 보았지만 PS1
이로 인해 두 번째 줄에 올바른 팁이 그려졌습니다.
전체 줄을 색칠하기 위해 닫지 않고 합류하려고 했는데 왼쪽 프롬프트의 마지막 문자 이후에 배경 색칠이 멈춥니다 %K{green}
.PS1
이 메시지를 어떻게 구현하나요?
답변1
다음을 수행할 수 있습니다.
branch=master mode=insert
setopt promptsubst
left='%m | %~'
PS1='%K{green}$left${(l,COLUMNS-${#${(%)left}},)${${:-$branch | $mode}//[%]/%%}}%k$ '
왼쪽 패드 연산자를 사용하여 ${(l,length,)...}
프롬프트의 오른쪽에서 $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
이로 인해 모드를 전환할 때 프롬프트가 다시 그려집니다.
모드 의 경우 삽입 모드로 들어가는 모든 경우(삽입 모드( / , / , / , / ) 또는 덮어쓰기( )) vi
를 고려해야 하며 , 찾은 대로 특수 후크 위젯을 사용할 수 있습니다 .a
A
i
I
c
C
s
S
R
zle-keymap-select
zle -N zle-keymap-select update-mode
나는 당신을 다시 쓸 것입니다마지막 해결책처럼:
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
이렇게 하면 불필요한 분기 및 프롬프트 다시 그리기의 수가 최소화되고 창 크기가 조정되는 경우를 포함하여 모든 상황에서 쉘이 프롬프트를 올바르게 그릴 수 있습니다.
스크린샷: