# encoding: ascii # api: powershell # title: Set-Prompt.ps1 # description: My prompt function for PS 6.0.0.9 — There’s a bug causing an echo if you use write-host in your prompt on unix with PS 6 currently, so I rewrote my prompt to just output a string with escape sequences… # version: 1.0 # type: function # author: Joel Bennett # license: CC0 # x-poshcode-id: 6485 # x-archived: 2016-10-24T03:43:35 # x-published: 2016-08-21T17:04:00 # # $e = ([char]27) + "[" $global:ANSI = @{ ESC = ([char]27) + "[" Clear = "${e}0m" fg = @{ Clear = "${e}39m" Black = "${e}30m"; DarkGray = "${e}90m" DarkRed = "${e}31m"; Red = "${e}91m" DarkGreen = "${e}32m"; Green = "${e}92m" DarkYellow = "${e}33m"; Yellow = "${e}93m" DarkBlue = "${e}34m"; Blue = "${e}94m" DarkMagenta = "${e}35m"; Magenta = "${e}95m" DarkCyan = "${e}36m"; Cyan = "${e}96m" Gray = "${e}37m"; White = "${e}97m" } bg = @{ Clear = "${e}49m" Black = "${e}40m"; DarkGray = "${e}100m" DarkRed = "${e}41m"; Red = "${e}101m" DarkGreen = "${e}42m"; Green = "${e}102m" DarkYellow = "${e}43m"; Yellow = "${e}103m" DarkBlue = "${e}44m"; Blue = "${e}104m" DarkMagenta = "${e}45m"; Magenta = "${e}105m" DarkCyan = "${e}46m"; Cyan = "${e}106m" Gray = "${e}47m"; White = "${e}107m" } } $global:ANSI.fg.Default = $global:ANSI.fg."$($Host.UI.RawUI.ForegroundColor)" $global:ANSI.fg.Background = $global:ANSI.fg."$($Host.UI.RawUI.BackgroundColor)" $global:ANSI.bg.Default = $global:ANSI.bg."$($Host.UI.RawUI.BackgroundColor)" function global:prompt { # FIRST, make a note if there was an error in the previous command $err = !$? # PowerLine font characters $RIGHT = [char]0xe0b0 # Solid, right facing triangle $GT = [char]0xe0b1 # right facing triangle $LEFT = [char]0xe0b2 # Solid, right facing triangle $LT = [char]0xe0b3 # right facing triangle $BRANCH = [char]0xe0a0 # Branch symbol $LOCK = [char]0xe0a2 # Padlock $RAQUO = [char]0x203a # Single right-pointing angle quote ? $GEAR = [char]0x2699 # The settings icon, I use it for debug $EX = [char]0x27a6 # The X that looks like a checkbox. $POWER = [char]0x26a1 # The Power lightning-bolt icon $MID = [char]0xB7 # Mid dot (I used to use this for pushd counters) try { # Put the path in the title ... (don't restrict this to the FileSystem) $Host.UI.RawUI.WindowTitle = "{0} - {1} ({2})" -f $global:WindowTitlePrefix, (Convert-Path $pwd), $pwd.Provider.Name # Make sure Windows & .Net know where we are # They can only handle the FileSystem, and not in .Net Core [Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath } catch {} # Determine what nesting level we are at (if any) $Nesting = "$GEAR" * $NestedPromptLevel # Generate PUSHD(push-location) Stack level string $Stack = (Get-Location -Stack).count $(&{ # If we can use advanced ANSI sequences, we can do some extra cool things if($env:ConEmuANSI -eq "ON" -or $env:TERM -match "xterm") { $w = [Console]::BufferWidth $local:LastCommand = Get-History -Count 1 $Elapsed = if($global:LastCommand.ID -ne $LastCommand.Id) { $global:LastCommand = $local:LastCommand $Duration = $LastCommand.EndExecutionTime - $LastCommand.StartExecutionTime if($Duration.TotalSeconds -ge 1.0) { "{0:h\:mm\:ss\.ffff}" -f $Duration } else { "{0}ms" -f $Duration.TotalMilliseconds } } else { '' } # 11 chars is "hh:mm:ss tt" $ElapsedLength = [Math]::Max($Elapsed.Length,12) $ElapsedPadding = " " * ($ElapsedLength - $Elapsed.Length) $TimeStamp = "{0:h:mm:ss tt}" -f [DateTime]::Now "${e}s" # MARK LOCATION if($Elapsed) { # Go UP one line and write at the end of that ... # TODO: If there's anything there, and add a line otherwise "${e}1A${e}${w}G${e}${ElapsedLength}D" "$($ANSI.fg.DarkGray)$($ANSI.bg.Default)$ElapsedPadding$LEFT" # DarkGray on Transparent "$($ANSI.fg.White)$($ANSI.bg.DarkGray)$Elapsed" # White on DarkGray "${e}u" # RECALL LOCATION } # Go to the end of the line and put a timestamp there ... "${e}${w}G${e}$($TimeStamp.Length)D" "$($ANSI.fg.DarkGray)$($ANSI.bg.Default)$LEFT" # DarkGray on Transparent "$($ANSI.fg.White)$($ANSI.bg.DarkGray)$TimeStamp" # White on DarkGray "${e}u" # RECALL LOCATION } # Output prompt string # Set some colors that I might use in other scripts if($err) { $fg_ = $ANSI.fg.DarkRed $bg_ = $ANSI.bg.DarkRed } else { $fg_ = $ANSI.fg.DarkBlue $bg_ = $ANSI.bg.DarkBlue } "$($ANSI.fg.DarkYellow)$($ANSI.bg.DarkYellow)<$($ANSI.fg.White)$($ANSI.bg.DarkYellow)#$($myinvocation.historyID)${Nesting}" if($Stack) { "$($ANSI.fg.DarkYellow)$($ANSI.bg.DarkGray)$RIGHT" "$($ANSI.fg.White)$($ANSI.bg.DarkGray)$RAQUO$Stack" # White on DarkGray "$($ANSI.fg.DarkGray)$bg_$RIGHT" # DarkGray on the prompt color } else { "$($ANSI.fg.DarkYellow)$bg_$RIGHT" } "$($ANSI.fg.White)$bg_$($pwd.Drive.Name):${GT}$(Split-Path $pwd.Path -Leaf)" if($global:VcsStatusEnabled) { # It's worth noting that I have my own PSGit module... Write-VcsStatus } else { "$fg_$($ANSI.bg.Default)$RIGHT$($ANSI.fg.Background)$($ANSI.bg.Default)#>$($ANSI.Clear)" } }) -join "" }