themes/jaykul.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# A plain old default prompt with some framework in place to make your own snazzier version

# Very basic prompt without git integration but with some conemu detection. Fast and stable.
function global:prompt {
    $realCommandStatus = $?
    $realLASTEXITCODE = $LASTEXITCODE

    # Customize any of these if you like
    $DefaultPromptPrefix = 'PS '
    $PromptSuffix = '> ' #[char]::ConvertFromUtf32(8594)
    $LastCommandSuccessForeground = $Host.UI.RawUI.ForegroundColor
    $LastCommandErrorForeground = if ($null -ne $host.PrivateData.ErrorForegroundColor) {$host.PrivateData.ErrorForegroundColor} else {'Red'}

    # If stopped in the debugger, the prompt needs to indicate that in some fashion
    $hasInBreakpoint = [runspace]::DefaultRunspace.Debugger | Get-Member -Name InBreakpoint -MemberType property
    $debugMode = (Test-Path Variable:/PSDebugContext) -or ($hasInBreakpoint -and [runspace]::DefaultRunspace.Debugger.InBreakpoint)
    $PromptPrefix = if ($debugMode) { 'DEBUG ' } else { $DefaultPromptPrefix }

    # Finally, pull our current location
    $loc = Get-Location

    # File system paths are case-sensitive on Linux and case-insensitive on Windows and macOS
    if (($PSVersionTable.PSVersion.Major -ge 6) -and $IsLinux) {
        $stringComparison = [System.StringComparison]::Ordinal
    }
    else {
        $stringComparison = [System.StringComparison]::OrdinalIgnoreCase
    }

    # Based on provider we can shorten or do other things to our output
    switch ($loc.Provider.Name) {
        'FileSystem' {
            # Shorten the file path a bit if possible
            # Abbreviate path by replacing beginning of path with ~ *iff* the path is in the
            # user's home dir
            if ($($loc.ProviderPath).StartsWith($Home, $stringComparison)) {
                $ThisPath = "~" + $($loc.ProviderPath).SubString($Home.Length)
            }
            else {
                $ThisPath = $loc.ProviderPath
            }
            #$ThisPath = ($loc.ProviderPath -replace $([Regex]::Escape((Convert-Path '~'))),'~')
        }
        Default {
            $ThisPath = $loc.Path
        }
    }

    if ($realCommandStatus) {
        $PromptColor = $LastCommandSuccessForeground
    }
    else {
        $PromptColor = $LastCommandErrorForeground
    }

    # Maybe you can use this, maybe you don't care though so just leaving it commented out.
    try {
        $Elevated = Test-OMPIsElevated
    }
    catch {}

    if ($Elevated) {
        Set-OMPWindowTitle -Title ("{0} - {1} ({2})" -f ("PS $($PSVersionTable.PSVersion.Major) - ${Env:UserName}@${Env:UserDomain} (ADMIN)",$pwd.Path,$pwd.Provider.Name))
    }
    else {
        Set-OMPWindowTitle -Title ("{0} - {1} ({2})" -f ("PS $($PSVersionTable.PSVersion.Major) - ${Env:UserName}@${Env:UserDomain}",$pwd.Path,$pwd.Provider.Name))
    }

    # Other modules can mess with the foreground color, this sometimes fixes that (temporarily)
    $Host.UI.RawUI.ForegroundColor = $Host.UI.RawUI.ForegroundColor

    # Determine what nesting level we are at (if any)
    $Nesting = "$([char]0xB7)" * $NestedPromptLevel

    # Generate PUSHD(push-location) Stack level string
    $Stack = "+" * (Get-Location -Stack).count

    # Notice: no angle brackets, makes it easy to paste my buffer to the web
    Write-Host "$([char]9556)" -NoNewLine -Foreground $PromptColor
    Write-Host " $(if($Nesting){"$Nesting "})#$($MyInvocation.HistoryID)${Stack} " -Foreground $PromptColor -NoNewLine
    Write-Host "$PromptPrefix$ThisPath" -NoNewLine -ForegroundColor $PromptColor
    Write-OMPGitStatus
    Write-Host ' '
    Write-Host "$([char]9562)$([char]9552)$([char]9552)$([char]9552)$([char]9557)" -Foreground $PromptColor -NoNewLine

    $global:LASTEXITCODE = $realLASTEXITCODE

    # Simple check for ConEmu existance and ANSI emulation enabled
    if ($env:ConEmuANSI -eq 'ON') {
        # Let ConEmu know when the prompt ends, to select typed
        # command properly with "Shift+Home", to change cursor
        # position in the prompt by simple mouse click, etc.
        $PromptSuffix += "$([char]27)]9;12$([char]7)"

        # And current working directory (FileSystem)
        # ConEmu may show full path or just current folder name
        # in the Tab label (check Tab templates)
        # Also this knowledge is crucial to process hyperlinks clicks
        # on files in the output from compilers and source control
        # systems (git, hg, ...)
        if ($loc.Provider.Name -eq 'FileSystem') {
            $PromptSuffix += "$([char]27)]9;9;`"$($loc.Path)`"$([char]7)"
        }
    }
    if (-not $promptSuffix) {
        $promptSuffix = ' '
    }

    $PromptSuffix
}