zsh
の現在の(左)プロンプトは次のとおりです
Prompt="%F{106}%22<…<%3~%f%(?..%{$fg[red]%} %?%{$reset_color%})%(1j.%{$fg[cyan]%} %j%{$reset_color%}.)%# "
%22<…<
は、プロンプトが22文字を超えるとプロンプトが切り捨てられることを指定します。これは、プロンプトが水平方向のスペースを取りすぎないようにするためです。
ただし、非常に幅の広い端末を使用している場合は、プロンプトに22文字以上を費やした可能性があり、それでも十分な水平スペースを確保できたはずです。
だから、私はそれが最大の幅を持つようにプロンプトをフォーマットしたいと思いますパーセンテージ完全な端末の幅(例えば20%)の=。それを行う方法はありますか?
理想的には、端子の幅が変わった場合、プロンプトの幅を再計算する必要があります。
(重要な場合:シェルは通常MacOSではtmux
の中にあります)
これが結局私が書いたものです。
# this variable can be changed later to change the fraction of the line
export Prompt_PERCENT_OF_LINE=20
# make a function, so that it can be evaluated repeatedly
function myPromptWidth() {
echo $(( ${COLUMNS:-80} * Prompt_PERCENT_OF_LINE / 100 ))
}
# for some reason you can't put a function right in Prompt, so make an
# intermediary variable
width_part='$(myPromptWidth)'
# use ${} to evaluate the variable containing function
Prompt="%F{106}%${width_part}<…<%3~%f%(?..%{$fg[red]%} %?%{$reset_color%})%(1j.%{$fg[cyan]%} %j%{$reset_color%}.)%# "
これにより、端末のサイズ変更時にすぐに幅が再計算されます。
Zshのプロンプト拡張動作はman zshmisc
で定義されています。プロンプトの長さのカスタム値の設定に関して、それは言う:
%<string<
%>string>
%[xstring]
Specifies truncation behaviour for the remainder of the Prompt
string. The third, deprecated, form is equivalent to
`%xstringx', i.e. x may be `<' or `>'. The string will be dis‐
played in place of the truncated portion of any string; note
this does not undergo Prompt expansion.
The numeric argument, which in the third form may appear immedi‐
ately after the `[', specifies the maximum permitted length of
the various strings that can be displayed in the Prompt. In the
first two forms, this numeric argument may be negative, in which
case the truncation length is determined by subtracting the
absolute value of the numeric argument from the number of char‐
acter positions remaining on the current Prompt line. If this
results in a zero or negative length, a length of 1 is used. In
other words, a negative argument arranges that after truncation
at least n characters remain before the right margin (left mar‐
gin for RPROMPT).
The forms with `<' truncate at the left of the string, and the
forms with `>' truncate at the right of the string. For exam‐
ple, if the current directory is `/home/pike', the Prompt
`%8<..<%/' will expand to `..e/pike'. In this string, the ter‐
minating character (`<', `>' or `]'), or in fact any character,
may be quoted by a preceding `\'; note when using print -P, how‐
ever, that this must be doubled as the string is also subject to
standard print processing, in addition to any backslashes
removed by a double quoted string: the worst case is therefore
`print -P "%<\\\\<<..."'.
If the string is longer than the specified truncation length, it
will appear in full, completely replacing the truncated string.
The part of the Prompt string to be truncated runs to the end of
the string, or to the end of the next enclosing group of the
`%(' construct, or to the next truncation encountered at the
same grouping level (i.e. truncations inside a `%(' are sepa‐
rate), which ever comes first. In particular, a truncation with
argument zero (e.g., `%<<') marks the end of the range of the
string to be truncated while turning off truncation from there
on. For example, the Prompt `%10<...<%~%<<%# ' will print a
truncated representation of the current directory, followed by a
`%' or `#', followed by a space. Without the `%<<', those two
characters would be included in the string to be truncated.
Note that `%-0<<' is not equivalent to `%<<' but specifies that
the Prompt is truncated at the right margin.
Truncation applies only within each individual line of the
Prompt, as delimited by embedded newlines (if any). If the
total length of any line of the Prompt after truncation is
greater than the terminal width, or if the part to be truncated
contains embedded newlines, truncation behavior is undefined and
may change in a future version of the Shell. Use
`%-n(l.true-text.false-text)' to remove parts of the Prompt when
the available space is less than n.
そこから推測できます
Prompt="%/ "
は作業ディレクトリを提供しますPrompt='%10<..<%/ '
は作業ディレクトリを提供します-作業ディレクトリ文字列が10文字より長い場合、左側の端で切り捨てられ、切り捨てが発生した場所に..
パターンが表示されます(トリミングされた値)端子幅は$COLUMNS
で取得できるため、端子幅の25%に制限されたプロンプトが必要な場合は、10
を変数に置き換えます。
width=$(($COLUMNS / 4))
つまり.
Prompt="%${width}<..<%/ %% "