在 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

相关内容