Skip to content
Subway SeatSubway SeatSubway Seat
← All ports

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

In your profile ($PROFILE: ~/.config/powershell/Microsoft.PowerShell_profile.ps1 on macOS and Linux, Documents\PowerShell\ on Windows)
. "$PSScriptRoot/subway-seat.ps1"
In your profile ($PROFILE: ~/.config/powershell/Microsoft.PowerShell_profile.ps1 on macOS and Linux, Documents\PowerShell\ on Windows)
. "$PSScriptRoot/subway-seat-tunnel.ps1"
In your profile ($PROFILE: ~/.config/powershell/Microsoft.PowerShell_profile.ps1 on macOS and Linux, Documents\PowerShell\ on Windows)
. "$PSScriptRoot/subway-seat-enamel.ps1"
In your profile ($PROFILE: ~/.config/powershell/Microsoft.PowerShell_profile.ps1 on macOS and Linux, Documents\PowerShell\ on Windows)
. "$PSScriptRoot/london-moquette.ps1"
In your profile ($PROFILE: ~/.config/powershell/Microsoft.PowerShell_profile.ps1 on macOS and Linux, Documents\PowerShell\ on Windows)
. "$PSScriptRoot/london-deep-level.ps1"
In your profile ($PROFILE: ~/.config/powershell/Microsoft.PowerShell_profile.ps1 on macOS and Linux, Documents\PowerShell\ on Windows)
. "$PSScriptRoot/london-portland.ps1"
In your profile ($PROFILE: ~/.config/powershell/Microsoft.PowerShell_profile.ps1 on macOS and Linux, Documents\PowerShell\ on Windows)
. "$PSScriptRoot/paris-guimard.ps1"
In your profile ($PROFILE: ~/.config/powershell/Microsoft.PowerShell_profile.ps1 on macOS and Linux, Documents\PowerShell\ on Windows)
. "$PSScriptRoot/paris-catacombes.ps1"
In your profile ($PROFILE: ~/.config/powershell/Microsoft.PowerShell_profile.ps1 on macOS and Linux, Documents\PowerShell\ on Windows)
. "$PSScriptRoot/paris-carrelage.ps1"

Follow light and dark

One setting that changes with your system’s light and dark mode, no switching by hand.

In your profile, instead of the line above (picks a flavor from the system appearance when PowerShell starts; Linux stays dark)
$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.ps1
on 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.ps1
on 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.ps1
on 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.ps1
on 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.ps1
on 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.ps1
on 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.ps1
on 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.ps1
on 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.ps1
on 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" }
        }
    }
}