Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

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

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

1.png

解決方法

プロンプトを表示する直前に、自分で 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'

2.png

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

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
}

3.png

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

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away