Adding support for Solarized colors; use dark palette
This commit is contained in:
parent
3af6307831
commit
17c5fcadef
2 changed files with 204 additions and 103 deletions
195
WindowsPowershell/Modules/ConsoleColors.psm1
Normal file
195
WindowsPowershell/Modules/ConsoleColors.psm1
Normal file
|
|
@ -0,0 +1,195 @@
|
|||
|
||||
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() );
|
||||
}
|
||||
|
||||
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 short Left;
|
||||
internal short Top;
|
||||
internal short Right;
|
||||
internal short 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 ushort wAttributes;
|
||||
internal SMALL_RECT srWindow;
|
||||
internal COORD dwMaximumWindowSize;
|
||||
internal ushort wPopupAttributes;
|
||||
|
||||
[MarshalAs( UnmanagedType.Bool )]
|
||||
internal bool bFullscreenSupported;
|
||||
|
||||
[MarshalAs( UnmanagedType.ByValArray, SizeConst = 16 )]
|
||||
internal COLORREF[] ColorTable;
|
||||
}
|
||||
}
|
||||
"@
|
||||
|
||||
Add-Type -TypeDefinition $code -ReferencedAssemblies @('System.Drawing')
|
||||
}
|
||||
|
||||
# These are the 16 colors for our palette.
|
||||
Add-Type -AssemblyName System.Drawing
|
||||
$base03 = [System.Drawing.Color]::FromArgb(0x002b36)
|
||||
$base02 = [System.Drawing.Color]::FromArgb(0x073642)
|
||||
$base01 = [System.Drawing.Color]::FromArgb(0x586e75)
|
||||
$base00 = [System.Drawing.Color]::FromArgb(0x657b83)
|
||||
$base0 = [System.Drawing.Color]::FromArgb(0x839496)
|
||||
$base1 = [System.Drawing.Color]::FromArgb(0x93a1a1)
|
||||
$base2 = [System.Drawing.Color]::FromArgb(0xeee8d5)
|
||||
$base3 = [System.Drawing.Color]::FromArgb(0xfdf6e3)
|
||||
$yellow = [System.Drawing.Color]::FromArgb(0xb58900)
|
||||
$orange = [System.Drawing.Color]::FromArgb(0xcb4b16)
|
||||
$red = [System.Drawing.Color]::FromArgb(0xdc322f)
|
||||
$magenta = [System.Drawing.Color]::FromArgb(0xd33682)
|
||||
$violet = [System.Drawing.Color]::FromArgb(0x6c71c4)
|
||||
$blue = [System.Drawing.Color]::FromArgb(0x268bd2)
|
||||
$cyan = [System.Drawing.Color]::FromArgb(0x2aa198)
|
||||
$green = [System.Drawing.Color]::FromArgb(0x859900)
|
||||
|
||||
function Set-SolarizedColors([switch]$Light, [switch]$Dark)
|
||||
{
|
||||
# Redefine the standard console colors to have the Solarized-Light
|
||||
# palette.
|
||||
#
|
||||
# Note that we're doing funny things here, like setting black to
|
||||
# white, because we are trying to make it so that programs that
|
||||
# don't redefine the palette still get a coherent scheme.
|
||||
#
|
||||
# We try to map with cognates, but it's not easy....
|
||||
#
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Black, $base03)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkGray, $base02)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Gray, $base01)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkBlue, $base00)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkGreen, $base0)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkCyan, $base1)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkRed, $base2)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::White, $base3)
|
||||
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Yellow, $yellow)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkYellow, $orange)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Red, $red)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Magenta, $magenta)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkMagenta, $violet)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Blue, $blue)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Cyan, $cyan)
|
||||
[ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Green, $green)
|
||||
|
||||
if ($Light)
|
||||
{
|
||||
$themefg = [ConsoleColor]::White # $base3
|
||||
$themebg = [ConsoleColor]::DarkBlue # $base00
|
||||
}
|
||||
|
||||
if ($Dark)
|
||||
{
|
||||
$themefg = [ConsoleColor]::DarkGreen # $base0
|
||||
$themebg = [ConsoleColor]::Black # $base03
|
||||
}
|
||||
|
||||
if ($Light -or $Dark)
|
||||
{
|
||||
(Get-Host).UI.RawUI.BackgroundColor = $themebg
|
||||
(Get-Host).UI.RawUI.ForegroundColor = $themefg
|
||||
}
|
||||
}
|
||||
|
||||
Add-ConsoleHelper
|
||||
Loading…
Add table
Add a link
Reference in a new issue