Shell & promptNeeds PSReadLine 2.0+
PowerShell
Command-line colors in PSReadLine, the same as the fish port: gold commands, orange keywords and pipes, sage parameters and types, avocado strings, terracotta variables. On PowerShell 7.2+ it also sets $PSStyle, so tables, errors, progress bars and Get-ChildItem listings (gold directories) match. Keys an older PSReadLine doesn't know are skipped. The terminal's own colors come from your terminal's port.
Showing WalnutTunnelEnamelMoquetteDeep LevelPortlandGuimardCatacombesCarrelage. Switch flavors with the bullets up top.
PowerShell Report a problem with this portReport a problem with this portReport a problem with this portReport a problem with this portReport a problem with this portReport a problem with this portReport a problem with this portReport a problem with this portReport a problem with this port
The quick way
The installer sets it up for you, then tells you the one thing it can't do. More ways to install
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor walnut --only powershell
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor tunnel --only powershell
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor enamel --only powershell
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor moquette --only powershell
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor deep --only powershell
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor portland --only powershell
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor guimard --only powershell
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor catacombes --only powershell
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor carrelage --only powershell
Turn it on
. "$PSScriptRoot/subway-seat.ps1". "$PSScriptRoot/subway-seat-tunnel.ps1". "$PSScriptRoot/subway-seat-enamel.ps1". "$PSScriptRoot/london-moquette.ps1". "$PSScriptRoot/london-deep-level.ps1". "$PSScriptRoot/london-portland.ps1". "$PSScriptRoot/paris-guimard.ps1". "$PSScriptRoot/paris-catacombes.ps1". "$PSScriptRoot/paris-carrelage.ps1"Follow light and dark
One setting that changes with your system’s light and dark mode, no switching by hand.
$dark = $true
if ($IsMacOS) { $dark = (defaults read -g AppleInterfaceStyle 2>$null) -eq 'Dark' }
elseif ($IsWindows -or $PSVersionTable.PSEdition -eq 'Desktop') {
$dark = (Get-ItemPropertyValue 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize' AppsUseLightTheme -ErrorAction Ignore) -ne 1
}
. "$PSScriptRoot/$(if ($dark) { 'subway-seat' } else { 'subway-seat-enamel' }).ps1"The files
subway-seat.ps1save as ~/.config/powershell/subway-seat.ps1on Windows, put it next to $PROFILE (Documents\PowerShell\).
# Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
# Subway Seat for PowerShell: PSReadLine token colors, and $PSStyle on PowerShell 7.2+.
# Dot-source it from your profile: . "$PSScriptRoot/subway-seat.ps1"
# Needs a terminal with 24-bit color (Windows Terminal, iTerm2, Ghostty, …).
& {
$esc = [char]27
$colors = @{
Default = "${esc}[38;2;237;220;188m" # text
Command = "${esc}[38;2;243;191;69m" # yellow
Parameter = "${esc}[38;2;134;173;149m" # sage
String = "${esc}[38;2;173;185;86m" # green
Operator = "${esc}[38;2;236;127;49m" # orange
Variable = "${esc}[38;2;244;168;126m" # clay
Member = "${esc}[38;2;217;198;163m" # subtext1
Number = "${esc}[38;2;255;131;115m" # red_hi
Type = "${esc}[38;2;134;173;149m" # sage
Keyword = "${esc}[38;2;236;127;49m" # orange
Comment = "${esc}[3;38;2;150;123;92m" # overlay1, italic
Error = "${esc}[38;2;255;131;115m" # red_hi
Emphasis = "${esc}[1;38;2;243;191;69m" # yellow, bold: search matches
Selection = "${esc}[1;38;2;248;236;212;48;2;99;73;50m" # text_hi on the selection ground
ContinuationPrompt = "${esc}[38;2;150;123;92m" # overlay1
InlinePrediction = "${esc}[38;2;123;96;71m" # overlay0, like fish autosuggestions
ListPrediction = "${esc}[38;2;236;127;49m" # orange: the > marker and source
ListPredictionSelected = "${esc}[48;2;81;59;39m" # surface1 ground
ListPredictionTooltip = "${esc}[3;38;2;150;123;92m" # overlay1, italic
}
if (Get-Command Set-PSReadLineOption -ErrorAction Ignore) {
# Drop keys this PSReadLine doesn't have (2.0 lacks the prediction colors).
$known = (Get-PSReadLineOption).PSObject.Properties.Name
foreach ($key in @($colors.Keys)) {
$property = if ($key -eq 'Default') { 'DefaultTokenColor' } else { "${key}Color" }
if ($property -notin $known) { $colors.Remove($key) }
}
Set-PSReadLineOption -Colors $colors
}
if ($PSStyle) {
$formatting = @{
FormatAccent = "${esc}[1;38;2;243;191;69m"
TableHeader = "${esc}[1;38;2;243;191;69m"
CustomTableHeaderLabel = "${esc}[1;3;38;2;243;191;69m"
ErrorAccent = "${esc}[1;38;2;236;127;49m"
Error = "${esc}[1;38;2;255;131;115m"
Warning = "${esc}[1;38;2;243;191;69m"
Verbose = "${esc}[38;2;127;155;174m"
Debug = "${esc}[38;2;134;173;149m"
FeedbackName = "${esc}[38;2;236;127;49m"
FeedbackText = "${esc}[38;2;217;198;163m"
FeedbackAction = "${esc}[38;2;243;191;69m"
}
foreach ($key in $formatting.Keys) {
if ($PSStyle.Formatting.PSObject.Properties[$key]) { $PSStyle.Formatting.$key = $formatting[$key] }
}
$PSStyle.Progress.Style = "${esc}[1;38;2;243;191;69m"
if ($PSStyle.PSObject.Properties['FileInfo']) {
$PSStyle.FileInfo.Directory = "${esc}[1;38;2;243;191;69m"
$PSStyle.FileInfo.SymbolicLink = "${esc}[38;2;134;173;149m"
$PSStyle.FileInfo.Executable = "${esc}[1;38;2;173;185;86m"
foreach ($ext in '.zip', '.tgz', '.gz', '.tar', '.nupkg', '.cab', '.7z') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;255;131;115m" }
foreach ($ext in '.ps1', '.psd1', '.psm1', '.ps1xml') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;134;173;149m" }
}
}
}subway-seat-tunnel.ps1save as ~/.config/powershell/subway-seat-tunnel.ps1on Windows, put it next to $PROFILE (Documents\PowerShell\).
# Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
# Subway Seat Tunnel for PowerShell: PSReadLine token colors, and $PSStyle on PowerShell 7.2+.
# Dot-source it from your profile: . "$PSScriptRoot/subway-seat-tunnel.ps1"
# Needs a terminal with 24-bit color (Windows Terminal, iTerm2, Ghostty, …).
& {
$esc = [char]27
$colors = @{
Default = "${esc}[38;2;233;216;182m" # text
Command = "${esc}[38;2;243;191;69m" # yellow
Parameter = "${esc}[38;2;134;173;149m" # sage
String = "${esc}[38;2;173;185;86m" # green
Operator = "${esc}[38;2;236;127;49m" # orange
Variable = "${esc}[38;2;244;168;126m" # clay
Member = "${esc}[38;2;214;195;160m" # subtext1
Number = "${esc}[38;2;255;131;115m" # red_hi
Type = "${esc}[38;2;134;173;149m" # sage
Keyword = "${esc}[38;2;236;127;49m" # orange
Comment = "${esc}[3;38;2;145;119;89m" # overlay1, italic
Error = "${esc}[38;2;255;131;115m" # red_hi
Emphasis = "${esc}[1;38;2;243;191;69m" # yellow, bold: search matches
Selection = "${esc}[1;38;2;246;234;209;48;2;79;57;39m" # text_hi on the selection ground
ContinuationPrompt = "${esc}[38;2;145;119;89m" # overlay1
InlinePrediction = "${esc}[38;2;116;91;69m" # overlay0, like fish autosuggestions
ListPrediction = "${esc}[38;2;236;127;49m" # orange: the > marker and source
ListPredictionSelected = "${esc}[48;2;61;44;29m" # surface1 ground
ListPredictionTooltip = "${esc}[3;38;2;145;119;89m" # overlay1, italic
}
if (Get-Command Set-PSReadLineOption -ErrorAction Ignore) {
# Drop keys this PSReadLine doesn't have (2.0 lacks the prediction colors).
$known = (Get-PSReadLineOption).PSObject.Properties.Name
foreach ($key in @($colors.Keys)) {
$property = if ($key -eq 'Default') { 'DefaultTokenColor' } else { "${key}Color" }
if ($property -notin $known) { $colors.Remove($key) }
}
Set-PSReadLineOption -Colors $colors
}
if ($PSStyle) {
$formatting = @{
FormatAccent = "${esc}[1;38;2;243;191;69m"
TableHeader = "${esc}[1;38;2;243;191;69m"
CustomTableHeaderLabel = "${esc}[1;3;38;2;243;191;69m"
ErrorAccent = "${esc}[1;38;2;236;127;49m"
Error = "${esc}[1;38;2;255;131;115m"
Warning = "${esc}[1;38;2;243;191;69m"
Verbose = "${esc}[38;2;127;155;174m"
Debug = "${esc}[38;2;134;173;149m"
FeedbackName = "${esc}[38;2;236;127;49m"
FeedbackText = "${esc}[38;2;214;195;160m"
FeedbackAction = "${esc}[38;2;243;191;69m"
}
foreach ($key in $formatting.Keys) {
if ($PSStyle.Formatting.PSObject.Properties[$key]) { $PSStyle.Formatting.$key = $formatting[$key] }
}
$PSStyle.Progress.Style = "${esc}[1;38;2;243;191;69m"
if ($PSStyle.PSObject.Properties['FileInfo']) {
$PSStyle.FileInfo.Directory = "${esc}[1;38;2;243;191;69m"
$PSStyle.FileInfo.SymbolicLink = "${esc}[38;2;134;173;149m"
$PSStyle.FileInfo.Executable = "${esc}[1;38;2;173;185;86m"
foreach ($ext in '.zip', '.tgz', '.gz', '.tar', '.nupkg', '.cab', '.7z') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;255;131;115m" }
foreach ($ext in '.ps1', '.psd1', '.psm1', '.ps1xml') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;134;173;149m" }
}
}
}subway-seat-enamel.ps1save as ~/.config/powershell/subway-seat-enamel.ps1on Windows, put it next to $PROFILE (Documents\PowerShell\).
# Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
# Subway Seat Enamel for PowerShell: PSReadLine token colors, and $PSStyle on PowerShell 7.2+.
# Dot-source it from your profile: . "$PSScriptRoot/subway-seat-enamel.ps1"
# Needs a terminal with 24-bit color (Windows Terminal, iTerm2, Ghostty, …).
& {
$esc = [char]27
$colors = @{
Default = "${esc}[38;2;62;44;30m" # text
Command = "${esc}[38;2;151;102;8m" # yellow
Parameter = "${esc}[38;2;62;113;87m" # sage
String = "${esc}[38;2;102;116;15m" # green
Operator = "${esc}[38;2;160;72;0m" # orange
Variable = "${esc}[38;2;132;56;17m" # clay
Member = "${esc}[38;2;84;64;47m" # subtext1
Number = "${esc}[38;2;191;66;51m" # red_hi
Type = "${esc}[38;2;62;113;87m" # sage
Keyword = "${esc}[38;2;160;72;0m" # orange
Comment = "${esc}[3;38;2;140;114;84m" # overlay1, italic
Error = "${esc}[38;2;191;66;51m" # red_hi
Emphasis = "${esc}[1;38;2;151;102;8m" # yellow, bold: search matches
Selection = "${esc}[1;38;2;42;29;19;48;2;203;184;152m" # text_hi on the selection ground
ContinuationPrompt = "${esc}[38;2;140;114;84m" # overlay1
InlinePrediction = "${esc}[38;2;165;141;109m" # overlay0, like fish autosuggestions
ListPrediction = "${esc}[38;2;160;72;0m" # orange: the > marker and source
ListPredictionSelected = "${esc}[48;2;203;184;152m" # surface1 ground
ListPredictionTooltip = "${esc}[3;38;2;140;114;84m" # overlay1, italic
}
if (Get-Command Set-PSReadLineOption -ErrorAction Ignore) {
# Drop keys this PSReadLine doesn't have (2.0 lacks the prediction colors).
$known = (Get-PSReadLineOption).PSObject.Properties.Name
foreach ($key in @($colors.Keys)) {
$property = if ($key -eq 'Default') { 'DefaultTokenColor' } else { "${key}Color" }
if ($property -notin $known) { $colors.Remove($key) }
}
Set-PSReadLineOption -Colors $colors
}
if ($PSStyle) {
$formatting = @{
FormatAccent = "${esc}[1;38;2;151;102;8m"
TableHeader = "${esc}[1;38;2;151;102;8m"
CustomTableHeaderLabel = "${esc}[1;3;38;2;151;102;8m"
ErrorAccent = "${esc}[1;38;2;160;72;0m"
Error = "${esc}[1;38;2;191;66;51m"
Warning = "${esc}[1;38;2;151;102;8m"
Verbose = "${esc}[38;2;63;100;128m"
Debug = "${esc}[38;2;62;113;87m"
FeedbackName = "${esc}[38;2;160;72;0m"
FeedbackText = "${esc}[38;2;84;64;47m"
FeedbackAction = "${esc}[38;2;151;102;8m"
}
foreach ($key in $formatting.Keys) {
if ($PSStyle.Formatting.PSObject.Properties[$key]) { $PSStyle.Formatting.$key = $formatting[$key] }
}
$PSStyle.Progress.Style = "${esc}[1;38;2;151;102;8m"
if ($PSStyle.PSObject.Properties['FileInfo']) {
$PSStyle.FileInfo.Directory = "${esc}[1;38;2;151;102;8m"
$PSStyle.FileInfo.SymbolicLink = "${esc}[38;2;62;113;87m"
$PSStyle.FileInfo.Executable = "${esc}[1;38;2;102;116;15m"
foreach ($ext in '.zip', '.tgz', '.gz', '.tar', '.nupkg', '.cab', '.7z') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;191;66;51m" }
foreach ($ext in '.ps1', '.psd1', '.psm1', '.ps1xml') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;62;113;87m" }
}
}
}london-moquette.ps1save as ~/.config/powershell/london-moquette.ps1on Windows, put it next to $PROFILE (Documents\PowerShell\).
# Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
# London Moquette for PowerShell: PSReadLine token colors, and $PSStyle on PowerShell 7.2+.
# Dot-source it from your profile: . "$PSScriptRoot/london-moquette.ps1"
# Needs a terminal with 24-bit color (Windows Terminal, iTerm2, Ghostty, …).
& {
$esc = [char]27
$colors = @{
Default = "${esc}[38;2;216;222;234m" # text
Command = "${esc}[38;2;242;192;63m" # yellow
Parameter = "${esc}[38;2;84;180;181m" # sage
String = "${esc}[38;2;119;197;129m" # green
Operator = "${esc}[38;2;222;137;70m" # orange
Variable = "${esc}[38;2;174;158;220m" # clay
Member = "${esc}[38;2;193;201;216m" # subtext1
Number = "${esc}[38;2;254;132;116m" # red_hi
Type = "${esc}[38;2;84;180;181m" # sage
Keyword = "${esc}[38;2;222;137;70m" # orange
Comment = "${esc}[3;38;2;115;129;156m" # overlay1, italic
Error = "${esc}[38;2;254;132;116m" # red_hi
Emphasis = "${esc}[1;38;2;242;192;63m" # yellow, bold: search matches
Selection = "${esc}[1;38;2;233;237;245;48;2;61;79;114m" # text_hi on the selection ground
ContinuationPrompt = "${esc}[38;2;115;129;156m" # overlay1
InlinePrediction = "${esc}[38;2;87;102;133m" # overlay0, like fish autosuggestions
ListPrediction = "${esc}[38;2;222;137;70m" # orange: the > marker and source
ListPredictionSelected = "${esc}[48;2;48;63;97m" # surface1 ground
ListPredictionTooltip = "${esc}[3;38;2;115;129;156m" # overlay1, italic
}
if (Get-Command Set-PSReadLineOption -ErrorAction Ignore) {
# Drop keys this PSReadLine doesn't have (2.0 lacks the prediction colors).
$known = (Get-PSReadLineOption).PSObject.Properties.Name
foreach ($key in @($colors.Keys)) {
$property = if ($key -eq 'Default') { 'DefaultTokenColor' } else { "${key}Color" }
if ($property -notin $known) { $colors.Remove($key) }
}
Set-PSReadLineOption -Colors $colors
}
if ($PSStyle) {
$formatting = @{
FormatAccent = "${esc}[1;38;2;242;192;63m"
TableHeader = "${esc}[1;38;2;242;192;63m"
CustomTableHeaderLabel = "${esc}[1;3;38;2;242;192;63m"
ErrorAccent = "${esc}[1;38;2;222;137;70m"
Error = "${esc}[1;38;2;254;132;116m"
Warning = "${esc}[1;38;2;242;192;63m"
Verbose = "${esc}[38;2;117;149;218m"
Debug = "${esc}[38;2;84;180;181m"
FeedbackName = "${esc}[38;2;222;137;70m"
FeedbackText = "${esc}[38;2;193;201;216m"
FeedbackAction = "${esc}[38;2;242;192;63m"
}
foreach ($key in $formatting.Keys) {
if ($PSStyle.Formatting.PSObject.Properties[$key]) { $PSStyle.Formatting.$key = $formatting[$key] }
}
$PSStyle.Progress.Style = "${esc}[1;38;2;242;192;63m"
if ($PSStyle.PSObject.Properties['FileInfo']) {
$PSStyle.FileInfo.Directory = "${esc}[1;38;2;242;192;63m"
$PSStyle.FileInfo.SymbolicLink = "${esc}[38;2;84;180;181m"
$PSStyle.FileInfo.Executable = "${esc}[1;38;2;119;197;129m"
foreach ($ext in '.zip', '.tgz', '.gz', '.tar', '.nupkg', '.cab', '.7z') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;254;132;116m" }
foreach ($ext in '.ps1', '.psd1', '.psm1', '.ps1xml') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;84;180;181m" }
}
}
}london-deep-level.ps1save as ~/.config/powershell/london-deep-level.ps1on Windows, put it next to $PROFILE (Documents\PowerShell\).
# Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
# London Deep Level for PowerShell: PSReadLine token colors, and $PSStyle on PowerShell 7.2+.
# Dot-source it from your profile: . "$PSScriptRoot/london-deep-level.ps1"
# Needs a terminal with 24-bit color (Windows Terminal, iTerm2, Ghostty, …).
& {
$esc = [char]27
$colors = @{
Default = "${esc}[38;2;212;218;231m" # text
Command = "${esc}[38;2;242;192;63m" # yellow
Parameter = "${esc}[38;2;84;180;181m" # sage
String = "${esc}[38;2;119;197;129m" # green
Operator = "${esc}[38;2;222;137;70m" # orange
Variable = "${esc}[38;2;174;158;220m" # clay
Member = "${esc}[38;2;190;198;213m" # subtext1
Number = "${esc}[38;2;254;132;116m" # red_hi
Type = "${esc}[38;2;84;180;181m" # sage
Keyword = "${esc}[38;2;222;137;70m" # orange
Comment = "${esc}[3;38;2;111;124;151m" # overlay1, italic
Error = "${esc}[38;2;254;132;116m" # red_hi
Emphasis = "${esc}[1;38;2;242;192;63m" # yellow, bold: search matches
Selection = "${esc}[1;38;2;231;235;243;48;2;48;62;91m" # text_hi on the selection ground
ContinuationPrompt = "${esc}[38;2;111;124;151m" # overlay1
InlinePrediction = "${esc}[38;2;83;97;125m" # overlay0, like fish autosuggestions
ListPrediction = "${esc}[38;2;222;137;70m" # orange: the > marker and source
ListPredictionSelected = "${esc}[48;2;35;47;73m" # surface1 ground
ListPredictionTooltip = "${esc}[3;38;2;111;124;151m" # overlay1, italic
}
if (Get-Command Set-PSReadLineOption -ErrorAction Ignore) {
# Drop keys this PSReadLine doesn't have (2.0 lacks the prediction colors).
$known = (Get-PSReadLineOption).PSObject.Properties.Name
foreach ($key in @($colors.Keys)) {
$property = if ($key -eq 'Default') { 'DefaultTokenColor' } else { "${key}Color" }
if ($property -notin $known) { $colors.Remove($key) }
}
Set-PSReadLineOption -Colors $colors
}
if ($PSStyle) {
$formatting = @{
FormatAccent = "${esc}[1;38;2;242;192;63m"
TableHeader = "${esc}[1;38;2;242;192;63m"
CustomTableHeaderLabel = "${esc}[1;3;38;2;242;192;63m"
ErrorAccent = "${esc}[1;38;2;222;137;70m"
Error = "${esc}[1;38;2;254;132;116m"
Warning = "${esc}[1;38;2;242;192;63m"
Verbose = "${esc}[38;2;117;149;218m"
Debug = "${esc}[38;2;84;180;181m"
FeedbackName = "${esc}[38;2;222;137;70m"
FeedbackText = "${esc}[38;2;190;198;213m"
FeedbackAction = "${esc}[38;2;242;192;63m"
}
foreach ($key in $formatting.Keys) {
if ($PSStyle.Formatting.PSObject.Properties[$key]) { $PSStyle.Formatting.$key = $formatting[$key] }
}
$PSStyle.Progress.Style = "${esc}[1;38;2;242;192;63m"
if ($PSStyle.PSObject.Properties['FileInfo']) {
$PSStyle.FileInfo.Directory = "${esc}[1;38;2;242;192;63m"
$PSStyle.FileInfo.SymbolicLink = "${esc}[38;2;84;180;181m"
$PSStyle.FileInfo.Executable = "${esc}[1;38;2;119;197;129m"
foreach ($ext in '.zip', '.tgz', '.gz', '.tar', '.nupkg', '.cab', '.7z') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;254;132;116m" }
foreach ($ext in '.ps1', '.psd1', '.psm1', '.ps1xml') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;84;180;181m" }
}
}
}london-portland.ps1save as ~/.config/powershell/london-portland.ps1on Windows, put it next to $PROFILE (Documents\PowerShell\).
# Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
# London Portland for PowerShell: PSReadLine token colors, and $PSStyle on PowerShell 7.2+.
# Dot-source it from your profile: . "$PSScriptRoot/london-portland.ps1"
# Needs a terminal with 24-bit color (Windows Terminal, iTerm2, Ghostty, …).
& {
$esc = [char]27
$colors = @{
Default = "${esc}[38;2;41;48;64m" # text
Command = "${esc}[38;2;141;108;8m" # yellow
Parameter = "${esc}[38;2;0;115;118m" # sage
String = "${esc}[38;2;13;129;49m" # green
Operator = "${esc}[38;2;165;67;0m" # orange
Variable = "${esc}[38;2;117;95;169m" # clay
Member = "${esc}[38;2;60;69;87m" # subtext1
Number = "${esc}[38;2;204;46;37m" # red_hi
Type = "${esc}[38;2;0;115;118m" # sage
Keyword = "${esc}[38;2;165;67;0m" # orange
Comment = "${esc}[3;38;2;105;119;148m" # overlay1, italic
Error = "${esc}[38;2;204;46;37m" # red_hi
Emphasis = "${esc}[1;38;2;141;108;8m" # yellow, bold: search matches
Selection = "${esc}[1;38;2;27;32;43;48;2;168;187;226m" # text_hi on the selection ground
ContinuationPrompt = "${esc}[38;2;105;119;148m" # overlay1
InlinePrediction = "${esc}[38;2;129;146;180m" # overlay0, like fish autosuggestions
ListPrediction = "${esc}[38;2;165;67;0m" # orange: the > marker and source
ListPredictionSelected = "${esc}[48;2;168;187;226m" # surface1 ground
ListPredictionTooltip = "${esc}[3;38;2;105;119;148m" # overlay1, italic
}
if (Get-Command Set-PSReadLineOption -ErrorAction Ignore) {
# Drop keys this PSReadLine doesn't have (2.0 lacks the prediction colors).
$known = (Get-PSReadLineOption).PSObject.Properties.Name
foreach ($key in @($colors.Keys)) {
$property = if ($key -eq 'Default') { 'DefaultTokenColor' } else { "${key}Color" }
if ($property -notin $known) { $colors.Remove($key) }
}
Set-PSReadLineOption -Colors $colors
}
if ($PSStyle) {
$formatting = @{
FormatAccent = "${esc}[1;38;2;141;108;8m"
TableHeader = "${esc}[1;38;2;141;108;8m"
CustomTableHeaderLabel = "${esc}[1;3;38;2;141;108;8m"
ErrorAccent = "${esc}[1;38;2;165;67;0m"
Error = "${esc}[1;38;2;204;46;37m"
Warning = "${esc}[1;38;2;141;108;8m"
Verbose = "${esc}[38;2;0;25;168m"
Debug = "${esc}[38;2;0;115;118m"
FeedbackName = "${esc}[38;2;165;67;0m"
FeedbackText = "${esc}[38;2;60;69;87m"
FeedbackAction = "${esc}[38;2;141;108;8m"
}
foreach ($key in $formatting.Keys) {
if ($PSStyle.Formatting.PSObject.Properties[$key]) { $PSStyle.Formatting.$key = $formatting[$key] }
}
$PSStyle.Progress.Style = "${esc}[1;38;2;141;108;8m"
if ($PSStyle.PSObject.Properties['FileInfo']) {
$PSStyle.FileInfo.Directory = "${esc}[1;38;2;141;108;8m"
$PSStyle.FileInfo.SymbolicLink = "${esc}[38;2;0;115;118m"
$PSStyle.FileInfo.Executable = "${esc}[1;38;2;13;129;49m"
foreach ($ext in '.zip', '.tgz', '.gz', '.tar', '.nupkg', '.cab', '.7z') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;204;46;37m" }
foreach ($ext in '.ps1', '.psd1', '.psm1', '.ps1xml') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;0;115;118m" }
}
}
}paris-guimard.ps1save as ~/.config/powershell/paris-guimard.ps1on Windows, put it next to $PROFILE (Documents\PowerShell\).
# Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
# Paris Guimard for PowerShell: PSReadLine token colors, and $PSStyle on PowerShell 7.2+.
# Dot-source it from your profile: . "$PSScriptRoot/paris-guimard.ps1"
# Needs a terminal with 24-bit color (Windows Terminal, iTerm2, Ghostty, …).
& {
$esc = [char]27
$colors = @{
Default = "${esc}[38;2;217;225;219m" # text
Command = "${esc}[38;2;241;191;75m" # yellow
Parameter = "${esc}[38;2;84;155;159m" # sage
String = "${esc}[38;2;112;202;169m" # green
Operator = "${esc}[38;2;202;146;69m" # orange
Variable = "${esc}[38;2;250;180;156m" # clay
Member = "${esc}[38;2;194;203;197m" # subtext1
Number = "${esc}[38;2;231;135;123m" # red_hi
Type = "${esc}[38;2;84;155;159m" # sage
Keyword = "${esc}[38;2;202;146;69m" # orange
Comment = "${esc}[3;38;2;116;133;124m" # overlay1, italic
Error = "${esc}[38;2;231;135;123m" # red_hi
Emphasis = "${esc}[1;38;2;241;191;75m" # yellow, bold: search matches
Selection = "${esc}[1;38;2;233;238;236;48;2;62;85;74m" # text_hi on the selection ground
ContinuationPrompt = "${esc}[38;2;116;133;124m" # overlay1
InlinePrediction = "${esc}[38;2;88;107;97m" # overlay0, like fish autosuggestions
ListPrediction = "${esc}[38;2;202;146;69m" # orange: the > marker and source
ListPredictionSelected = "${esc}[48;2;48;70;59m" # surface1 ground
ListPredictionTooltip = "${esc}[3;38;2;116;133;124m" # overlay1, italic
}
if (Get-Command Set-PSReadLineOption -ErrorAction Ignore) {
# Drop keys this PSReadLine doesn't have (2.0 lacks the prediction colors).
$known = (Get-PSReadLineOption).PSObject.Properties.Name
foreach ($key in @($colors.Keys)) {
$property = if ($key -eq 'Default') { 'DefaultTokenColor' } else { "${key}Color" }
if ($property -notin $known) { $colors.Remove($key) }
}
Set-PSReadLineOption -Colors $colors
}
if ($PSStyle) {
$formatting = @{
FormatAccent = "${esc}[1;38;2;241;191;75m"
TableHeader = "${esc}[1;38;2;241;191;75m"
CustomTableHeaderLabel = "${esc}[1;3;38;2;241;191;75m"
ErrorAccent = "${esc}[1;38;2;202;146;69m"
Error = "${esc}[1;38;2;231;135;123m"
Warning = "${esc}[1;38;2;241;191;75m"
Verbose = "${esc}[38;2;112;155;200m"
Debug = "${esc}[38;2;84;155;159m"
FeedbackName = "${esc}[38;2;202;146;69m"
FeedbackText = "${esc}[38;2;194;203;197m"
FeedbackAction = "${esc}[38;2;241;191;75m"
}
foreach ($key in $formatting.Keys) {
if ($PSStyle.Formatting.PSObject.Properties[$key]) { $PSStyle.Formatting.$key = $formatting[$key] }
}
$PSStyle.Progress.Style = "${esc}[1;38;2;241;191;75m"
if ($PSStyle.PSObject.Properties['FileInfo']) {
$PSStyle.FileInfo.Directory = "${esc}[1;38;2;241;191;75m"
$PSStyle.FileInfo.SymbolicLink = "${esc}[38;2;84;155;159m"
$PSStyle.FileInfo.Executable = "${esc}[1;38;2;112;202;169m"
foreach ($ext in '.zip', '.tgz', '.gz', '.tar', '.nupkg', '.cab', '.7z') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;231;135;123m" }
foreach ($ext in '.ps1', '.psd1', '.psm1', '.ps1xml') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;84;155;159m" }
}
}
}paris-catacombes.ps1save as ~/.config/powershell/paris-catacombes.ps1on Windows, put it next to $PROFILE (Documents\PowerShell\).
# Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
# Paris Catacombes for PowerShell: PSReadLine token colors, and $PSStyle on PowerShell 7.2+.
# Dot-source it from your profile: . "$PSScriptRoot/paris-catacombes.ps1"
# Needs a terminal with 24-bit color (Windows Terminal, iTerm2, Ghostty, …).
& {
$esc = [char]27
$colors = @{
Default = "${esc}[38;2;212;221;215m" # text
Command = "${esc}[38;2;241;191;75m" # yellow
Parameter = "${esc}[38;2;84;155;159m" # sage
String = "${esc}[38;2;112;202;169m" # green
Operator = "${esc}[38;2;202;146;69m" # orange
Variable = "${esc}[38;2;250;180;156m" # clay
Member = "${esc}[38;2;191;200;194m" # subtext1
Number = "${esc}[38;2;231;135;123m" # red_hi
Type = "${esc}[38;2;84;155;159m" # sage
Keyword = "${esc}[38;2;202;146;69m" # orange
Comment = "${esc}[3;38;2;112;129;120m" # overlay1, italic
Error = "${esc}[38;2;231;135;123m" # red_hi
Emphasis = "${esc}[1;38;2;241;191;75m" # yellow, bold: search matches
Selection = "${esc}[1;38;2;231;236;234;48;2;49;67;58m" # text_hi on the selection ground
ContinuationPrompt = "${esc}[38;2;112;129;120m" # overlay1
InlinePrediction = "${esc}[38;2;84;101;92m" # overlay0, like fish autosuggestions
ListPrediction = "${esc}[38;2;202;146;69m" # orange: the > marker and source
ListPredictionSelected = "${esc}[48;2;36;52;44m" # surface1 ground
ListPredictionTooltip = "${esc}[3;38;2;112;129;120m" # overlay1, italic
}
if (Get-Command Set-PSReadLineOption -ErrorAction Ignore) {
# Drop keys this PSReadLine doesn't have (2.0 lacks the prediction colors).
$known = (Get-PSReadLineOption).PSObject.Properties.Name
foreach ($key in @($colors.Keys)) {
$property = if ($key -eq 'Default') { 'DefaultTokenColor' } else { "${key}Color" }
if ($property -notin $known) { $colors.Remove($key) }
}
Set-PSReadLineOption -Colors $colors
}
if ($PSStyle) {
$formatting = @{
FormatAccent = "${esc}[1;38;2;241;191;75m"
TableHeader = "${esc}[1;38;2;241;191;75m"
CustomTableHeaderLabel = "${esc}[1;3;38;2;241;191;75m"
ErrorAccent = "${esc}[1;38;2;202;146;69m"
Error = "${esc}[1;38;2;231;135;123m"
Warning = "${esc}[1;38;2;241;191;75m"
Verbose = "${esc}[38;2;112;155;200m"
Debug = "${esc}[38;2;84;155;159m"
FeedbackName = "${esc}[38;2;202;146;69m"
FeedbackText = "${esc}[38;2;191;200;194m"
FeedbackAction = "${esc}[38;2;241;191;75m"
}
foreach ($key in $formatting.Keys) {
if ($PSStyle.Formatting.PSObject.Properties[$key]) { $PSStyle.Formatting.$key = $formatting[$key] }
}
$PSStyle.Progress.Style = "${esc}[1;38;2;241;191;75m"
if ($PSStyle.PSObject.Properties['FileInfo']) {
$PSStyle.FileInfo.Directory = "${esc}[1;38;2;241;191;75m"
$PSStyle.FileInfo.SymbolicLink = "${esc}[38;2;84;155;159m"
$PSStyle.FileInfo.Executable = "${esc}[1;38;2;112;202;169m"
foreach ($ext in '.zip', '.tgz', '.gz', '.tar', '.nupkg', '.cab', '.7z') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;231;135;123m" }
foreach ($ext in '.ps1', '.psd1', '.psm1', '.ps1xml') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;84;155;159m" }
}
}
}paris-carrelage.ps1save as ~/.config/powershell/paris-carrelage.ps1on Windows, put it next to $PROFILE (Documents\PowerShell\).
# Subway Seat — generated from palette.py by build.py. Edit the palette, not this file.
# Paris Carrelage for PowerShell: PSReadLine token colors, and $PSStyle on PowerShell 7.2+.
# Dot-source it from your profile: . "$PSScriptRoot/paris-carrelage.ps1"
# Needs a terminal with 24-bit color (Windows Terminal, iTerm2, Ghostty, …).
& {
$esc = [char]27
$colors = @{
Default = "${esc}[38;2;39;52;47m" # text
Command = "${esc}[38;2;145;109;7m" # yellow
Parameter = "${esc}[38;2;0;98;103m" # sage
String = "${esc}[38;2;33;131;102m" # green
Operator = "${esc}[38;2;118;76;0m" # orange
Variable = "${esc}[38;2;179;107;81m" # clay
Member = "${esc}[38;2;59;71;66m" # subtext1
Number = "${esc}[38;2;172;59;50m" # red_hi
Type = "${esc}[38;2;0;98;103m" # sage
Keyword = "${esc}[38;2;118;76;0m" # orange
Comment = "${esc}[3;38;2;108;124;118m" # overlay1, italic
Error = "${esc}[38;2;172;59;50m" # red_hi
Emphasis = "${esc}[1;38;2;145;109;7m" # yellow, bold: search matches
Selection = "${esc}[1;38;2;25;34;30;48;2;176;191;187m" # text_hi on the selection ground
ContinuationPrompt = "${esc}[38;2;108;124;118m" # overlay1
InlinePrediction = "${esc}[38;2;133;151;146m" # overlay0, like fish autosuggestions
ListPrediction = "${esc}[38;2;118;76;0m" # orange: the > marker and source
ListPredictionSelected = "${esc}[48;2;176;191;187m" # surface1 ground
ListPredictionTooltip = "${esc}[3;38;2;108;124;118m" # overlay1, italic
}
if (Get-Command Set-PSReadLineOption -ErrorAction Ignore) {
# Drop keys this PSReadLine doesn't have (2.0 lacks the prediction colors).
$known = (Get-PSReadLineOption).PSObject.Properties.Name
foreach ($key in @($colors.Keys)) {
$property = if ($key -eq 'Default') { 'DefaultTokenColor' } else { "${key}Color" }
if ($property -notin $known) { $colors.Remove($key) }
}
Set-PSReadLineOption -Colors $colors
}
if ($PSStyle) {
$formatting = @{
FormatAccent = "${esc}[1;38;2;145;109;7m"
TableHeader = "${esc}[1;38;2;145;109;7m"
CustomTableHeaderLabel = "${esc}[1;3;38;2;145;109;7m"
ErrorAccent = "${esc}[1;38;2;118;76;0m"
Error = "${esc}[1;38;2;172;59;50m"
Warning = "${esc}[1;38;2;145;109;7m"
Verbose = "${esc}[38;2;37;98;155m"
Debug = "${esc}[38;2;0;98;103m"
FeedbackName = "${esc}[38;2;118;76;0m"
FeedbackText = "${esc}[38;2;59;71;66m"
FeedbackAction = "${esc}[38;2;145;109;7m"
}
foreach ($key in $formatting.Keys) {
if ($PSStyle.Formatting.PSObject.Properties[$key]) { $PSStyle.Formatting.$key = $formatting[$key] }
}
$PSStyle.Progress.Style = "${esc}[1;38;2;145;109;7m"
if ($PSStyle.PSObject.Properties['FileInfo']) {
$PSStyle.FileInfo.Directory = "${esc}[1;38;2;145;109;7m"
$PSStyle.FileInfo.SymbolicLink = "${esc}[38;2;0;98;103m"
$PSStyle.FileInfo.Executable = "${esc}[1;38;2;33;131;102m"
foreach ($ext in '.zip', '.tgz', '.gz', '.tar', '.nupkg', '.cab', '.7z') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;172;59;50m" }
foreach ($ext in '.ps1', '.psd1', '.psm1', '.ps1xml') { $PSStyle.FileInfo.Extension[$ext] = "${esc}[38;2;0;98;103m" }
}
}
}