【问题标题】:Escape ANSI sequence of non-printing characters between \[ and \]在 \[ 和 \] 之间转义非打印字符的 ANSI 序列
【发布时间】:2018-09-23 11:43:41
【问题描述】:

bash manual 表示,在提示符中,任何非打印字符序列都应括起来,如:\[this\]:

\[  Begin a sequence of non-printing characters.
    This could be used to embed a terminal control sequence into the prompt.

\]  End a sequence of non-printing characters.

给定一个要包含在提示中的字符串,我如何自动转义所有 ANSI 控件/颜色代码,以使提示在所有情况下都正确显示/换行?


区分:这里我假设已经产生了一个带有ANSI控制码的字符串。

This related question 假定可以通过编辑字符串的生成函数来插入分隔符。

【问题讨论】:

    标签: bash prompt


    【解决方案1】:

    下面将用 ASCII SOH (^A) 和 STX (^B) which are equivalent to \[ and \] respectively 括起 ANSI 控制序列:

    function readline_ANSI_escape() {
      if [[ $# -ge 1 ]]; then
        echo "$*"
      else
        cat  # Read string from STDIN
      fi | \
      perl -pe 's/(?:(?<!\x1)|(?<!\\\[))(\x1b\[[0-9;]*[mG])(?!\x2|\\\])/\x1\1\x2/g'
    }
    

    像这样使用它:

    $ echo $'\e[0;1;31mRED' | readline_ANSI_escape
    

    或者:

    $ readline_ANSI_escape "$string"
    

    作为奖励,多次运行该函数不会重新转义已经转义的控制代码。

    【讨论】:

      【解决方案2】:

      不要试图自动化它。

      Bash 要求您手动添加\[...\] 的原因是shell 无法合理地知道任何给定终端将如何解释任何转义码。如果是这样,Bash 会一开始就这样做。

      例如,这里有一些其他答案无法处理的情况。在每种情况下,我的特定终端上都不会打印任何输出,但转义函数无法转义它们:

      printf '\e]1;Hello\a'  # Set window title
      printf '\e[0;2;0;0;0}' # 24-bit color
      printf '\e[13]'        # Unblank screen
      

      【讨论】:

      • 它们绝对是非打印字符序列,需要用\[..\] 包裹。我不知道什么是 ANSI、ECMA 和供应商特定
      猜你喜欢
      • 2021-07-12
      • 2020-02-16
      • 2020-09-29
      • 2011-09-27
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 2014-05-11
      • 2013-05-23
      相关资源
      最近更新 更多