左右のプロンプトが1行にあり、背景色が行全体にわたっていることを望みます。ユーザー入力は次の行にする必要があります。
hostname | ~/path/to/cwd branch master | insert mode
$ _
改行の場合は$'\n'
inを使ってみましたが、PS1
これは2行目に正しいヒントを描きました。
行全体を着色するために閉じずに参加しようとしましたが、左のプロンプトの最後の文字の後に背景の着色が停止します%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
これにより、不要な分岐やプロンプトの再描画の数が最小限に抑えられ、ウィンドウのサイズが変更されるなど、あらゆる状況でシェルがプロンプトを正しく描画できます。
スクリーンショット: