A theme engine for Powershell in ConEmu and Windows Terminal inspired by the work done by Chris Benti on PS-Config and Oh-My-ZSH on OSX and Linux (hence the name).
More information about why I made this can be found on my blog.
Features:
- Easy installation
- Awesome prompt themes for PowerShell in ConEmu
- Git status indications (powered by posh-git)
- Failed command indication
- Admin indication
- Current session indications (admin, failed command, user)
- Configurable
- Easily create your own theme
- Separate settings for oh-my-posh and posh-git
- Does not mess with the default Powershell console
You should use ConEmu or Windows Terminal to have a brilliant terminal experience on Windows.
You can install ConEmu using Chocolatey:
choco install ConEmu
You can also install it using Scoop via the extras bucket:
$ scoop search conemu
'extras' bucket:
conemu (18.xx.xx)
$ scoop install conemu
Windows Terminal can be acquired from the Microsoft Store, the Windows Terminal repo, or via Chocolatey:
choco install microsoft-windows-terminal
The fonts I use are Powerline fonts, there is a great repository containing them.
I use Meslo LG M Regular for Powerline Nerd Font
in my ConEmu setup together with custom colors. You can find my theme here.
In case you notice weird glyphs after installing a font of choice, make sure the glyphs are available (maybe they have a different location in the font, if so, adjust the correct $ThemeSettings
icon). If it turns out the character you want is not supported, select a different font.
You need to use the PowerShell Gallery to install oh-my-posh.
Install posh-git and oh-my-posh:
Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser
Enable the prompt:
# Start the default settings
Set-Prompt
# Alternatively set the desired theme:
Set-Theme Agnoster
In case you're running this on PS Core, make sure to also install version 2.0.0-beta1 of PSReadLine
Install-Module -Name PSReadLine -AllowPrerelease -Scope CurrentUser -Force -SkipPublisherCheck
To enable the engine edit your PowerShell profile:
if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force }
notepad $PROFILE
Append the following lines to your PowerShell profile:
Import-Module posh-git
Import-Module oh-my-posh
Set-Theme Paradox
The last command sets the theme for the console. Check the available themes list below.
List the current configuration:
$ThemeSettings
You can tweak the settings by manipulating $ThemeSettings
.
This example allows you to tweak the branch symbol using a unicode character:
$ThemeSettings.GitSymbols.BranchSymbol = [char]::ConvertFromUtf32(0xE0A0)
Also do not forget the Posh-Git settings itself (enable the stash indication for example):
$GitPromptSettings
Hide your username@domain
when not in a virtual machine for the Agnoster, Fish, Honukai, Paradox and Sorin themes:
$DefaultUser = 'yourUsernameHere'
Set-Theme
: set a theme from the Themes directory. If no match is found, it will not be changed. Autocomplete is available to list and complete available themes.
Set-Theme paradox
Show-ThemeColors
: display the colors used by the theme
Show-Colors
: display colors configured in ConEmu
If you want to create a theme it can be done rather easily by adding a mytheme.psm1
file in the folder indicated in $ThemeSettings.MyThemesLocation
(the folder defaults to ~\Documents\WindowsPowerShell\PoshThemes
, feel free to change it).
The only required function is Write-Theme
. You can use the following template to get started:
#requires -Version 2 -Modules posh-git
function Write-Theme
{
param(
[bool]
$lastCommandFailed,
[string]
$with
)
# enter your prompt building logic here
}
$sl = $global:ThemeSettings #local settings
Feel free to use the public helper functions Get-VCSStatus
, Get-VcsInfo
, Get-FormattedRootLocation
, Get-ShortPath
, Set-CursorForRightBlockWrite
, Set-CursorUp
, Set-Newline
or add your own logic completely.
To test the output in ConEmu, just switch to your theme:
Set-Theme mytheme
If you want to include your theme in oh-my-posh, send me a PR and I'll try to give feedback ASAP.
Happy theming!
As it seems getting access to the stack information when using pushd/popd is sort of mission impossible from within a theme, you can use a workaround proposed by Jonathan Leech-Pepin. In your $PROFILE
, add a variable that will act as a correctly scoped pointer to fetch the stack context:
$getStackContext = {Get-Location -Stack}
Next, in your custom theme, access the information you want to display:
$stackCount = (&$getStackContext).count
This is caused by the ConsoleTitle
functionality.
As explained by Andrew Stanton-Nurse it's linked to how terminals work with OSC codes.
The fix is to disable the ConsoleTitle
functionality when in iTerm2 by adding the following snippet to your $PROFILE
.
if($env:LC_TERMINAL -eq "iTerm2") {
$ThemeSettings.Options.ConsoleTitle = $false
}