如何在Powershell控制台中使用ANSI转义序列颜色代码来设置PSReadLineOption v2?

3
我试图使用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。但这个大提示还不足以透露我正在寻找的语法秘密。 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被下划线标记,前景色为粉色,背景色为紫色。具体解释如下:

enter image description here

原始答案:Original Answer
1个回答

2
  • 使用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}

enter image description here

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

enter image description here


谢谢。很抱歉,我仍然不理解在指定背景颜色的同时为什么要指定前景颜色的逻辑。例如,在您最后的屏幕截图中,为什么Esc[40;1m有一个黄色的前景色呢?这只是因为Powershell控制台将粗体(;1)渲染为黄色,而不渲染斜体(;3)吗?实际上是否有一种同时指定前景和背景颜色的方法?我也无法解码默认的SelectionColorEsc[35;43)为什么会以这种方式渲染。 - undefined
1
黄色可能来自于我的双色 PowerShell 提示函数,在 pwsh 中,如果没有这个函数,它是正常的。要一次性指定前景和背景颜色,可以使用分号将它们组合起来,就像 selectioncolor 一样。对于亮红色在亮绿色背景上的显示,可以使用 $Esc=[char]0x1b;"$Esc[91;102mEsc[91;102m$Esc[0m" - user6811411
我明白了。我正在尝试测试一下,但是我发现我困惑的部分在于 set-psreadlineoption 似乎根本不起作用。如果我加载控制台,输入 get-psreadlineoption,然后输入 set-psreadlineoption -colors @{stringcolor='red'},再次输入 get-psreadlineoptionstringcolor 的值并没有改变,字符串仍然使用默认颜色。我使用方法有问题吗? - undefined
1
就我所知,我现在理解了语法。我错误地以为每个转义字符只能有一组固定的选项,但现在我明白了,例如,$e=[char]0x1b; "$e[91;103;4mtest$e[0m"会导致单词“test”具有红色前景、绿色背景和下划线。现在我只需要弄清楚如何让set-psreadlineoption保存我的更改。 - undefined
啊哈,我之前对set-psreadlineoption -colors的使用有误。colors哈希表使用的是像string而不是stringcolor这样的名称,尽管get-psreadlineoption将它们显示为stringcolor - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接