246 lines
9 KiB
PowerShell
246 lines
9 KiB
PowerShell
|
|
function Add-ConsoleHelper()
|
|
{
|
|
$code = @"
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Runtime.InteropServices;
|
|
|
|
public static class ConsoleColorHelper
|
|
{
|
|
[DllImport( "kernel32.dll", SetLastError = true )]
|
|
static extern bool SetConsoleScreenBufferInfoEx(
|
|
IntPtr ConsoleOutput,
|
|
ref CONSOLE_SCREEN_BUFFER_INFO_EX ConsoleScreenBufferInfoEx
|
|
);
|
|
|
|
[DllImport( "kernel32.dll", SetLastError = true )]
|
|
static extern bool GetConsoleScreenBufferInfoEx(
|
|
IntPtr hConsoleOutput,
|
|
[In, Out] ref CONSOLE_SCREEN_BUFFER_INFO_EX ConsoleScreenBufferInfo
|
|
);
|
|
|
|
[DllImport( "kernel32.dll", SetLastError = true )]
|
|
static extern IntPtr GetStdHandle(
|
|
int nStdHandle
|
|
);
|
|
|
|
public static Color GetStandardConsoleColor( ConsoleColor color )
|
|
{
|
|
IntPtr hConsole = GetStdHandle( -11 );
|
|
|
|
CONSOLE_SCREEN_BUFFER_INFO_EX info = new CONSOLE_SCREEN_BUFFER_INFO_EX();
|
|
info.cbSize = Marshal.SizeOf( typeof( CONSOLE_SCREEN_BUFFER_INFO_EX ) );
|
|
|
|
if ( !GetConsoleScreenBufferInfoEx( hConsole, ref info ) )
|
|
{
|
|
throw Marshal.GetExceptionForHR( Marshal.GetHRForLastWin32Error() );
|
|
}
|
|
|
|
return info.ColorTable[(int)color].GetColor();
|
|
}
|
|
|
|
public static void SetStandardConsoleColor( ConsoleColor color, Color newColor )
|
|
{
|
|
IntPtr hConsole = GetStdHandle( -11 );
|
|
|
|
CONSOLE_SCREEN_BUFFER_INFO_EX info = new CONSOLE_SCREEN_BUFFER_INFO_EX();
|
|
info.cbSize = Marshal.SizeOf( typeof( CONSOLE_SCREEN_BUFFER_INFO_EX ) );
|
|
|
|
if ( !GetConsoleScreenBufferInfoEx( hConsole, ref info ) )
|
|
{
|
|
throw Marshal.GetExceptionForHR( Marshal.GetHRForLastWin32Error() );
|
|
}
|
|
|
|
// This appears to correct a bug in the implementation of
|
|
// SetConsoleScreenBufferInfoEx.
|
|
//
|
|
info.srWindow.Right++;
|
|
info.srWindow.Bottom++;
|
|
|
|
info.ColorTable[(int)color] = new COLORREF( newColor );
|
|
if ( !SetConsoleScreenBufferInfoEx( hConsole, ref info ) )
|
|
{
|
|
throw Marshal.GetExceptionForHR( Marshal.GetHRForLastWin32Error() );
|
|
}
|
|
}
|
|
|
|
[StructLayout( LayoutKind.Sequential )]
|
|
internal struct COORD
|
|
{
|
|
internal short X;
|
|
internal short Y;
|
|
}
|
|
|
|
[StructLayout( LayoutKind.Sequential )]
|
|
internal struct SMALL_RECT
|
|
{
|
|
internal ushort Left;
|
|
internal ushort Top;
|
|
internal ushort Right;
|
|
internal ushort Bottom;
|
|
}
|
|
|
|
[StructLayout( LayoutKind.Sequential )]
|
|
internal struct COLORREF
|
|
{
|
|
internal uint ColorDWORD;
|
|
|
|
internal COLORREF( Color color )
|
|
{
|
|
ColorDWORD = (uint)color.R + ( ( (uint)color.G ) << 8 ) + ( ( (uint)color.B ) << 16 );
|
|
}
|
|
|
|
internal COLORREF( uint r, uint g, uint b )
|
|
{
|
|
ColorDWORD = r + ( g << 8 ) + ( b << 16 );
|
|
}
|
|
|
|
internal Color GetColor()
|
|
{
|
|
return Color.FromArgb( (int)( 0x000000FFU & ColorDWORD ),
|
|
(int)( 0x0000FF00U & ColorDWORD ) >> 8, (int)( 0x00FF0000U & ColorDWORD ) >> 16 );
|
|
}
|
|
|
|
internal void SetColor( Color color )
|
|
{
|
|
ColorDWORD = (uint)color.R + ( ( (uint)color.G ) << 8 ) + ( ( (uint)color.B ) << 16 );
|
|
}
|
|
}
|
|
|
|
[StructLayout( LayoutKind.Sequential )]
|
|
internal struct CONSOLE_SCREEN_BUFFER_INFO_EX
|
|
{
|
|
internal int cbSize;
|
|
internal COORD dwSize;
|
|
internal COORD dwCursorPosition;
|
|
internal short wAttributes;
|
|
internal SMALL_RECT srWindow;
|
|
internal COORD dwMaximumWindowSize;
|
|
internal short wPopupAttributes;
|
|
|
|
[MarshalAs( UnmanagedType.Bool )]
|
|
internal bool bFullscreenSupported;
|
|
|
|
[MarshalAs( UnmanagedType.ByValArray, SizeConst = 16 )]
|
|
internal COLORREF[] ColorTable;
|
|
}
|
|
}
|
|
"@
|
|
|
|
Add-Type -TypeDefinition $code -ReferencedAssemblies @('System.Drawing')
|
|
}
|
|
|
|
function Get-SolarizedColorTable()
|
|
{
|
|
# This table is mostly from http://ethanschoonover.com/solarized, with the console color mapping proposed here:
|
|
# https://github.com/neilpa/cmd-colors-solarized
|
|
#
|
|
$source = @"
|
|
SOLARIZED HEX 16/8 TERMCOL XTERM/HEX L*A*B RGB HSB ConsoleColor
|
|
--------- ------- ---- ------- ----------- ---------- ----------- ----------- ------------
|
|
base03 #002b36 8/4 brblack 234 #1c1c1c 15 -12 -12 0 43 54 193 100 21 DarkGray
|
|
base02 #073642 0/4 black 235 #262626 20 -12 -12 7 54 66 192 90 26 Black
|
|
base01 #586e75 10/7 brgreen 240 #585858 45 -07 -07 88 110 117 194 25 46 DarkGreen
|
|
base00 #657b83 11/7 bryellow 241 #626262 50 -07 -07 101 123 131 195 23 51 DarkYellow
|
|
base0 #839496 12/6 brblue 244 #808080 60 -06 -03 131 148 150 186 13 59 DarkBlue
|
|
base1 #93a1a1 14/4 brcyan 245 #8a8a8a 65 -05 -02 147 161 161 180 9 63 DarkCyan
|
|
base2 #eee8d5 7/7 white 254 #e4e4e4 92 -00 10 238 232 213 44 11 93 Gray
|
|
base3 #fdf6e3 15/7 brwhite 230 #ffffd7 97 00 10 253 246 227 44 10 99 White
|
|
yellow #b58900 3/3 yellow 136 #af8700 60 10 65 181 137 0 45 100 71 Yellow
|
|
orange #cb4b16 9/3 brred 166 #d75f00 50 50 55 203 75 22 18 89 80 DarkRed
|
|
red #dc322f 1/1 red 160 #d70000 50 65 45 220 50 47 1 79 86 Red
|
|
magenta #d33682 5/5 magenta 125 #af005f 50 65 -05 211 54 130 331 74 83 Magenta
|
|
violet #6c71c4 13/5 brmagenta 61 #5f5faf 50 15 -45 108 113 196 237 45 77 DarkMagenta
|
|
blue #268bd2 4/4 blue 33 #0087ff 55 -10 -45 38 139 210 205 82 82 Blue
|
|
cyan #2aa198 6/6 cyan 37 #00afaf 60 -35 -05 42 161 152 175 74 63 Cyan
|
|
green #859900 2/2 green 64 #5f8700 60 -20 65 133 153 0 68 100 60 Green
|
|
"@
|
|
|
|
$table = @{}
|
|
$lines = $source -split "`n"
|
|
for($i = 2; $i -lt $lines.Length; $i++)
|
|
{
|
|
$tok = $lines[$i].Split(@(' '), "RemoveEmptyEntries")
|
|
$val = New-Object PSObject -Property (@{
|
|
"Solarized"=$tok[0];
|
|
"Hex"=$tok[1];
|
|
"TermCol"=$tok[3];
|
|
"XTerm"=$tok[4];
|
|
"XTermHex"=$tok[5];
|
|
"L"=[int]$tok[6];
|
|
"A"=[int]$tok[7];
|
|
"B"=[int]$tok[8];
|
|
"Red"=[int]$tok[9];
|
|
"Green"=[int]$tok[10];
|
|
"Blue"=[int]$tok[11];
|
|
"Hue"=[int]$tok[12];
|
|
"Saturation"=[int]$tok[13];
|
|
"Black"=[int]$tok[14];
|
|
"ConsoleColor"=[ConsoleColor]($tok[15])
|
|
})
|
|
|
|
$table[$val.Solarized]=$val
|
|
}
|
|
return $table
|
|
}
|
|
|
|
$SolarizedTable = Get-SolarizedColorTable
|
|
|
|
function ConvertFrom-SolarizedColor($solarized)
|
|
{
|
|
return $SolarizedTable[$solarized].ConsoleColor
|
|
}
|
|
|
|
function Set-SolarizedColors([switch]$Light, [switch]$Dark)
|
|
{
|
|
if ( (-not $Light) -and (-not $Dark) )
|
|
{
|
|
$Light = $true
|
|
}
|
|
|
|
if ($Host.Name -eq "ConsoleHost")
|
|
{
|
|
Add-Type -AssemblyName System.Drawing
|
|
Add-ConsoleHelper
|
|
|
|
# Redefine the standard console colors to have the Solarized palette.
|
|
#
|
|
$table = Get-SolarizedColorTable
|
|
foreach( $entry in $table.Values )
|
|
{
|
|
[ConsoleColorHelper]::SetStandardConsoleColor($entry.ConsoleColor, $entry.Hex)
|
|
}
|
|
|
|
if ($Light)
|
|
{
|
|
$Host.UI.RawUI.BackgroundColor = ConvertFrom-SolarizedColor "base3"
|
|
$Host.UI.RawUI.ForegroundColor = ConvertFrom-SolarizedColor "base00"
|
|
|
|
$Host.PrivateData.WarningForegroundColor = ConvertFrom-SolarizedColor "base1"
|
|
$Host.PrivateData.VerboseForegroundColor = ConvertFrom-SolarizedColor "base01"
|
|
$Host.PrivateData.DebugForegroundColor = ConvertFrom-SolarizedColor "base01"
|
|
|
|
$Host.PrivateData.ErrorBackgroundColor = ConvertFrom-SolarizedColor "base2"
|
|
$Host.PrivateData.WarningBackgroundColor = ConvertFrom-SolarizedColor "base2"
|
|
}
|
|
else
|
|
{
|
|
$Host.UI.RawUI.BackgroundColor = ConvertFrom-SolarizedColor "base03"
|
|
$Host.UI.RawUI.ForegroundColor = ConvertFrom-SolarizedColor "base0"
|
|
|
|
$Host.PrivateData.WarningForegroundColor = ConvertFrom-SolarizedColor "base01"
|
|
$Host.PrivateData.VerboseForegroundColor = ConvertFrom-SolarizedColor "base1"
|
|
$Host.PrivateData.DebugForegroundColor = ConvertFrom-SolarizedColor "base1"
|
|
|
|
$Host.PrivateData.ErrorBackgroundColor = ConvertFrom-SolarizedColor "base02"
|
|
$Host.PrivateData.WarningBackgroundColor = ConvertFrom-SolarizedColor "base02"
|
|
}
|
|
|
|
$Host.PrivateData.ErrorForegroundColor = ConvertFrom-SolarizedColor "red"
|
|
|
|
$Host.PrivateData.DebugBackgroundColor =
|
|
$Host.PrivateData.VerboseBackgroundColor =
|
|
$Host.UI.RawUI.BackgroundColor
|
|
}
|
|
}
|