Zshプロンプトは、次の行のユーザー入力で幅全体を入力します。

Zshプロンプトは、次の行のユーザー入力で幅全体を入力します。

左右のプロンプトが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考慮する必要があり、見つけたように特別なフックウィジェットを使用できます。aAiIcCsSRzle-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

これにより、不要な分岐やプロンプトの再描画の数が最小限に抑えられ、ウィンドウのサイズが変更されるなど、あらゆる状況でシェルがプロンプトを正しく描画できます。

スクリーンショット:

ここに画像の説明を入力してください。

おすすめ記事