My PowerShell profile
Your PowerShell profile gives you the power to customize the console at run time. This article explores my customization that make my PowerShell sessions feel like home.
Requirements
There are four requirements to make my setup work:
- [module] PSReadline – is included by default in PowerShell 5.0+.
- [module] AdvancedHistory – this is a module I wrote that adds keyboard navigable history to the console.
- [module] Posh-Git – adds the ability to show Git status as part of your prompt and adds tab-complete to Git commands and parameters. (requires some tweaking, see below)
- [font] DejaVu Sans Mono – any Powerline font will work but I personally use DejaVu Sans Mono.
My Colour Scheme
Unfortunately setting the colours in PowerShell is tedious and it’s not easy to export or share the settings. To set these colours you will need to open PowerShell, click the logo in the top right corner of the window, select Properties, and then Colors. Click each colour going from left-to-right and use these values:
- Black: 35, 51, 68
- DarkBlue: 50, 117, 255
- DarkGreen: 68, 190, 136
- DarkCyan: 20, 133, 156
- DarkRed: 170, 59, 43
- DarkMagenta: 136, 68, 190
- DarkYellow: 185, 191, 81
- Gray: 232, 238, 251
- DarkGray: 139, 142, 150
- Blue: 102, 151, 255
- Green: 85, 238, 170
- Cyan: 29, 191, 224
- Red: 213, 74, 54
- Magenta: 170, 85, 238
- Yellow: 232, 239, 102
- White: 255, 255, 255 (default)
Before clicking “OK” make sure you have the “Screen Background” radio selected and click the furthest colour on the left (“Black.”)
On Windows the colour settings are stored in the actual shortcut used to launch the current session and can be copied between locations.
- Start menu shortcuts: AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
- Taskbar shortcuts: AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
My Profile
Editing the Profile
There are multiple profiles for PowerShell and PowerShell ISE but the one we’re concerned with is the PowerShell console profile specific to the current user. The location of the user profile is assigned to the variable $PROFILE and can be created and opened from the command-line:
PS C:\Users\omniomi> Test-Path $PROFILE False PS C:\Users\omniomi> New-Item -path $PROFILE -type file –force Directory: C:\Users\omniomi\Documents\WindowsPowerShell Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 6/14/2018 9:21 AM 0 Microsoft.PowerShell_profile.ps1 PS C:\Users\omniomi> code $PROFILE
- If the Test-Path command comes back True you already have a profile and can skip the New-Item command.
- You can substitute “code” with “ise” or any editor of your choice.
My Profile
Before starting:make sure to set the font within PowerShell to DejaVu or whichever Powerline font you selected.
Set-Location c:\ ; cls # Prompt Import-Module Posh-Git $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if ($currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { $Script:IsAdmin = $true } function prompt { if (((Get-Item $pwd).parent.parent.name)) { $Path = '..\' + (Get-Item $pwd).parent.name + '\' + (Split-Path $pwd -Leaf) } else { $Path = $pwd.path } if($Script:IsAdmin) { Write-Host " $([char]0xE0A2)" -ForegroundColor Black -BackgroundColor Green -NoNewline Write-Host "$([char]0xE0B0)$([char]0xE0B1)" -ForegroundColor Green -BackgroundColor DarkBlue -NoNewline } Write-Host " $($MyInvocation.HistoryId)" -ForegroundColor white -BackgroundColor DarkBlue -NoNewline Write-Host "$([char]0xE0B0)$([char]0xE0B1) " -ForegroundColor DarkBlue -BackgroundColor Cyan -NoNewline Write-Host ($path).ToLower().TrimEnd('\') -ForegroundColor White -BackgroundColor Cyan -NoNewline if ((Write-VcsStatus *>&1).Length -gt 0) { Write-Host "$([char]0xE0B0)$([char]0xE0B1)" -ForegroundColor Cyan -BackgroundColor DarkGray -NoNewline Write-Host (Write-VcsStatus) -NoNewline -BackgroundColor DarkGray Write-Host "$([char]0xE0B0)$("$([char]0xE0B1)" * $NestedPromptLevel)" -ForegroundColor DarkGray -NoNewline } else { Write-Host "$([char]0xE0B0)$("$([char]0xE0B1)" * $NestedPromptLevel)" -ForegroundColor Cyan -NoNewline } ' ' } # Aliases function ll { Get-ChildItem -Force $args } # Readline options ## Tab completion Set-PSReadlineKeyHandler -Key Tab -Function Complete Set-PSReadlineOption -ShowToolTips ## Colours Set-PSReadlineOption -TokenKind Command -ForegroundColor Blue Set-PSReadlineOption -TokenKind Parameter -ForegroundColor DarkBlue Set-PSReadlineOption -TokenKind Comment -ForegroundColor Green Set-PSReadlineOption -TokenKind Operator -ForegroundColor Gray Set-PSReadlineOption -TokenKind Variable -ForegroundColor Magenta Set-PSReadlineOption -TokenKind Keyword -ForegroundColor Magenta Set-PSReadlineOption -TokenKind String -ForegroundColor DarkGray Set-PSReadlineOption -TokenKind Type -ForegroundColor DarkCyan # AdvancedHistory Import-Module AdvancedHistory Enable-AdvancedHistory -Unique
Tweaking Posh-Git
Finally, in order to make Posh-Git fit into the prompt naturally we need to make changes to GitPrompt.ps1 in the Posh-Git installation directory (C:\Program Files\WindowsPowerShell\Modules\posh-git\0.7.3 if installed for all user on Windows.)
Replace lines 5-86 with this:
DefaultForegroundColor = $null BeforeText = " $([char]0xE0A0) " BeforeForegroundColor = [ConsoleColor]::Yellow BeforeBackgroundColor = [ConsoleColor]::DarkGray DelimText = ' |' DelimForegroundColor = [ConsoleColor]::Yellow DelimBackgroundColor = $null AfterText = '' AfterForegroundColor = [ConsoleColor]::Yellow AfterBackgroundColor = [ConsoleColor]::DarkGray FileAddedText = '+' FileModifiedText = '~' FileRemovedText = '-' FileConflictedText = '!' LocalDefaultStatusSymbol = $null LocalDefaultStatusForegroundColor = [ConsoleColor]::White LocalDefaultStatusForegroundBrightColor = [ConsoleColor]::White LocalDefaultStatusBackgroundColor = [ConsoleColor]::DarkGray LocalWorkingStatusSymbol = '!' LocalWorkingStatusForegroundColor = [ConsoleColor]::DarkRed LocalWorkingStatusForegroundBrightColor = [ConsoleColor]::DarkRed LocalWorkingStatusBackgroundColor = [ConsoleColor]::DarkGray LocalStagedStatusSymbol = '~' LocalStagedStatusForegroundColor = [ConsoleColor]::White LocalStagedStatusBackgroundColor = [ConsoleColor]::DarkGray BranchUntrackedSymbol = $null BranchForegroundColor = [ConsoleColor]::White BranchBackgroundColor = [ConsoleColor]::DarkGray BranchGoneStatusSymbol = [char]0x00D7 # Multiplication sign BranchGoneStatusForegroundColor = [ConsoleColor]::DarkGray BranchGoneStatusBackgroundColor = [ConsoleColor]::DarkGray BranchIdenticalStatusToSymbol = [char]0x2261 # Three horizontal lines BranchIdenticalStatusToForegroundColor = [ConsoleColor]::Yellow BranchIdenticalStatusToBackgroundColor = [ConsoleColor]::DarkGray BranchAheadStatusSymbol = [char]0x2191 # Up arrow BranchAheadStatusForegroundColor = [ConsoleColor]::White BranchAheadStatusBackgroundColor = [ConsoleColor]::DarkGray BranchBehindStatusSymbol = [char]0x2193 # Down arrow BranchBehindStatusForegroundColor = [ConsoleColor]::DarkRed BranchBehindStatusBackgroundColor = [ConsoleColor]::DarkGray BranchBehindAndAheadStatusSymbol = [char]0x2195 # Up & Down arrow BranchBehindAndAheadStatusForegroundColor = [ConsoleColor]::Yellow BranchBehindAndAheadStatusBackgroundColor = [ConsoleColor]::DarkGray BeforeIndexText = "" BeforeIndexForegroundColor = [ConsoleColor]::White BeforeIndexForegroundBrightColor = [ConsoleColor]::White BeforeIndexBackgroundColor = [ConsoleColor]::DarkGray IndexForegroundColor = [ConsoleColor]::White IndexForegroundBrightColor = [ConsoleColor]::White IndexBackgroundColor = [ConsoleColor]::DarkGray WorkingForegroundColor = [ConsoleColor]::DarkRed WorkingForegroundBrightColor = [ConsoleColor]::DarkRed WorkingBackgroundColor = [ConsoleColor]::DarkGray EnableStashStatus = $false BeforeStashText = ' (' BeforeStashBackgroundColor = [ConsoleColor]::DarkGray BeforeStashForegroundColor = [ConsoleColor]::DarkRed AfterStashText = ')' AfterStashBackgroundColor = [ConsoleColor]::DarkGray AfterStashForegroundColor = [ConsoleColor]::DarkRed StashBackgroundColor = [ConsoleColor]::DarkGray StashForegroundColor = [ConsoleColor]::DarkRed ErrorForegroundColor = [ConsoleColor]::DarkRed ErrorBackgroundColor = [ConsoleColor]::DarkGray