【问题标题】:How to use ANSI escape sequence color codes for PSReadLineOption v2 in Powershell console?如何在 Powershell 控制台中为 PSReadLineOption v2 使用 ANSI 转义序列颜色代码?
【发布时间】:2019-06-20 05:57:03
【问题描述】:

我正在尝试使用 Powershell (v5.1) 的内置 PSReadLine (v2) 模块来自定义 Powershell 控制台文本颜色。

以前版本的 PSReadLine 允许您为任何给定的令牌类型简单地指定 -Background-Foreground 参数。但情况已不再如此。 PSReadLine v2 引入了使用 ANSI 转义码来定义颜色行为。我认为这可以提供更大的灵活性,但它要完成的任务非常复杂。关于这些代码的文档到处都是,并且高度依赖于宿主应用程序的实现,这使得找到答案变得更加困难。

简单地为文本前景着色(相对)很容易,例如:

set-psreadlineoption -colors @{
    CommandColor = "`e[93m"
    CommentColor = "`e[32m"
}

但是,如果您想引入装饰,例如粗体、下划线或我特别感兴趣的背景颜色和这些的组合,事情就会变得更加复杂。

SelectionColor(用不同的背景颜色突出显示选定的文本)的默认值为`e[35;43m。但是这个大提示仍然不足以泄露我正在寻找的语法秘密。

doc for Set-PSReadLineOption 非常实事求是地声明:

您可以指定其他转义序列,包括:
256色
24 位颜色
前景、背景或两者
反转,粗体

...但没有提供示例。

您将如何指定定义前景色和背景色或任何其他颜色和彩色装饰组合的转义码?

我发现有助于了解这些转义码的来源是: http://jafrog.com/2013/11/23/colors-in-terminal.html https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters

但我无法完全理解这些。

已解决:

感谢@LotPings。我错误地假设转义码只能给他们一定数量的选项。事实上,我可以指定任意数量(或实现目标所需的数量)。比如:

$e = [char]0x1b
"$e[38;2;255;128;128;48;2;128;0;255;4mtest$e[0m"

... 将产生单词test,带有粉红色前景和紫色背景的下划线。分解:

【问题讨论】:

    标签: powershell colors psreadline


    【解决方案1】:
    • 使用Get-PSReadLineOption 查看当前设置
    • 某些属性在 256/24 位颜色模式下没有意义。
    • Windows 控制台不支持反向(也在 WSL 中)

    Jafrog 博客中的代码翻译成 PowerShell

    ## Q:\Test\2019\06\20\SO_56679782.ps1
    
    Get-PSReadLineOption
    
    $Esc=[char]0x1b 
    
    'The following command should print “hello” in bright red underscore text:'
    "$Esc[91;4mHello$Esc[0m"
    
    ForEach($code in 30..37){
    "{0}[{1}mEsc[{1}m{0}[0m  {0}[{1};1mEsc[{1};1m{0}[0m  {0}[{1};3mEsc[{1};3m{0}[0m  {0}[{1};4mEsc[{1};4m{0}[0m  {0}[{2}mEsc[{2}m{0}[0m" -f $Esc,$code,($code+60)
    }
    pause
    foreach($code in 0..255){"{0}[38;5;{1}mESC[38;5;{1}m{0}[0m" -f $Esc,$code}
    

    Ansi Esc[ sequence (CSI)
                  Foreground     Background
    No Color     normal bright  normal bright
    0  black       30     90      40    100
    1  red         31     91      41    101
    2  green       32     92      42    102
    3  yellow      33     93      43    103
    4  blue        34     94      44    104
    5  violet      35     95      45    105
    6  turqoise    36     96      46    106
    7  grey        37     97      47    107
    

    【讨论】:

    • 谢谢。恐怕我仍然不明白指定前景色和背景色背后的逻辑。例如,在你上一个截图中,为什么Esc[40;1m 的前景色是黄色的?这仅仅是因为 Powershell 控制台将粗体 (;1) 呈现为黄色,甚至不呈现斜体 (;3) 吗?实际上有没有一种方法可以同时指定前景色和背景色?我也无法解码为什么默认的SelectionColor (Esc[35;43) 会按原样呈现。
    • 黄色可能来自我的双色powershell提示功能,在pwsh中没有这个功能是正常的。要一次性指定前景/背景,请像 selectioncolor 一样将它们与分号结合起来。用于亮绿色背景上的亮红色$Esc=[char]0x1b;"$Esc[91;102mEsc[91;102m$Esc[0m"
    • 我明白了。我正在尝试对此进行测试,因为我发现我的部分困惑在于 set-psreadlineoption 显然根本不起作用。如果我加载控制台,输入get-psreadlineoption,然后输入set-psreadlineoption -colors @{stringcolor='red'},然后再次输入get-psreadlineoptionstringcolor 的值不会改变,字符串继续使用默认颜色。我用错了吗?
    • FWIW,我现在理解语法了。我错误地假设每个转义字符只能有一组选项,但我现在看到,例如,$e=[char]0x1b; "$e[91;103;4mtest$e[0m" 会导致带有红色前景、绿色背景和下划线的单词 test。现在我只需要弄清楚如何获取set-psreadlineoption 来保存我的更改。
    • 啊哈,我用错了set-psreadlineoption -colorscolors 哈希表使用 string 之类的名称,而不是 stringcolor,即使 get-psreadlineoption 将它们显示为 stringcolor
    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2023-04-07
    • 2019-01-11
    • 2021-01-02
    • 2011-09-11
    相关资源
    最近更新 更多