Как использовать цветовые коды escape-последовательности ANSI для PSReadLineOption v2 в консоли Powershell?

Я пытаюсь использовать встроенный модуль PSReadLine (v2) Powershell (v5.1) для настройки цветов текста консоли Powershell.

Предыдущие версии PSReadLine позволяли вам просто указать -Background а также -Foreground параметры для любого данного типа токена. Но это уже не так. PSReadLine v2 представил использование управляющих кодов ANSI для определения поведения цвета. Я понимаю, что это обеспечивает большую гибкость, но это чрезвычайно сложно для достижения цели. Документация по этим кодам повсеместна и сильно зависит от реализации хост-приложения, что делает поиск ответов намного сложнее.

Простая окраска текста переднего плана (относительно) проста с чем-то вроде:

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

Тем не менее, все становится сложнее, если вы хотите представить украшения, такие как жирный шрифт, подчеркивание или особый интерес для меня, цвет фона и их комбинации.

Значение по умолчанию для SelectionColor (который выделяет выделенный текст другим цветом фона) `e[35;43m, Но этого большого намека все еще недостаточно, чтобы раскрыть синтаксические секреты, которые я ищу.

Документ для Set-PSReadLineOption очень безоговорочно гласит:

Вы можете указать другие escape-последовательности, включая:
256 цветов
24-битный цвет
Передний план, фон или оба
Обратный, жирный

... но не дает примеров.

Как бы вы указали escape-код, определяющий цвет переднего плана и фона, или любую другую комбинацию цветов и цветных украшений?

Источники, которые я нашел полезными при изучении этих escape-кодов: http://jafrog.com/2013/11/23/colors-in-terminal.html https://en.wikipedia.org/wiki/ANSI_escape_code

Но я не смог полностью обернуть голову вокруг всего этого.

Решено:

Благодаря @LotPings. Я ошибочно полагал, что escape-коды могут иметь только заданное количество опций. По правде говоря, я могу указать столько, сколько захочу (или столько, сколько мне нужно для достижения моих целей). Так, например:

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

... приведет к слову test, который подчеркнут розовым передним планом и фиолетовым фоном. Чтобы сломать это:

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

Другие вопросы по тегам