mirror of
https://github.com/JanDeDobbeleer/oh-my-posh.git
synced 2025-02-02 05:41:10 -08:00
feat: initialize pwsh starship style
This commit is contained in:
parent
597a2a0d96
commit
a1b2b8d67b
4
.github/workflows/code.yml
vendored
4
.github/workflows/code.yml
vendored
|
@ -26,6 +26,10 @@ jobs:
|
||||||
go-version: 1.15.x
|
go-version: 1.15.x
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
- name: Bundle init scripts
|
||||||
|
run: |
|
||||||
|
go get -u github.com/kevinburke/go-bindata/...
|
||||||
|
go-bindata -o init.go init/
|
||||||
- name: Golang CI
|
- name: Golang CI
|
||||||
uses: golangci/golangci-lint-action@v2
|
uses: golangci/golangci-lint-action@v2
|
||||||
with:
|
with:
|
||||||
|
|
4
.github/workflows/release.yml
vendored
4
.github/workflows/release.yml
vendored
|
@ -66,6 +66,10 @@ jobs:
|
||||||
go-version: 1.15.x
|
go-version: 1.15.x
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
- name: Bundle init scripts
|
||||||
|
run: |
|
||||||
|
go get -u github.com/kevinburke/go-bindata/...
|
||||||
|
go-bindata -o init.go init/
|
||||||
- name: Build
|
- name: Build
|
||||||
id: build
|
id: build
|
||||||
run: go build -o ${{ matrix.ARTIFACT }} -ldflags="-X 'main.Version=${{ needs.release.outputs.version }}'"
|
run: go build -o ${{ matrix.ARTIFACT }} -ldflags="-X 'main.Version=${{ needs.release.outputs.version }}'"
|
||||||
|
|
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -9,6 +9,8 @@
|
||||||
*.dll
|
*.dll
|
||||||
*.so
|
*.so
|
||||||
*.dylib
|
*.dylib
|
||||||
|
# Initialization scripts generated by https://github.com/kevinburke/go-bindata
|
||||||
|
init.go
|
||||||
|
|
||||||
# Test binary, built with `go test -c`
|
# Test binary, built with `go test -c`
|
||||||
*.test
|
*.test
|
||||||
|
@ -147,4 +149,4 @@ dist
|
||||||
# End of https://www.toptal.com/developers/gitignore/api/node,go,visualstudiocode
|
# End of https://www.toptal.com/developers/gitignore/api/node,go,visualstudiocode
|
||||||
|
|
||||||
# linux binary
|
# linux binary
|
||||||
/oh-my-posh3
|
/oh-my-posh3
|
||||||
|
|
|
@ -49,6 +49,7 @@ a modern and more efficient tool was needed to suit my personal needs.
|
||||||
* [Robby Russel][oh-my-zsh] for creating oh-my-zsh, without him this would probably not be here
|
* [Robby Russel][oh-my-zsh] for creating oh-my-zsh, without him this would probably not be here
|
||||||
* [Janne Mareike Koschinski][justjanne] for providing information on how to get certain information
|
* [Janne Mareike Koschinski][justjanne] for providing information on how to get certain information
|
||||||
using Go (and the amazing [README][powerline-go])
|
using Go (and the amazing [README][powerline-go])
|
||||||
|
* [Starship][starship] for creating an amazing way to initialize the prompt
|
||||||
|
|
||||||
[release-status]: https://github.com/jandedobbeleer/oh-my-posh3/workflows/Release/badge.svg
|
[release-status]: https://github.com/jandedobbeleer/oh-my-posh3/workflows/Release/badge.svg
|
||||||
[psgallery-badge]: https://img.shields.io/powershellgallery/dt/oh-my-posh.svg
|
[psgallery-badge]: https://img.shields.io/powershellgallery/dt/oh-my-posh.svg
|
||||||
|
@ -69,3 +70,4 @@ using Go (and the amazing [README][powerline-go])
|
||||||
[oh-my-zsh]: https://github.com/robbyrussell/oh-my-zsh
|
[oh-my-zsh]: https://github.com/robbyrussell/oh-my-zsh
|
||||||
[justjanne]: https://github.com/justjanne
|
[justjanne]: https://github.com/justjanne
|
||||||
[powerline-go]: https://github.com/justjanne/powerline-go
|
[powerline-go]: https://github.com/justjanne/powerline-go
|
||||||
|
[starship]: https://github.com/starship/starship/blob/master/src/init/mod.rs
|
||||||
|
|
|
@ -70,6 +70,15 @@ New: &new{},
|
||||||
|
|
||||||
Even with unit tests, it's a good idea to build and validate the changes.
|
Even with unit tests, it's a good idea to build and validate the changes.
|
||||||
|
|
||||||
|
First, we need to package the init scripts:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
go get -u github.com/kevinburke/go-bindata/...
|
||||||
|
go-bindata -o init.go init/
|
||||||
|
```
|
||||||
|
|
||||||
|
Next, build the app and validate the changes:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
go build -o $GOPATH/bin/oh-my-posh
|
go build -o $GOPATH/bin/oh-my-posh
|
||||||
```
|
```
|
||||||
|
|
66
init/pwsh.ps1
Normal file
66
init/pwsh.ps1
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
$global:PoshSettings = New-Object -TypeName PSObject -Property @{
|
||||||
|
Theme = "";
|
||||||
|
ShowDebug = $false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Test-Path "::CONFIG::") {
|
||||||
|
$global:PoshSettings.Theme = Resolve-Path -Path "::CONFIG::"
|
||||||
|
}
|
||||||
|
function Set-PoshContext {}
|
||||||
|
|
||||||
|
function Set-GitStatus {
|
||||||
|
if (Get-Command -Name "Get-GitStatus" -ErrorAction SilentlyContinue) {
|
||||||
|
$Global:GitStatus = Get-GitStatus
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[ScriptBlock]$Prompt = {
|
||||||
|
#store if the last command was successfull
|
||||||
|
$lastCommandSuccess = $?
|
||||||
|
#store the last exit code for restore
|
||||||
|
$realLASTEXITCODE = $global:LASTEXITCODE
|
||||||
|
$errorCode = 0
|
||||||
|
Set-PoshContext
|
||||||
|
if ($lastCommandSuccess -eq $false) {
|
||||||
|
#native app exit code
|
||||||
|
if ($realLASTEXITCODE -is [int] -and $realLASTEXITCODE -gt 0) {
|
||||||
|
$errorCode = $realLASTEXITCODE
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$errorCode = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$executionTime = -1
|
||||||
|
$history = Get-History -ErrorAction Ignore -Count 1
|
||||||
|
if ($null -ne $history -and $null -ne $history.EndExecutionTime -and $null -ne $history.StartExecutionTime) {
|
||||||
|
$executionTime = ($history.EndExecutionTime - $history.StartExecutionTime).TotalMilliseconds
|
||||||
|
}
|
||||||
|
|
||||||
|
$startInfo = New-Object System.Diagnostics.ProcessStartInfo
|
||||||
|
$startInfo.FileName = "::OMP::"
|
||||||
|
$config = $global:PoshSettings.Theme
|
||||||
|
$showDebug = $global:PoshSettings.ShowDebug
|
||||||
|
$cleanPWD = $PWD.ProviderPath.TrimEnd("\")
|
||||||
|
$startInfo.Arguments = "--debug=""$showDebug"" --config=""$config"" --error=$errorCode --pwd=""$cleanPWD"" --execution-time=$executionTime"
|
||||||
|
$startInfo.Environment["TERM"] = "xterm-256color"
|
||||||
|
$startInfo.CreateNoWindow = $true
|
||||||
|
$startInfo.StandardOutputEncoding = [System.Text.Encoding]::UTF8
|
||||||
|
$startInfo.RedirectStandardOutput = $true
|
||||||
|
$startInfo.UseShellExecute = $false
|
||||||
|
if ($PWD.Provider.Name -eq 'FileSystem') {
|
||||||
|
$startInfo.WorkingDirectory = $PWD.ProviderPath
|
||||||
|
}
|
||||||
|
$process = New-Object System.Diagnostics.Process
|
||||||
|
$process.StartInfo = $startInfo
|
||||||
|
$process.Start() | Out-Null
|
||||||
|
$standardOut = $process.StandardOutput.ReadToEnd()
|
||||||
|
$process.WaitForExit()
|
||||||
|
$standardOut
|
||||||
|
$global:LASTEXITCODE = $realLASTEXITCODE
|
||||||
|
#remove temp variables
|
||||||
|
Remove-Variable realLASTEXITCODE -Confirm:$false
|
||||||
|
Remove-Variable lastCommandSuccess -Confirm:$false
|
||||||
|
Set-GitStatus
|
||||||
|
}
|
||||||
|
Set-Item -Path Function:prompt -Value $Prompt -Force
|
63
main.go
63
main.go
|
@ -5,12 +5,18 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Version number of oh-my-posh
|
// Version number of oh-my-posh
|
||||||
var Version = "development"
|
var Version = "development"
|
||||||
|
|
||||||
|
const (
|
||||||
|
noExe = "echo \"Unable to find Oh my Posh executable\""
|
||||||
|
)
|
||||||
|
|
||||||
type args struct {
|
type args struct {
|
||||||
ErrorCode *int
|
ErrorCode *int
|
||||||
PrintConfig *bool
|
PrintConfig *bool
|
||||||
|
@ -23,6 +29,8 @@ type args struct {
|
||||||
ExecutionTime *float64
|
ExecutionTime *float64
|
||||||
Millis *bool
|
Millis *bool
|
||||||
Eval *bool
|
Eval *bool
|
||||||
|
Init *bool
|
||||||
|
PrintInit *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@ -71,6 +79,14 @@ func main() {
|
||||||
"eval",
|
"eval",
|
||||||
false,
|
false,
|
||||||
"Run in eval mode"),
|
"Run in eval mode"),
|
||||||
|
Init: flag.Bool(
|
||||||
|
"init",
|
||||||
|
false,
|
||||||
|
"Initialize the shell"),
|
||||||
|
PrintInit: flag.Bool(
|
||||||
|
"print-init",
|
||||||
|
false,
|
||||||
|
"Print the shell initialization script"),
|
||||||
}
|
}
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
env := &environment{
|
env := &environment{
|
||||||
|
@ -80,6 +96,16 @@ func main() {
|
||||||
fmt.Print(time.Now().UnixNano() / 1000000)
|
fmt.Print(time.Now().UnixNano() / 1000000)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if *args.Init {
|
||||||
|
init := initShell(*args.Shell, *args.Config)
|
||||||
|
fmt.Print(init)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if *args.PrintInit {
|
||||||
|
init := printShellInit(*args.Shell, *args.Config)
|
||||||
|
fmt.Print(init)
|
||||||
|
return
|
||||||
|
}
|
||||||
settings := GetSettings(env)
|
settings := GetSettings(env)
|
||||||
if *args.PrintConfig {
|
if *args.PrintConfig {
|
||||||
theme, _ := json.MarshalIndent(settings, "", " ")
|
theme, _ := json.MarshalIndent(settings, "", " ")
|
||||||
|
@ -114,3 +140,40 @@ func main() {
|
||||||
}
|
}
|
||||||
engine.render()
|
engine.render()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func initShell(shell, config string) string {
|
||||||
|
executable, err := os.Executable()
|
||||||
|
if err != nil {
|
||||||
|
return noExe
|
||||||
|
}
|
||||||
|
switch shell {
|
||||||
|
case pwsh:
|
||||||
|
return fmt.Sprintf("Invoke-Expression (@(&\"%s\" --print-init --shell pwsh --config %s) -join \"`n\")", executable, config)
|
||||||
|
default:
|
||||||
|
return fmt.Sprintf("echo \"No initialization script available for %s\"", shell)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func printShellInit(shell, config string) string {
|
||||||
|
executable, err := os.Executable()
|
||||||
|
if err != nil {
|
||||||
|
return noExe
|
||||||
|
}
|
||||||
|
switch shell {
|
||||||
|
case pwsh:
|
||||||
|
return getShellInitScript(executable, config, "init/pwsh.ps1")
|
||||||
|
default:
|
||||||
|
return fmt.Sprintf("echo \"No initialization script available for %s\"", shell)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getShellInitScript(executable, config, script string) string {
|
||||||
|
data, err := Asset(script)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Sprintf("echo \"Unable to find initialization script %s\"", script)
|
||||||
|
}
|
||||||
|
init := string(data)
|
||||||
|
init = strings.ReplaceAll(init, "::OMP::", executable)
|
||||||
|
init = strings.ReplaceAll(init, "::CONFIG::", config)
|
||||||
|
return init
|
||||||
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ function Set-PoshPrompt {
|
||||||
$config = $global:PoshSettings.Theme
|
$config = $global:PoshSettings.Theme
|
||||||
$showDebug = $global:PoshSettings.ShowDebug
|
$showDebug = $global:PoshSettings.ShowDebug
|
||||||
$cleanPWD = $PWD.ProviderPath.TrimEnd("\")
|
$cleanPWD = $PWD.ProviderPath.TrimEnd("\")
|
||||||
$startInfo.Arguments = "-debug=""$showDebug"" -config=""$config"" -error=$errorCode -pwd=""$cleanPWD"" -execution-time=$executionTime"
|
$startInfo.Arguments = "--debug=""$showDebug"" --config=""$config"" --error=$errorCode --pwd=""$cleanPWD"" --execution-time=$executionTime"
|
||||||
$startInfo.Environment["TERM"] = "xterm-256color"
|
$startInfo.Environment["TERM"] = "xterm-256color"
|
||||||
$startInfo.CreateNoWindow = $true
|
$startInfo.CreateNoWindow = $true
|
||||||
$startInfo.StandardOutputEncoding = [System.Text.Encoding]::UTF8
|
$startInfo.StandardOutputEncoding = [System.Text.Encoding]::UTF8
|
||||||
|
|
Loading…
Reference in a new issue