DEV Community

Cover image for Improve window powershell promt with oh-my-posh and more
Dannyvpz
Dannyvpz

Posted on • Edited on

Improve window powershell promt with oh-my-posh and more

All the content of this article referring to this awesome video by devaslife, check out his channel for detail steps and find more cool videos

Neccessary tools

1> WSL - Window terminal (from Microsoft store)
2> Powershell (from Microsoft store)
3> Scoop installer - check this

Install scoop

Make sure PowerShell 5 (or later, include PowerShell Core) and .NET Framework 4.5 (or later) are installed. Then run:

 iwr -useb get.scoop.sh | iex 
Enter fullscreen mode Exit fullscreen mode

Note: if you get an error you might need to change the execution policy (i.e. enable Powershell) with

 Set-ExecutionPolicy RemoteSigned -scope CurrentUser 
Enter fullscreen mode Exit fullscreen mode

Set PATH for scoop command in System Properties > Advanced > Environment Variables.

Add new directory path in System variables > Path, choose scoop directory C:\Users\<USERNAME>\scoop\shims

Close and reload terminal.

Install some neccessary packages via scoop

jq is optional
Run

 scoop install curl sudo jq 
Enter fullscreen mode Exit fullscreen mode

Install Nerd Fonts

  • Got to this link and download FuraCode font from Nerd Fonts
  • Extract and right click >> Install the font.

Setup Window terminal

  • Choose Powershell as default.
  • Checkout appearance tab of Powershell and choose FuraCode Nerd Font Retina as default font.
  • Select Color scheme One Half Dark and enable Acrylic option with opacity 50% to have a better Window terminal display.

Install Neovim (optional)

Run

 scoop install neovim gcc 
Enter fullscreen mode Exit fullscreen mode

Install some nice modules to improve powershell

1> posh-git

Provides prompt with Git status summary information and tab completion for Git commands, parameters, remotes and branch names.

 Install-Module posh-git -Scope CurrentUser -Force 
Enter fullscreen mode Exit fullscreen mode

To import module run

 Import-Module posh-git 
Enter fullscreen mode Exit fullscreen mode

(To import module automatically when shell starting need to set in User Profile, this can be found at the end of article, same for all modules)

2> oh-my-posh

Theming capabilities for the PowerShell prompt in ConEmu

 Install-Module oh-my-posh -Scope CurrentUser -Force 
Enter fullscreen mode Exit fullscreen mode

To import module run

 Import-Module oh-my-posh 
Enter fullscreen mode Exit fullscreen mode

Set Promt theme using

 Set-PoshPromt -Theme <THEME_NAME> 
Enter fullscreen mode Exit fullscreen mode

THEME_NAME can be found here

3> Terminal Icons (display icons of folder/files)

Run

 Install-Module -Name Terminal-Icons -Repository PSGallery -Force 
Enter fullscreen mode Exit fullscreen mode

To import module run

 Import-Module Terminal-Icons 
Enter fullscreen mode Exit fullscreen mode

Result:
Image description

4> Z directory jumper
Jump easily between to recent directories with alias
Run

 Install-Module -Name Z -Force 
Enter fullscreen mode Exit fullscreen mode

To jump just type z + any word contain in recent directory used in cd command, check the module for more detail.

5> PSReadLine - Autocompletion recent command on typing
run

 Install-Module -Name PSReadLine -AllowPrerelease -Scope CurrentUser -Force -SkipPublisherCheck 
Enter fullscreen mode Exit fullscreen mode

Set PSREadLine option

 Set-PSReadLineOption -PredictionSource History 
Enter fullscreen mode Exit fullscreen mode

6> Fuzzy finder
Run

 scoop install fzf 
Enter fullscreen mode Exit fullscreen mode

And

 Install-Module -Name PSFzf -Scope CurrentUser -Force 
Enter fullscreen mode Exit fullscreen mode

To import module run

 Import-Module PSFzf 
Enter fullscreen mode Exit fullscreen mode

and

 Set-PsFzfOption -PsReadLineChordProvider 'Ctrl+f' -PSReadLineChordReverseHistory 'Ctrl+r' 
Enter fullscreen mode Exit fullscreen mode

Now time to enjoy the result.
Image description

Custom oh-my-posh theme

You can customize the json config for oh-my-posh prompt, detail documentation can be found here, the json below was modified from M365Princess theme to personalize the colors & add new line command.

1 >> Create oh-my-post json file at ~/.config/powershell/<file-name>.omp.json

 { "$schema": "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json", "final_space": true, "blocks": [ { "type": "prompt", "alignment": "left", "segments": [ { "type": "session", "style": "diamond", "foreground": "#ffffff", "background": "#031d44", "leading_diamond": "\uE0B6", "trailing_diamond": "", "properties": { "prefix": "", "template": "{{ .UserName }}" } }, { "type": "path", "style": "powerline", "powerline_symbol": "\uE0B0", "foreground": "#ffffff", "background": "#04395e", "properties": { "style": "folder" } }, { "type": "git", "style": "powerline", "powerline_symbol": "\uE0B0", "foreground": "#ffffff", "background": "#70a288", "properties": { "fetch_stash_count": true, "fetch_upstream_icon": true, "branch_icon": "", "fetch_status": false, "template": "{{ .UpstreamIcon }}{{ .HEAD }}{{ if gt .StashCount 0 }} \uF692 {{ .StashCount }}{{ end }}", "prefix": " \u279C (", "postfix": ") " } }, { "type": "php", "style": "powerline", "powerline_symbol": "\uE0B0", "foreground": "#ffffff", "background": "#4063D8", "properties": { "prefix": " \ue73d ", "enable_hyperlink": false } }, { "type": "node", "style": "powerline", "powerline_symbol": "\uE0B0", "foreground": "#ffffff", "background": "#dab785", "properties": { "prefix": " \uE718 " } }, { "type": "time", "style": "diamond", "trailing_diamond": "\uE0B0", "foreground": "#ffffff", "background": "#d5896f", "properties": { "prefix": " \u2665 ", "time_format": "15:04" } } ] }, { "type": "prompt", "alignment": "left", "newline": true, "segments": [ { "type": "text", "style": "plain", "foreground": "#007ACC", "properties": { "prefix": "", "text": "\uE602" } } ] } ], "final_space": true } 
Enter fullscreen mode Exit fullscreen mode

2 >> Load prompt config in user profile

With neovim installed run

 nvim $PROFILE.CurrentsUserAllHosts 
Enter fullscreen mode Exit fullscreen mode

or open with any text edit

Add this line below to the file

 oh-my-posh --init --shell pwsh --config 'C:\Users\<your-username>\.config\powershell\<you-file-name>.omp.json' | Invoke-Expression 
Enter fullscreen mode Exit fullscreen mode

3 >> Restart powershell and see result

Before:
Image description

After:
Image description

Wrapping up all the import and option set in user profile

With neovim installed run

 nvim $PROFILE.CurrentsUserAllHosts 
Enter fullscreen mode Exit fullscreen mode

Or open the file in any text editor, file path can be found by running:

 echo $PROFILE.CurrentsUserAllHosts 
Enter fullscreen mode Exit fullscreen mode

Finalize user profile with some cool alias and function

 Import-Module posh-git Import-Module oh-my-posh # PSReadLine Set-PSREadLineOption -PredictionSource History # Terminal-Icons Import-Module Terminal-Icons # Fzf Import-Module PSFzf Set-PsFzfOption -PSReadLineChordProvider 'Ctrl+f' -PSReadLineChordReverseHistory 'Ctrl+r' # Set theme Set-PoshPrompt -Theme M365Princess # Load prompt configs oh-my-posh --init --shell pwsh --config 'C:\Users\<your-username>\.config\powershell\<you-file-name>.omp.json' | Invoke-Expression # Alias (Optional) Set-Alias vim nvim Set-Alias g git Set-Alias ll ls Set-Alias grep findstr Set-Alias tig 'C:\Program Files\Git\usr\bin\tig.exe' Set-Alias less 'C:\Program Files\Git\usr\bin\less.exe' # Ultilities (Optional) function which ($command) { Get-Command -Name $command -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Path -ErrorAction SilentlyContinue } 
Enter fullscreen mode Exit fullscreen mode

Top comments (2)

Collapse
 
mkanet profile image
MKANET

Oh my posh is nice, until you find out it's not at all compatible with native PowerShell remoting: Enter-PSSession

Collapse
 
anderssonpeter profile image
Peter

I have started a project that I think would be a great fit (it's not done yet but it is functional)

github.com/AnderssonPeter/PowerType it gives you autocomplete for cli tools, currently it only supports a subset of git.

Would love feedback!