From 66d2f1fea820d739e9e5af07f12684119606bbea Mon Sep 17 00:00:00 2001 From: John Doty Date: Fri, 19 Jul 2013 16:44:12 -0700 Subject: [PATCH] This is a better mapping of solarized to console/powershell --- WindowsPowershell/Modules/ConsoleColors.psm1 | 148 +++++++++++-------- WindowsPowershell/Profile.ps1 | 59 +++++++- 2 files changed, 139 insertions(+), 68 deletions(-) diff --git a/WindowsPowershell/Modules/ConsoleColors.psm1 b/WindowsPowershell/Modules/ConsoleColors.psm1 index ac44964..acd26a9 100644 --- a/WindowsPowershell/Modules/ConsoleColors.psm1 +++ b/WindowsPowershell/Modules/ConsoleColors.psm1 @@ -131,6 +131,67 @@ function Add-ConsoleHelper() 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) ) @@ -138,89 +199,48 @@ function Set-SolarizedColors([switch]$Light, [switch]$Dark) $Light = $true } - # Here's the solarized table... - # - # SOLARIZED HEX 16/8 TERMCOL XTERM/HEX L*A*B RGB HSB - # --------- ------- ---- ------- ----------- ---------- ----------- ----------- - $base03 = "#002b36" # 8/4 brblack 234 #1c1c1c 15 -12 -12 0 43 54 193 100 21 - $base02 = "#073642" # 0/4 black 235 #262626 20 -12 -12 7 54 66 192 90 26 - $base01 = "#586e75" # 10/7 brgreen 240 #585858 45 -07 -07 88 110 117 194 25 46 - $base00 = "#657b83" # 11/7 bryellow 241 #626262 50 -07 -07 101 123 131 195 23 51 - $base0 = "#839496" # 12/6 brblue 244 #808080 60 -06 -03 131 148 150 186 13 59 - $base1 = "#93a1a1" # 14/4 brcyan 245 #8a8a8a 65 -05 -02 147 161 161 180 9 63 - $base2 = "#eee8d5" # 7/7 white 254 #e4e4e4 92 -00 10 238 232 213 44 11 93 - $base3 = "#fdf6e3" # 15/7 brwhite 230 #ffffd7 97 00 10 253 246 227 44 10 99 - $yellow = "#b58900" # 3/3 yellow 136 #af8700 60 10 65 181 137 0 45 100 71 - $orange = "#cb4b16" # 9/3 brred 166 #d75f00 50 50 55 203 75 22 18 89 80 - $red = "#dc322f" # 1/1 red 160 #d70000 50 65 45 220 50 47 1 79 86 - $magenta = "#d33682" # 5/5 magenta 125 #af005f 50 65 -05 211 54 130 331 74 83 - $violet = "#6c71c4" # 13/5 brmagenta 61 #5f5faf 50 15 -45 108 113 196 237 45 77 - $blue = "#268bd2" # 4/4 blue 33 #0087ff 55 -10 -45 38 139 210 205 82 82 - $cyan = "#2aa198" # 6/6 cyan 37 #00afaf 60 -35 -05 42 161 152 175 74 63 - $green = "#859900" # 2/2 green 64 #5f8700 60 -20 65 133 153 0 68 100 60 - if ($Host.Name -eq "ConsoleHost") { Add-Type -AssemblyName System.Drawing - Add-ConsoleHelper + Add-ConsoleHelper - # Redefine the standard console colors to have the Solarized-Light - # palette. + # Redefine the standard console colors to have the Solarized palette. # - # TODO: Check this out as a color palette... - # - if ([ConsoleColorHelper]::GetStandardConsoleColor([ConsoleColor]::DarkGray) -ne $base03) + $table = Get-SolarizedColorTable + foreach( $entry in $table.Values ) { - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkGray, $base03) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Black, $base02) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Green, $base01) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Yellow, $base00) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Blue, $base0) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Cyan, $base1) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Gray, $base2) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::White, $base3) - - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkYellow, $yellow) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Red, $orange) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkRed, $red) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkMagenta, $magenta) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::Magenta, $violet) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkBlue, $blue) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkCyan, $cyan) - [ConsoleColorHelper]::SetStandardConsoleColor([ConsoleColor]::DarkGreen, $green) + [ConsoleColorHelper]::SetStandardConsoleColor($entry.ConsoleColor, $entry.Hex) } if ($Light) { - $Host.UI.RawUI.BackgroundColor = [ConsoleColor]::White - $Host.UI.RawUI.ForegroundColor = [ConsoleColor]::Yellow + $Host.UI.RawUI.BackgroundColor = ConvertFrom-SolarizedColor "base3" + $Host.UI.RawUI.ForegroundColor = ConvertFrom-SolarizedColor "base00" - $Host.PrivateData.VerboseForegroundColor = [ConsoleColor]::Cyan + $Host.PrivateData.WarningForegroundColor = ConvertFrom-SolarizedColor "base1" + $Host.PrivateData.VerboseForegroundColor = ConvertFrom-SolarizedColor "base01" + $Host.PrivateData.DebugForegroundColor = ConvertFrom-SolarizedColor "base01" - $Host.PrivateData.ProgressBackgroundColor = [ConsoleColor]::DarkGray - $Host.PrivateData.ProgressForegroundColor = [ConsoleColor]::Blue + $Host.PrivateData.ErrorBackgroundColor = ConvertFrom-SolarizedColor "base2" + $Host.PrivateData.WarningBackgroundColor = ConvertFrom-SolarizedColor "base2" } else { - $Host.UI.RawUI.BackgroundColor = [ConsoleColor]::DarkGray - $Host.UI.RawUI.ForegroundColor = [ConsoleColor]::Blue + $Host.UI.RawUI.BackgroundColor = ConvertFrom-SolarizedColor "base03" + $Host.UI.RawUI.ForegroundColor = ConvertFrom-SolarizedColor "base0" - $Host.PrivateData.VerboseForegroundColor = [ConsoleColor]::Green + $Host.PrivateData.WarningForegroundColor = ConvertFrom-SolarizedColor "base01" + $Host.PrivateData.VerboseForegroundColor = ConvertFrom-SolarizedColor "base1" + $Host.PrivateData.DebugForegroundColor = ConvertFrom-SolarizedColor "base1" - $Host.PrivateData.ProgressBackgroundColor = [ConsoleColor]::White - $Host.PrivateData.ProgressForegroundColor = [ConsoleColor]::Yellow + $Host.PrivateData.ErrorBackgroundColor = ConvertFrom-SolarizedColor "base02" + $Host.PrivateData.WarningBackgroundColor = ConvertFrom-SolarizedColor "base02" } - $Host.PrivateData.ErrorForegroundColor = [ConsoleColor]::DarkRed - $Host.PrivateData.WarningForegroundColor = [ConsoleColor]::DarkYellow - $Host.PrivateData.DebugForegroundColor = [ConsoleColor]::DarkBlue - - $Host.PrivateData.ErrorBackgroundColor = - $Host.PrivateData.WarningBackgroundColor = + $Host.PrivateData.ErrorForegroundColor = ConvertFrom-SolarizedColor "red" + $Host.PrivateData.DebugBackgroundColor = $Host.PrivateData.VerboseBackgroundColor = - $Host.UI.RawUI.BackgroundColor - - Clear-Host - } + $Host.UI.RawUI.BackgroundColor + } } diff --git a/WindowsPowershell/Profile.ps1 b/WindowsPowershell/Profile.ps1 index 2e84a5c..3292aff 100644 --- a/WindowsPowershell/Profile.ps1 +++ b/WindowsPowershell/Profile.ps1 @@ -60,10 +60,10 @@ function prompt # Our "theme", as it were. Note that we assume the use of the # solarized colors. # - $cdelim = [ConsoleColor]::DarkCyan - $chost = [ConsoleColor]::DarkGreen - $cloc = $csym = [ConsoleColor]::DarkCyan - if (-not $ok) { $csym = [ConsoleColor]::DarkRed; } + $cdelim = ConvertFrom-SolarizedColor "base1" + $chost = ConvertFrom-SolarizedColor "green" + $cloc = $csym = ConvertFrom-SolarizedColor "base0" + if (-not $ok) { $csym = ConvertFrom-SolarizedColor "red" } } else { @@ -208,3 +208,54 @@ function Wrap-Text ($txt) function ConvertFrom-Base64UTF8($base64) { return [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($base64)) } + +function Get-TFSWorkspace( + [string]$path = ((pwd).Path) +) +{ + [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client") + [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.VersionControl.Client") + [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.WorkItemTracking.Client") + [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Build.Client") + + function InitServerAndWorkspaceFromWSInfo( $wsInfo ) + { + $tfs = New-Object Microsoft.TeamFoundation.Client.TfsTeamProjectCollection( $wsInfo.ServerUri ) + $versionControlServer = $tfs.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer]) + + return @{ + "BuildServer"= $tfs.GetService([Microsoft.TeamFoundation.Build.Client.IBuildServer]); + "VersionControl"=$versionControlServer; + "WorkItems"=$tfs.GetService([Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore]); + "Workspace"=$versionControlServer.GetWorkspace($wsInfo); + } + } + + # is there only 1 workspace in our cache file? If so, use that one regardless of the hint + $workspaceInfos = [Microsoft.TeamFoundation.VersionControl.Client.Workstation]::Current.GetAllLocalWorkspaceInfo() + if ($workspaceInfos.Length -eq 1) + { + InitServerAndWorkspaceFromWSInfo($workspaceInfos[0]) + return + } + + $current = $path + do + { + $workspaceInfos = [Microsoft.TeamFoundation.VersionControl.Client.Workstation]::Current.GetLocalWorkspaceInfoRecursively($current) + if ($workspaceInfos.Length -gt 1) + { + throw 'More than one workspace matches the workspace hint "{0}": {1}' -f + $current, [string]::join(', ', @($workspaceInfos | %{ $_.Name})) + } + + $current = split-path -parent $current + } while (($workspaceInfos.Length -ne 1) -and $current) + + if (-not $workspaceInfos) + { + throw "Could not figure out a workspace based on $path" + } + + return InitServerAndWorkspaceFromWSInfo( $workspaceInfos[0] ) +}