LoginSignup
27
24

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-30

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

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

参考

27
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
24