zsh で長い文字列を切り取る

zsh で長い文字列を切り取る

%1~ \#プロンプトを のように設定し、フルパス (または が続く%)なしで現在のディレクトリを表示したいと思います#。しかし、ディレクトリ名が長い場合は、すべてを表示したくありません。たとえば、8 文字に制限するにはどうすればよいでしょうか。zsh にはこれに対応する組み込み機能がありますか。それとも、外部ツールを使用する必要がありますか。

答え1

ディレクトリ名を切り捨てるには、次を試してください。

PS1='%8>..>%1~%<< %# '

例: ディレクトリはWow longdirnameislongプロンプトに次のように表示されます。

Wow lo.. % 

man 1 zshmisc言う:

プロンプト内の条件付き部分文字列

%<string< %>string> %[xstring]

プロンプト文字列の残りの部分の切り捨て動作を指定します。3 番目の非推奨の形式は と同等です。つまり、 x はまたは%xstringxになります。文字列は、任意の文字列の切り捨てられた部分の代わりに表示されます。これはプロンプト展開の対象にならないことに注意してください。<>

3 番目の形式では の直後に現れる数値引数は[、プロンプトに表示できるさまざまな文字列の最大許容長を指定します。最初の 2 つの形式では、この数値引数は負の値になる可能性があり、その場合、切り捨ての長さは、現在のプロンプト行に残っている文字位置の数から数値引数の絶対値を減算することによって決定されます。この結果が 0 または負の長さになる場合は、長さ 1 が使用されます。言い換えると、負の引数は、切り捨て後に右余白 (RPROMPT の場合は左余白) の前に少なくとも n 文字が残るようにします。

< 文字列の左側に truncate がある形式 と、>文字列の右側に truncate がある形式です。たとえば、現在のディレクトリが の場合/home/pike、プロンプト%8<..<%/は に展開されます..e/pike。この文字列では、終了文字 ( <>または])、または実際には任意の文字が、先行する\; によって引用符で囲まれる場合があります。ただし、print -P を使用する場合は、文字列も標準の印刷処理の対象となるため、これを 2 重にする必要があることに注意してください。また、二重引用符で囲まれた文字列によって削除されるバックスラッシュもあります。したがって、最悪のケースは ですprint -P "%<\\\\<<..."

文字列が指定された切り捨て長さよりも長い場合は、切り捨てられた文字列を完全に置き換えて完全な文字列が表示されます。

プロンプト文字列の切り捨てられる部分は、文字列の末尾、構造の次の囲みグループの末尾%(、または同じグループ化レベルで遭遇する次の切り捨て(つまり、 内の切り捨ては%(別々)のいずれか最初に出現する部分までです。特に、引数 0 の切り捨て(例%<<)は、切り捨てられる文字列の範囲の終わりを示し、それ以降は切り捨てがオフになります。たとえば、プロンプトは、%10<...<%~%<<%#現在のディレクトリの切り捨てられた表現を出力し、その後に または%#その後にスペースが続きます。 がない場合%<<、これらの 2 つの文字は切り捨てられる文字列に含まれます。は%-0<<と同等ではなく%<<、プロンプトが右マージンで切り捨てられることを指定することに注意してください。

切り捨ては、埋め込まれた改行文字 (ある場合) で区切られたプロンプトの各行内でのみ適用されます。切り捨て後のプロンプトの行の合計長が端末の幅より大きい場合、または切り捨てられる部分に埋め込まれた改行文字が含まれている場合、切り捨ての動作は未定義であり、シェルの将来のバージョンで変更される可能性があります。%-n(l.true-text.false-text)使用可能なスペースが n 未満の場合にプロンプ​​トの一部を削除するために使用します。

答え2

これは簡単です!

       %d
       %/     Current working directory.  If an integer follows the `%', it spec‐
              ifies a number of trailing components of the current working direc‐
              tory to show; zero means the whole path.  A negative integer speci‐
              fies leading components, i.e. %-1d specifies the first component.

       %~     As %d and %/, but if the  current  working  directory  starts  with
              $HOME,  that  part  is  replaced by a `~'. Furthermore, if it has a
              named directory as its prefix, that part is replaced by a `~'  fol‐
              lowed  by  the  name  of  the  directory, but only if the result is
              shorter than the full path; see Dynamic and Static  named  directo‐
              ries in zshexpn(1).

©man zshmisc

関連情報