
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
に対して短縮されます。PROMPT
RPROMPT
デモ
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 行が設定されます。