Как использовать цветовые коды 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