zsh での複数行 RPROMPT

zsh での複数行 RPROMPT

zsh では複数行のプロンプトを定義できることは知っています:

PROMPT='
test
→ '

しかし、なぜ複数行の右プロンプトを定義できないのか疑問に思いました。試してみました:

RPROMPT='
test
still test '

しかし何も表示されません。これは可能ですか?

答え1

precmdプロンプトが表示される前に毎回実行される関数を使用して、プロンプトの上に追加の行を印刷することで、目的の効果(私の推測が正しければ)を得ることができます。

例えばこのコードを使用します

precmd() {
  LEFT="The time is"
  RIGHT="$(date) "
  RIGHTWIDTH=$(($COLUMNS-${#LEFT}))
  print $LEFT${(l:$RIGHTWIDTH::.:)RIGHT}
}
PS1="foo > "
RPS1="bar"

説明

  • $LEFT$RIGHT左側と右側の文字列をそれぞれ保持します。構文を使用してコマンドの出力を使用できます$(...)
  • $RIGHTWIDTH現在の端末幅の差(翻訳パラメータ内の$COLUMNS)と左の文字列の幅。$((...))数式用です
  • 魔法は で発生します${(l:$RIGHTWIDTH::.:)RIGHT}。ここで、パラメータはの長さまでドットで$RIGHT左側に埋め込まれます ( l) (スペースが必要な場合は最後を省略します) 。:.:$RIGHTWIDTH
  • 追加の行を印刷します。さらに行が必要な場合は、コマンドを繰り返します。
  • PS1およびは、およびRPS1に対して短縮されます。PROMPTRPROMPT

デモ

The time is............................................Fri, Sep 18, 2015  8:20:22 PM 
foo > _                                                                          bar

答え2

どうやら、複数行の右プロンプトを設定することは不可能ではないようです。これですそれは管理されています。しかし、私は次のように管理していると思います。

 local top_left='%F{blue}%~%f'
  local top_right="%F{green}${git_branch}%f"
  local bottom_left='%B%F{%(?.green.red)}%#%f%b '
  local bottom_right='%F{yellow}%T%f'

  local REPLY
  fill-line "$top_left" "$top_right"
  PROMPT=$REPLY$'\n'$bottom_left
  RPROMPT=$bottom_right

PROMPT左上と右上、および左下を occupy し、RPROMPT を右下に配置することで、RPROMPT 自体には 1 行が設定されます。

関連情報