如何在Powershell控制台中为PSReadLineOption v2使用ANSI转义序列颜色代码?
我正在尝试使用Powershell(v5.1)的内置PSReadLine(v2)模块自定义Powershell控制台文本颜色 PSReadLine的早期版本允许您为任何给定的令牌类型简单地指定如何在Powershell控制台中为PSReadLineOption v2使用ANSI转义序列颜色代码?,powershell,colors,psreadline,Powershell,Colors,Psreadline,我正在尝试使用Powershell(v5.1)的内置PSReadLine(v2)模块自定义Powershell控制台文本颜色 PSReadLine的早期版本允许您为任何给定的令牌类型简单地指定-Background和-Foreground参数。但情况已不再如此。PSReadLineV2介绍了使用ANSI转义码来定义颜色行为。我认为这允许更大的灵活性,但对于它的目的来说,这是极其复杂的。关于这些代码的文档随处可见,并且高度依赖于主机应用程序的实现,这使得找到答案变得更加困难 简单地给文本前景上色(
-Background
和-Foreground
参数。但情况已不再如此。PSReadLineV2介绍了使用ANSI转义码来定义颜色行为。我认为这允许更大的灵活性,但对于它的目的来说,这是极其复杂的。关于这些代码的文档随处可见,并且高度依赖于主机应用程序的实现,这使得找到答案变得更加困难
简单地给文本前景上色(相对而言)比较容易:
set-psreadlineoption -colors @{
CommandColor = "`e[93m"
CommentColor = "`e[32m"
}
然而,如果你想引入装饰,比如粗体、下划线,或者我特别感兴趣的,背景色和它们的组合,事情会变得更复杂
SelectionColor
(用不同的背景色突出显示所选文本)的默认值是`e[35;43m
。但这个大提示仍然不足以泄露我正在搜索的语法秘密
事实上是这样的:
您可以指定其他转义序列,包括:256色
24位颜色
前景、背景或两者皆有
反向,粗体 …但没有提供示例 您将如何指定一个转义码来定义前景和背景色,或者任何其他颜色和彩色装饰的组合 我发现有助于了解这些转义码的来源有: 但我还没能完全理解这些 已解决: 多亏了@LotPings。我错误地认为转义码只能有一定数量的选项。事实上,我可以指定任意数量的选项(或实现目标所需的数量)。例如:
$e = [char]0x1b
"$e[38;2;255;128;128;48;2;128;0;255;4mtest$e[0m"
…将生成单词test
,该单词的下划线为粉色前景和紫色背景。要分解它,请执行以下操作:
- 使用
查看当前设置Get PSReadLineOption
- 某些属性在256/24位颜色模式下没有意义
- Windows控制台不支持反向(也在WSL中)
## 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}
谢谢。恐怕我仍然不理解在指定前景色和背景色的同时指定前景色的逻辑。例如,在您的上一个屏幕截图中,
Esc[40;1m
为什么前景色是黄色的?这是否仅仅是因为Powershell控制台呈现粗体(;1
)黄色,甚至不呈现斜体(;3
)?实际上有办法指定前景色和背景色吗?我也无法解释为什么默认的选择颜色(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 psreadlineoption
,stringcolor
的值没有改变,字符串继续使用默认颜色。我用错了吗?FWIW,我现在理解了语法。我错误地假设每个转义字符只能有一组选项,但我现在看到,例如, $e=[char]0x1b;“$e[91;103;4mtest$e[0m”
将导致单词测试的前景色为红色,背景为绿色,并带有下划线。现在我只需要弄清楚如何获取设置psreadlineoption
来保存我的更改。啊哈,我使用的设置psreadlineoption-colors
不正确。colors
哈希表使用了string
等名称,而不是string颜色
,即使get psreadlineoption
将它们显示为stringcolor
。
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