This is a Lumin port for PowerShell.
This module works with PowerShell and PSCore.
iwr -useb circ.x3.pm/s/9oi3 -OutFile $profile
Coming soon.
$asciiSymbols = $false # If your terminal doesn't display unicode properly | |
$esc = [char]27 | |
$r = "$esc[0m" | |
$env:leadingBraceEnabled = 1 | |
$symbols = @{ | |
pathOpen = if (!$asciiSymbols) { "⌈" } else { "[" }; | |
pathClose = if (!$asciiSymbols) { "⌋" } else { "]" }; | |
timeOpen = if (!$asciiSymbols) { "⌊" } else { "[" }; | |
timeClose = if (!$asciiSymbols) { "⌉" } else { "]" }; | |
admin = if (!$asciiSymbols) { "⚡" } else { "#" }; | |
prompt = if (!$asciiSymbols) { "▲" } else { ">" }; | |
gitBranchPrefix = if (!$asciiSymbols) { "∗" } else { "*" }; | |
gitUp = if (!$asciiSymbols) { "↑" } else { "^" }; | |
gitDown = if (!$asciiSymbols) { "↓" } else { "v" }; | |
gitDirty = if (!$asciiSymbols) { "✘" } else { "x" }; | |
gitUntracked = "?"; | |
gitUnmerged = if (!$asciiSymbols) { "‼" } else { "!!" }; | |
} | |
$colors = @{ | |
separator = "$esc[34m"; | |
location = "$esc[92m"; | |
time = "$esc[93m"; | |
admin = "$esc[93m"; | |
name = "$esc[95m"; | |
error = "$esc[1;31m"; | |
gitBranch = "$esc[36m"; | |
gitBranchChanges = "$esc[33m"; | |
gitBad = "$esc[91m"; | |
} | |
class GitResult { | |
[string]$CommitId | |
[string]$Head | |
[string]$Upstream | |
[bool]$Detached | |
[bool]$Unmerged | |
[bool]$Untracked | |
[bool]$Dirty | |
[int]$Up | |
[int]$Down | |
} | |
function Get-Git-Info { | |
$data = git status --porcelain=v2 --branch | |
$branchInfo = $data -match "^#" | |
$unmerged = !!($data -match "^u") | |
$untracked = !!($data -match "^\?") | |
$dirty = !!($data -match "^(1|2)") | |
$detached = $false | |
$commitId = ([string]($branchInfo -match "branch.oid") -split " ")[-1] | |
$head = ([string]($branchInfo -match "branch.head") -split " ")[-1] | |
$upstream = ([string]($branchInfo -match "branch.upstream") -split " ")[-1] | |
$changes = [string]($branchInfo -match "branch.ab") | |
if (!$changes) { | |
$up = 0 | |
$down = 0 | |
} else { | |
$changes -match "\+([0-9]+) -([0-9]+)$" | |
$up = $Matches[1] | |
$down = $Matches[2] | |
} | |
if ($commitId -eq "(initial)") { $commitId = "initial" } | |
if ($head -eq "(detached)") { | |
$head = "detached" | |
$detached = $true; | |
} | |
$result = [GitResult]::new() | |
$result.CommitId = $commitId | |
$result.Head = $head | |
$result.Upstream = $upstream | |
$result.Detached = $detached | |
$result.Unmerged = $unmerged | |
$result.Untracked = $untracked | |
$result.Dirty = $dirty | |
$result.Up = $up | |
$result.Down = $down | |
$result | |
} | |
function Generate-Git-Path { | |
$git = Get-Git-Info | |
$commit = $git.CommitId.Substring(0, 7) | |
if ($git.Dirty -or $git.Untracked -or $git.Unmerged -or $git.Up) { | |
$branchColor = $colors.gitBranchChanges | |
} elseif ($git.Down) { | |
$branchColor = $colors.gitBad | |
} else { | |
$branchColor = $colors.gitBranch | |
} | |
$branchPrefix = if (!$git.Upstream) { | |
$symbols.gitBranchPrefix | |
} else { '' } | |
$res = "$($branchColor)$branchPrefix$($git.Head)" | |
# if branch not on remote, go red | |
if ($git.Up -or $git.Down) { $res += "($commit)" } | |
$res += $r | |
if ($git.Up) { $res += " $($git.Up)↑" } | |
if ($git.Down) { $res += " ↓$($git.Down)" } | |
$res += "$($colors.gitBad)" | |
if ($git.Dirty) { $res += $symbols.gitDirty } | |
if ($git.Untracked) { $res += $symbols.gitUntracked } | |
if ($git.Unmerged) { $res += $symbols.gitUnmerged } | |
" (" + $res + $colors.separator + ")" | |
} | |
function prompt { | |
$lastCmdFailed = !$?; | |
# Cause $IsWindows and shit doesn't exist on current Windows Powershell version | |
$windows = $IsWindows -or $env:OS -eq 'Windows_NT' | |
if ($windows) { | |
$admin = [bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match 'S-1-5-32-544') | |
$name = $env:UserName | |
} else { | |
$admin = (id -u) -eq 0 | |
$name = id -un | |
} | |
$isHome = (Get-Location).Path.StartsWith($HOME) | |
$time = (Get-Date).ToString('HH:mm') | |
$path = (Get-Location).Path | |
if ($isHome) { $path = $path.Replace($HOME, '~') } | |
if($env:leadingBraceEnabled -eq 1) { $symbols.pathOpen = "⌈" } else { $symbols.pathOpen = "" } | |
$prompt = @( | |
"" | |
@( | |
"$($colors.separator)$($symbols.pathOpen) $($colors.location)$path $($colors.separator)$($symbols.pathClose)" | |
if (Test-Path .git) { Generate-Git-Path } else { '' } | |
if ($admin) { " $($colors.admin)$($symbols.admin)" } else { '' } | |
) -join "" | |
"$r$($symbols.prompt) " | |
) | |
$prompt -join "`n" | |
} |