আসুন এই বিন্যাস সহ প্রম্পট সংজ্ঞা দিন:
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
- উপরে বাম: নীল বর্তমান ডিরেক্টরি।
- ডানদিকে: গ্রিন গিট শাখা।
- নীচে বাম:
#
মূল, %
যদি না; সাফল্যের উপর সবুজ, ত্রুটি লাল।
- নীচে ডান: হলুদ বর্তমান সময়।
আপনি মাল্টি-লাইন প্রম্পটে অতিরিক্ত বিবরণ সন্ধান করতে পারেন : এই টুকরোটিতে অনুপস্থিত উপাদান এবং সম্পূর্ণ কোড ।