2

我正在尝试使用 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,带有粉红色前景和紫色背景下划线。分解它:

在此处输入图像描述

4

1 回答 1

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

在此处输入图像描述

于 2019-06-20T11:29:38.063 回答