長さが端末の幅に比例するようにzshプロンプトを設定する方法

長さが端末の幅に比例するようにzshプロンプトを設定する方法

私のzsh現在の(左)プロンプトは次のとおりです

PROMPT="%F{106}%22<…<%3~%f%(?..%{$fg[red]%} %?%{$reset_color%})%(1j.%{$fg[cyan]%} %j%{$reset_color%}.)%# "

指定された%22<…<プロンプトが22文字を超えると切り捨てられます。これは、プロンプトがあまりにも多くの水平スペースを占有したくないからです。

ただし、端末が非常に広い場合は、プロンプトに22文字以上を使用できますが、まだ作業に十分な水平スペースがあります。

そのため、最大幅が次のようにプロンプ​​ト形式を指定したいと思います。パーセント全端末幅(例:20%)。これを行う方法はありますか?

理想的には、端末の幅が変更された場合は、プロンプトの幅を再計算する必要があります。

(場合:tmuxMacOSでは、シェルは通常内部にあります)

ベストアンサー1

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}<..<%/ %% "

おすすめ記事