zsh の右プロンプトを2行にする


RPROMPT には改行を入れられない

zsh で右プロンプトに情報を表示するときには RPROMPT 環境変数を使います。
しかし、RPROMPT には改行を含めることができません。左プロンプトは行けるのに……。

# 2行表示される
PROMPT=$'top left\nbottom left %# '
# 何も表示されない
RPROMPT=$'top right \nbottom right'

解決方法

プロンプトを表示する直前に、自分で print してあげればいいです。

# プロンプトの表示直前に毎回実行される
precmd() {
  local left="top left"
  local right="top right "
  # $left と $right の間をスペースで埋めて表示
  print -P $left${(r:($COLUMNS-${#left}-${#right}):: :)}$right
}
PROMPT=$'bottom left %# '
RPROMPT=$'bottom right'

実際の設定はこのようにしています。

autoload -Uz vcs_info
zstyle ':vcs_info:*' formats '[%b]'
zstyle ':vcs_info:*' actionformats '[%b|%a]'
precmd () {
  # 1行あける
  print
  # カレントディレクトリ
  local left=' %{\e[38;5;2m%}(%~)%{\e[m%}'
  # バージョン管理されてた場合、ブランチ名
  vcs_info
  local right="%{\e[38;5;32m%}${vcs_info_msg_0_}%{\e[m%}"
  # スペースの長さを計算
  # テキストを装飾する場合、エスケープシーケンスをカウントしないようにします
  local invisible='%([BSUbfksu]|([FK]|){*})'
  local leftwidth=${#${(S%%)left//$~invisible/}}
  local rightwidth=${#${(S%%)right//$~invisible/}}
  local padwidth=$(($COLUMNS - ($leftwidth + $rightwidth) % $COLUMNS))

  print -P $left${(r:$padwidth:: :)}$right
}
# ユーザ名@ホスト名
PROMPT='%n@%m %# '
# 現在時刻
RPROMPT=$'%{\e[38;5;251m%}%D{%b %d}, %*%{\e[m%}'
TMOUT=1
TRAPALRM() {
  zle reset-prompt
}

見やすい✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

参考