在 zsh 中裁剪長字串

在 zsh 中裁剪長字串

我想將提示設為類似 的內容%1~ \#,它將顯示當前目錄,而不顯示完整路徑(後跟%#)。但是,如果目錄名稱很長,我不需要全部。如何將其限制為 8 個字元? zsh 中是否有任何內建工具可以實現此目的,或者必須使用某種外部工具?

答案1

若要截斷目錄名稱,請嘗試:

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

範例:目錄Wow longdirnameislong現在將在提示中顯示為:

Wow lo.. % 

man 1 zshmisc說:

提示中的條件子串

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

指定提示字串其餘部分的截斷行為。第三種已棄用的形式相當於%xstringx,即 x 可以是<>。該字串將顯示在任何字串的截斷部分的位置;請注意,這不會立即擴展。

在第三種形式中,數字參數可能緊接著出現在 後面[,它指定可以在提示中顯示的各種字串的最大允許長度。在前兩種形式中,該數字參數可以為負數,在這種情況下,透過從當前提示行上剩餘的字元位置數減去數字參數的絕對值來確定截斷長度。如果這導致長度為零或負,則使用長度 1。換句話說,負參數安排截斷後在右邊距(RPROMPT 的左邊距)之前至少保留 n 個字元。

< 截斷在字串左側的形式 和>截斷在字串右側的形式。例如,如果目前目錄是/home/pike,則提示符號%8<..<%/將擴展為..e/pike。在此字串中,終止字符(<>]),或實際上任何字符,都可以由前面的\;引起來。但是,請注意,在使用 print -P 時,必須將其加倍,因為除了雙引號字串刪除的任何反斜線之外,該字串還受到標準列印處理的影響:因此,最壞的情況是print -P "%<\\\\<<..."

如果字串比指定的截斷長度長,它將完整顯示,完全替換截斷的字串。

提示字串中要截斷的部分運行到字串的末尾,或者運行到構造的下一個封閉組的末尾%(,或者運行到在同一分組級別遇到的下一個截斷(即 a 內的截斷%(是單獨的) ,以先到者為準。特別是,參數為零的截斷(例如,%<<)標記要截斷的字串範圍的末尾,同時從那裡開始關閉截斷。例如,提示符號%10<...<%~%<<%#將列印目前目錄的截斷表示,後面跟著%#,然後是空格。如果沒有%<<,這兩個字元將包含在要截斷的字串中。請注意,%-0<<不等於,%<<但指定提示在右邊距處被截斷。

截斷僅適用於提示的每一行,由嵌入的換行符(如果有)分隔。如果截斷後提示符的任何行的總長度大於終端寬度,或者要截斷的部分包含嵌入的換行符,則截斷行為是未定義的,並且可能會在 shell 的未來版本中變更。%-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

相關內容