I would like to share how to set up a fancy and productive terminal prompt under Windows PowerShell. Many people who have ever used Linux or Mac, will notice some great command, whereas the window command is not useful. Today I would like to show a tutorial on how to set up oh-my-posh environment.
If you ever use Linux/mac probably have heard of oh-my-zsh, it also makes our prompt to be more fancy. In oh-my-zsh it only supports zsh shell, but oh-my-posh supports many shells, but most people use it under the window. Both of these frameworks are used not just to fancy our terminal but also to let us be more productive when using cli command. Cli command means you can use the command to achieve many stuff without using the UI interface, which includes copy, filter, delete, rename, and many more.
1. Install Window Terminal and PowerShell
Before setting up oh-my-posh you need to install the window terminal and Powershell first. The default window provides you powershell which it’s version 5.x version. You will need to install Powershell 7.x version which is typically named PowerShell core.
Powershell core supports many more functions in plugins, if not used it might occur error when installing and importing plugins. Window Terminal allows our prompt to display properly with the nerd font or fancy logo.
Window Terminal
There are two methods:
Store: access Microsoft and type Window Terminal
Winget:
There are two methods:
Powershell
Store: access Microsoft and type Power Shell
Winget:
Window package installation
Winget
In case your winget is not able to use it, please download and install it under this link:
Step 1: Download under this link
Please use either link ok:
https://learn.microsoft.com/en-us/windows/package-manager/winget/
https://github.com/microsoft/winget-cli/releases
The file will look like Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle
Step2: Install by command
If you ever meet Fail-Error Execution Policies, probably it might be the policy problem, please change it to remote
check the current policy: Get-ExecutionPolicy -List
—– —————
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine RemoteSigned
set policy: Set-ExecutionPolicy RemoteSigned
For more detail on each policy, please refer here
Restricted (Default): No scripts are allowed to run, not even ones you write yourself.
RemoteSigned: This allows scripts signed by a trusted source (like Microsoft) to run. It’s like having a guard who checks IDs – only scripts with valid “signatures” (like an artist’s signature) are allowed. Scripts you write yourself wouldn’t work unless you sign them with a special certificate. Files that are downloaded from the internet must be signed by a trusted publisher or must be unblocked
AllSigned: This allows any script with a valid signature to run, regardless of who signed it. It’s less secure than RemoteSigned because it trusts any “signature,” even from unknown sources. Imagine a guard who just checks for a valid ID but doesn’t care who issued it. Scripts must be signed by a trusted publisher, like Microsoft or a well-known software vendor. Think of it like a document requiring a verified signature from a recognized authority.
Bypass (Not Recommended): This completely disables script execution restrictions. It’s like having no security guard at all! Any script can run, which is very risky and not recommended unless you fully understand the potential dangers.
2. Oh-My-Posh setup
Step1: install Nerd Font
Please download either of the link below to download and install nerd font:
Download:
https://github.com/ryanoasis/nerd-fonts
https://www.nerdfonts.com/font-downloads
Install:
Extract the file and right-click to install or drag into C:WindowsFonts
Step2: Window terminal setting
Navigate window terminal and set below setting:
Startup: Default set PowerShell, Deafualt terminal: window terminal.
Setting like below picture:
Appearance
Access to powershell>appearance> change fontface to nerd font
Step3: install oh-my-posh
Install Oh-my-posh
update the latest version
After installing it press Oh-my-posh on the terminal to check command works or not.
Step4: activate theme
activate default theme
list all the theme look like:
or display all theme location and filename
Change theme according to above theme filename
Step5: prompt setting writing profile
We need to create profile to write the theme in it. in Step4 it will only take effect on that session temporary, when reopening new session the command you enter like theme will be lost remain default.
profile location of different poweshell:
PS5.1: C:UserstestDocumentsWindowsPowerShell
PS7.1: C:UserstestDocumentsPowerShell
generate a file: will only generate an empty file
You need to modify the file using notepad $profile, you can change Notepad to any you prefer text editor. The $profile will automatically open the file it generates, which no need to type the full path of the profile location.
Add your previous command on changing the theme to your profile
You can also assign the full path of the theme below i mention many examples of assigned themes:
$themepath = ‘C:UserstestDocumentsPowerShellshanselman_v3-v2.json’
oh-my-posh –init –shell pwsh –config $themepath | Invoke-Expression
# URL
oh-my-posh init pwsh –config ‘https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/jandedobbeleer.omp.json’ | Invoke-Expression
# same location as $profile
$omp_config = Join-Path $PSScriptRoot “.theme.json”
oh-my-posh –init –shell pwsh –config $omp_config | Invoke-Expression
You might wonder how the $env knows the full path of the default theme, it’s because it’s an environment variable in powershell, you can use this command to check the env variable and path.
Note: You can set and remove an $env variable using the below command. But this will only take effect if you write into $profile, or in the command(temporary). If you set the env but not add into $profile will not take effect.
Set-Item -Path env:MYCUSTOMVAR –Value <path location>
#remove
$env:<name> = $null
Step6 add some function or alias to profile
Now we can assign some Linux commands to alias, which you can use Linux commands on PowerShell. You will be using a lot of the $profile in the plugin, just think it’s a configuration of PowerShell.
Before setting the alias or functions, let’s install git and node, it’s optional but if you want to add git to the alias, it is highly recommended you install it here.
Install git
Install nodejs
Alias
Set -Alias ll ls
Set-Alias g git
#Set alias vim nvim
Set-Alias grep findstr
Set-Alias tig ‘C:Program FilesGitusrbintig.exe’
Set-Alias less ‘C:Program FilesGitusrbinless.exe’
# Ultilities (Optional)
function which ($command) {
Get-Command -Name $command -ErrorAction SilentlyContinue |
Select-Object -ExpandProperty Path -ErrorAction SilentlyContinue
}
Function
adding function can be alternative of alias
Get-ChildItem env:
}
function head {
param($Path, $n = 10)
Get-Content $Path -Head $n
}
function tail {
param($Path, $n = 10)
Get-Content $Path -Tail $n
}
function grep($regex, $dir) {
if ( $dir ) {
Get-ChildItem $dir | select-string $regex
return
}
$input | select-string $regex
}
function df {
get-volume
}
#get $env variable
function getenv {ChildItem env:}
# Git Shortcuts
function gs { git status }
function ga { git add . }
function gc { param($m) git commit -m “$m” }
function gp { git push }
function g { z Github }
function gcom {
git add .
git commit -m “$args”
}
function lazyg {
git add .
git commit -m “$args”
git push
}
# adding hosts shortcut
function hosts { notepad c:windowssystem32driversetchosts }
If you are interested in the profile, please refer to my profile on this link.
3. PLugin
There’s many more plugins, but I will choose only I think it’s commonly used by people or developers.
Terminal Icons
Display icon according to file type
install module
import module
What will it look like, please refer below picture.
psreadline(Autocompletion)
This is a powerful module, which have many function on it. I will not use all of them, I will only pick important one or useful one. If you’re interested you can study in official site. PSReadline basely is developed by Microsoft use under PowerShell.
You can use this command to get the default hotkey: Get-PSReadLineKeyHandler
install module
#or below more detail which recommends
Install-Module -Name PSReadLine -AllowPrerelease -Scope CurrentUser -Force -SkipPublisherCheck
Import module
Import-Module PSReadLine
#method2
if ($host.Name -eq ‘ConsoleHost’)
{
Import-Module PSReadLine
}
all psreadline plugin
Set-PSReadLineOption -PredictionSource History
Set-PSReadLineOption -PredictionViewStyle ListView
Set-PSReadLineKeyHandler -key Tab -Function Complete
Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete
Set-PSReadlineKeyHandler -Chord ctrl+x -Function ViExit
Set-PSReadLineKeyHandler -Chord ‘Ctrl+d’ -Function DeleteChar
Set-PSReadlineKeyHandler -Chord ctrl+w -Function BackwardDeleteWord
Set-PSReadlineKeyHandler -Chord ctrl+e -Function EndOfLine
Set-PSReadlineKeyHandler -Chord ctrl+a -Function BeginningOfLine
Set-PSReadLineKeyHandler -Key Alt+B -Function SelectShellBackwardWord
Set-PSReadLineKeyHandler -Key Alt+F -Function SelectShellForwardWord
# CaptureScreen is good for blog posts or emails showing a transaction
# of what you did when asking for help or demonstrating a technique.
#ctrl+c and ctrl+d to copy terminal
#ctrl+v to paste
Set-PSReadLineKeyHandler -Chord ‘Ctrl+d,Ctrl+c’ -Function CaptureScreen
if you feel like the color is too light and partial can’t read it might be the color, so you can add the color like below:
Command = ‘Yellow’
Parameter = ‘Green’
String = ‘DarkCyan’
}
Zoxide(directory jumper)
This lets you navigate the file system based on your cd command history, which just renumber your last command’s directory.
Install-Module -Name Z –Force
So imagine every time go to a specific location like cd C:UsersUserDownloads
But if we visit the directory once, it will remember it, so next time you can just type z with the directory or file name, like z Download, it will access to cd C:UsersUserDownloads. It will recognize the path already.
PSFzf(Fuzzy finder)
This is a tool like an interactive search bar on your terminal command line that allows regex matching, and filtering files, or directories.
iNSTALL SCOOP (if you have scoop installed skip this part)
Install fzf an pszf
Install-Module -Name PSFzf -Scope CurrentUser -Force #powershell
Import module into the profile
# Override PSReadLine’s history search
Set-PsFzfOption -PSReadlineChordProvider ‘Ctrl+f’ -PSReadlineChordReverseHistory ‘Ctrl+r’
Below is how to use fzf to search your file or history command:
Ctrl+r(Fzf Reverse Fuzzy Search):to fuzzily search your command searches your history, similar to the history command, and run select or use it
Alt+c (Fzf Set Location): fuzzily search for a directory in your home directory and allow to cd to the directory. Basely this is quickly selected to subdirectory.
CTRL-f (Fzf Provider Select): to fuzzily search for a file or directory in your home directory and select it will get the path of it
Note: In psreadline if you use the Set-PSReadLineOption -EditMode Emacs then probably alt+c you will not be able to use, due to the hotkey is been conflict, which psreadline will take higher priority. in the below picture you can see alt+c is been conflict, so if you use alt+c it will be a capitalized word in this case.
If I try to change the conflict function capitalize word using this Set-PSReadLineKeyHandler -Chord ‘Alt+Shift+C’ -Function CapitalizeWord it still won’t change, probably it’s been hotcode.
So there are two solutions to fix it:
Method1: don’t use emac, change to window or vi mode
method2: use the alternative command as a function to use it
layout fzf
Layout allows you to adjust the percentage of the navigator bar , and adjust the total result position, like below. You can add it into function when next time you want to use just call function instead of typing complicate comamnd.
preview files in fzf
This allows you to preview or read the file without opening the file to see whether this is the file you want. You can also add texteditor in front when you enter the file allowing you to modify it.
install
preview file
Preview and enter the file to modify on specfic text editor
vim $(fzf –preview ‘bat –style=numbers –color=always –line-range :500 {}’)
}
search syntax
You can use this related syntax to search your file
‘wild: include wild
!^music: do not start with music
!.mp3$: do not end with .mp3
!test: do not include test
^music: start with music
.mp3$ : end with .mp3
FastFetch
Fastfetch is an alternative to neofetch tool that will show your system information. You can find more information on think fastfetch link. This awesome-fetch provides many alternative related tools.
fastfetch –gen-config
#location window: C:Userstest.configfastfetchconfig.jsonc
#load customer cfg:
fastfetch –load-config /path/to/config_file
fastfetch –load-config .aa.jsonc
#SHOW ONLY HARDWARE:
fastfetch -c hardware
#PRINT LOGOS:
fastfetch –print-logos
#USE LOGO:
fastfetch –logo sparky
#print all logo:
fastfetch –print-logos
#USE CERTAIN COLOR :
fastfetch –color blue
YOu can find many more preset examples here to see more settings.
window terminal some setting
Automatic copy string when select it
Method1: adding into the window terminal
Open terminal setting shortcut: ctrl+shift+p
Select will copy: copyonselect=true
Method2: add into profile
You can also automatically add into the profile:
function pst { Get-Clipboard }
Paste multiply line pop warming
If you copy multiple lines and paste them into the window terminal will pop warming, to disable the warming we can set Multipastingwarming=false
Clear-Hidden showing the terminal logo
Powershell core release new version 7.4.2 will pop, you can hide this message or logo, just add -nologo into the window terminal like below
conclusion
In this post I just wish to keep it simple on how to set up oh-my-posh, however, there are many more to cover. I have another post of Medium which cover a lot of detail. I wish to make it short in this post, there are many of the psreadline I didn’t make more detail on each function.