Как использовать цветовые коды escape-последовательности ANSI для PSReadLineOption v2 в консоли Powershell? - PullRequest
1 голос
/ 20 июня 2019

Я пытаюсь использовать встроенный модуль 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#SGR_parameters

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

Решено:

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

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

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

enter image description here

1 Ответ

1 голос
/ 20 июня 2019
  • Используйте 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

...