如何在zsh shell中的命令之间画一条线

use*_*441 11 zsh oh-my-zsh

有谁知道如何在 zsh 中的命令之间画线?

这是 MobaXterm 的示例:

在此处输入图片说明

Ada*_*hon 17

为了PS1通过前面的水平线扩展当前提示,您可以使用以下方法之一。基本原理是相同的,但哪种效果最好取决于您的终端模拟器、区域设置和字体设置。

打印一堆减号 ( -) 或下划线 ( _) 字符

setopt promptsubst
PS1=$'${(r:$COLUMNS::_:)}'$PS1
Run Code Online (Sandbox Code Playgroud)

解释

  • promptsubst每次绘制提示时,该选项都会启用提示内的参数替换,在本例中为COLUMNS
  • 参数扩展标志r:$COLUMNS::_:用下划线(在最后两个之间给出: :)填充参数的右侧,直到$COLUMNS达到宽度。在这种情况下,没有给出参数,只打印填充。
  • 填充占据了整个终端的宽度,原件PS1自动换行到下一行。所以没有必要添加额外的换行符。这也很重要,因为在某些情况下显式换行可能会导致提示覆盖输出的最后一行。(在我的情况下,当显式换行符之前的提示文本与终端的宽度完全一样时,就会发生这种情况。)

这适用于每个终端模拟器(或控制台)、每个语言环境和每种字体。但它可能看起来不那么好:至少有减号,因为它们之间会有间隙 ( ----),下划线取决于字体。其他方法使用不同的方法来构建它。


用 zsh Prompt Escapes 下划线以获得视觉效果

setopt promptsubst
PS1=$'%U${(r:$COLUMNS:: :)}%u'$PS1
Run Code Online (Sandbox Code Playgroud)

解释:

  • %U和之间的所有内容都%u带有下划线。
  • 打印空格(将带有下划线)而不是下划线

这应该适用于大多数终端模拟器、语言环境和字体,因为它只使用下划线。一个可能的缺点是,水平线不会居中,但在输出线上非常低,就在提示的下一行之上。


使用替代字符集的线条图(又名方框图)

setopt promptsubst
PS1=$'%{\e(0%}${(r:$COLUMNS::q:)}%{\e(B%}'$PS1
Run Code Online (Sandbox Code Playgroud)

解释:

  • %{...%}告诉zsh只期望不实际移动光标的转义码
  • \e(0 切换到备用字符集
  • q 映射到备用字符集中的水平线
  • \e(B 切换回常规字符集

这也适用于大多数终端模拟器(但可能不适用于控制台)、语言环境和字体。线条的粗细似乎因字体和使用相同字体的终端模拟器而异(在我的机器上使用 Terminus 字体 urxvt 打印一条细线,而 roxterm 打印一条非常粗的线)。


使用 Unicode 字符绘制方框

setopt promptsubst
PS1=$'${(r:$COLUMNS::\u2500:)}'$PS1
Run Code Online (Sandbox Code Playgroud)

解释

  • 使用 Unicode 字符 U+2500(“Box Drawing Light Horizo​​ntal”, ?)进行填充。

这显然需要终端仿真器支持 Unicode 字符、一种具有所需字符和 UTF-8 语言环境的字体。但它也提供了几种线条样式可供选择,例如粗线 ( ?) 或双线 ( ?)。(有关更多信息,请参阅官方 Unicode Consortium 代码图表