Powershell 5 for tired old eyes
With the release of Powershell 5, they introduced syntax highlighting. This is, in general, a nice improvement, but I wasn't totally happy with it, so I had to find out how to customise it. My problems were probably self-inflicted to some extent, as I think at some point I had tweaked the console colour settings. The Powershell is hosted in a standard Windows console, and the colours it uses are in fact the 16 colours available from the console.
The console colours start out by default as fairly basic RGB combinations. You can see these if you open up the console properties (right-click on the title bar of a console window will get you there). In the powershell, these are given names - the powershell has its own enum for these, which maps pretty directly on to the ConsoleColor enumeration of the .NET framework.
ConsoleColor |
Description |
Red |
Green | Blue |
Black |
The color black. |
0 |
0 |
0 |
Blue |
The color blue. |
0 |
0 |
255 |
Cyan |
The color cyan (blue-green). |
0 |
255 |
255 |
DarkBlue |
The color dark blue. |
0 |
0 |
128 |
DarkCyan |
The color dark cyan (dark blue-green). |
0 |
128 |
128 |
DarkGray |
The color dark gray. |
128 |
128 |
128 |
DarkGreen |
The color dark green. |
128 |
0 |
0 |
DarkMagenta |
The color dark magenta (dark purplish-red). |
128 |
0 |
128 |
DarkRed |
The color dark red. |
128 |
0 |
0 |
DarkYellow |
The color dark yellow (ochre). |
128 |
128 |
0 |
Gray |
The color gray. |
128 |
128 |
128 |
Green |
The color green. |
0 |
0 |
255 |
Magenta |
The color magenta (purplish-red). |
255 |
0 |
255 |
Red |
The color red. |
255 |
0 |
0 |
White |
The color white. |
255 |
255 |
255 |
Yellow |
The color yellow. |
255 |
255 |
0 |
In the properties dialog of the console these are displayed as a row of squares like this:
and you can click on each colour and adjust the red-green-blue values. In addition to the "Properties" dialog, there is also an identical "Defaults" dialog, also available via a right-click on the title bar. Saving your tweaks in the Defaults dialog affects all future consoles, not only powershell consoles.
In the Powershell, you can specify these colours by name. For example, the fourth one from the left is called DarkCyan. This is where it gets really weird. Even if you have changed the console colour to something else, it's still called DarkCyan. In the following screenshot, I have changed the fourth console colour to have the values for Magenta.
Also of interest here is that the default syntax highlighting colour for a String, is DarkCyan, and of course, we also get Magenta in the syntax-highlighted Write-Host command.
Actually - this is where I first had trouble. The next screenshot shows the situation after setting the colours back to the original defaults. You can also see that I am trying to change directory, and that the name of the directory is a String.
My initial problem was that I had adjusted the Blue console color to have some green in it. This meant that a simple command such as CD left me with unreadable text with DarkCyan over a slightly green Blue background. This gave a particularly strange behaviour, because the tab-completion wraps the directory in quotes (making it a String token) when needed, and not otherwise. This means that as you tab through the directories, the directory name flips from DarkCyan to White and back again, depending on whether there's a space in it. Too weird...
But all is not lost - you also have control over the syntax highlighting colours. You can start with listing the current values using:
Get-PSReadlineOption
And then set the colours for the various token types using Set-PSReadlineOption. I now have the following line in my profile
Set-PSReadlineOption -TokenKind String -ForegroundColor White
(If you use the default profile for this, you will be fine, but if you use one of the AllHosts profiles, then you need to check that your current host is a ConsoleHost.)
Anyway - lessons learned... Be careful when tweaking the console colours - this was far less risky before syntax highlighting... and you can also fix the syntax highlighting colours if you need to, but you can only choose from the current console colours.