आइए इस लेआउट के साथ संकेत दें:
top_left top_right
bottom_left bottom_right
ऐसा करने के लिए, हमें एक फ़ंक्शन की आवश्यकता होगी जो हमें बताता है कि किसी वर्ण को मुद्रित होने पर कितने अक्षर लगते हैं।
# Usage: prompt-length TEXT [COLUMNS]
#
# If you run `print -P TEXT`, how many characters will be printed
# on the last line?
#
# Or, equivalently, if you set PROMPT=TEXT with prompt_subst
# option unset, on which column will the cursor be?
#
# The second argument specifies terminal width. Defaults to the
# real terminal width.
#
# Assumes that `%{%}` and `%G` don't lie.
#
# Examples:
#
# prompt-length '' => 0
# prompt-length 'abc' => 3
# prompt-length $'abc\nxy' => 2
# prompt-length '❎' => 2
# prompt-length $'\t' => 8
# prompt-length $'\u274E' => 2
# prompt-length '%F{red}abc' => 3
# prompt-length $'%{a\b%Gb%}' => 1
# prompt-length '%D' => 8
# prompt-length '%1(l..ab)' => 2
# prompt-length '%(!.a.)' => 1 if root, 0 if not
function prompt-length() {
emulate -L zsh
local COLUMNS=${2:-$COLUMNS}
local -i x y=$#1 m
if (( y )); then
while (( ${${(%):-$1%$y(l.1.0)}[-1]} )); do
x=y
(( y *= 2 ));
done
local xy
while (( y > x + 1 )); do
m=$(( x + (y - x) / 2 ))
typeset ${${(%):-$1%$m(l.x.y)}[-1]}=$m
done
fi
echo $x
}
हमें एक और फ़ंक्शन की आवश्यकता होगी जो दो तर्कों को लेता है और स्क्रीन के विरोधी पक्षों पर इन तर्कों के साथ एक पूर्ण जुर्माना प्रिंट करता है।
# Usage: fill-line LEFT RIGHT
#
# Prints LEFT<spaces>RIGHT with enough spaces in the middle
# to fill a terminal line.
function fill-line() {
emulate -L zsh
local left_len=$(prompt-length $1)
local right_len=$(prompt-length $2 9999)
local pad_len=$((COLUMNS - left_len - right_len - ${ZLE_RPROMPT_INDENT:-1}))
if (( pad_len < 1 )); then
# Not enough space for the right part. Drop it.
echo -E - ${1}
else
local pad=${(pl.$pad_len.. .)} # pad_len spaces
echo -E - ${1}${pad}${2}
fi
}
अंत में हम एक फंक्शन को परिभाषित कर सकते हैं जो सेट करता है PROMPTऔर RPROMPT, ZSH को हर प्रॉम्प्ट से पहले कॉल करने का निर्देश देता है, और उचित प्रॉम्प्ट विस्तार विकल्प सेट करता है:
# Sets PROMPT and RPROMPT.
#
# Requires: prompt_percent and no_prompt_subst.
function set-prompt() {
emulate -L zsh
local git_branch="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)"
git_branch=${${git_branch//\%/%%}/\\/\\\\\\} # escape '%' and '\'
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'
PROMPT="$(fill-line "$top_left" "$top_right")"$'\n'$bottom_left
RPROMPT=$bottom_right
}
autoload -Uz add-zsh-hook
add-zsh-hook precmd set-prompt
setopt noprompt{bang,subst} prompt{cr,percent,sp}
यह निम्नलिखित संकेत पैदा करता है:
~/foo/bar master
% █ 10:51
- शीर्ष बाएँ: ब्लू वर्तमान निर्देशिका।
- शीर्ष दायां: ग्रीन गिट शाखा।
- नीचे बाएं:
#यदि जड़, %यदि नहीं; सफलता पर हरा, त्रुटि पर लाल।
- नीचे सही: पीला वर्तमान समय।
आप मल्टी-लाइन प्रॉम्प्ट में अतिरिक्त विवरण पा सकते हैं : इस ग्रिस्ट में लापता घटक और पूर्ण कोड ।