mirror of
https://github.com/cmderdev/cmder.git
synced 2024-11-10 17:59:11 +08:00
7f4a4d34d6
This defines the default prompt variables ($PrePrompt, $PostPrompt, $CmderPrompt, and $Prompt) before running the custom scripts (user-profile.ps1 and profile.d/*.ps1), and then saves those prompt values after running the custom scripts. This gives the custom scripts and opportunity to override the prompt code blocks. This now opens the possibility for profile.d/*.ps1 scripts to affect the prompt, and also allows both user-profile.ps1 and profile.d/*.ps1 scripts to overwrite the $Prompt script block and overwrite the prompt behavior entirely.
182 lines
5.6 KiB
PowerShell
182 lines
5.6 KiB
PowerShell
# Init Script for PowerShell
|
|
# Created as part of cmder project
|
|
|
|
# !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
|
|
# !!! Use "%CMDER_ROOT%\config\user-profile.ps1" to add your own startup commands
|
|
|
|
# We do this for Powershell as Admin Sessions because CMDER_ROOT is not beng set.
|
|
if (! $ENV:CMDER_ROOT ) {
|
|
$ENV:CMDER_ROOT = resolve-path( $ENV:ConEmuDir + "\..\.." )
|
|
}
|
|
|
|
# Remove trailing '\'
|
|
$ENV:CMDER_ROOT = (($ENV:CMDER_ROOT).trimend("\"))
|
|
|
|
# Compatibility with PS major versions <= 2
|
|
if(!$PSScriptRoot) {
|
|
$PSScriptRoot = Split-Path $Script:MyInvocation.MyCommand.Path
|
|
}
|
|
|
|
# Add Cmder modules directory to the autoload path.
|
|
$CmderModulePath = Join-path $PSScriptRoot "psmodules/"
|
|
|
|
if( -not $env:PSModulePath.Contains($CmderModulePath) ){
|
|
$env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;")
|
|
}
|
|
|
|
try {
|
|
Get-command -Name "vim" -ErrorAction Stop >$null
|
|
} catch {
|
|
# # You could do this but it may be a little drastic and introduce a lot of
|
|
# # unix tool overlap with powershel unix like aliases
|
|
# $env:Path += $(";" + $env:CMDER_ROOT + "\vendor\git-for-windows\usr\bin")
|
|
# set-alias -name "vi" -value "vim"
|
|
# # I think the below is safer.
|
|
|
|
new-alias -name "vim" -value $($ENV:CMDER_ROOT + "\vendor\git-for-windows\usr\bin\vim.exe")
|
|
new-alias -name "vi" -value vim
|
|
}
|
|
|
|
try {
|
|
# Check if git is on PATH, i.e. Git already installed on system
|
|
Get-command -Name "git" -ErrorAction Stop >$null
|
|
} catch {
|
|
$env:Path += $(";" + $env:CMDER_ROOT + "\vendor\git-for-windows\cmd")
|
|
# for bash.exe, which in the cmd version is found as <GIT>\usr\bin\bash.exe
|
|
$env:Path += $(";" + $env:CMDER_ROOT + "\vendor\git-for-windows\bin")
|
|
}
|
|
|
|
$gitLoaded = $false
|
|
function Import-Git($Loaded){
|
|
if($Loaded) { return }
|
|
$GitModule = Get-Module -Name Posh-Git -ListAvailable
|
|
if($GitModule | select version | where version -le ([version]"0.6.1.20160330")){
|
|
Import-Module Posh-Git > $null
|
|
}
|
|
if(-not ($GitModule) ) {
|
|
Write-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart cmder."
|
|
}
|
|
# Make sure we only run once by alawys returning true
|
|
return $true
|
|
}
|
|
|
|
function checkGit($Path) {
|
|
if (Test-Path -Path (Join-Path $Path '.git') ) {
|
|
$gitLoaded = Import-Git $gitLoaded
|
|
Write-VcsStatus
|
|
return
|
|
}
|
|
$SplitPath = split-path $path
|
|
if ($SplitPath) {
|
|
checkGit($SplitPath)
|
|
}
|
|
}
|
|
|
|
# Move to the wanted location
|
|
# This is either a env variable set by the user or the result of
|
|
# cmder.exe setting this variable due to a commandline argument or a "cmder here"
|
|
if ( $ENV:CMDER_START ) {
|
|
Set-Location -Path "$ENV:CMDER_START"
|
|
}
|
|
|
|
if (Get-Module PSReadline -ErrorAction "SilentlyContinue") {
|
|
Set-PSReadlineOption -ExtraPromptLineCount 1
|
|
}
|
|
|
|
# Enhance Path
|
|
$env:Path = "$Env:CMDER_ROOT\bin;$env:Path;$Env:CMDER_ROOT"
|
|
|
|
#
|
|
# Prompt Section
|
|
# Users should modify their user-profile.ps1 as it will be safe from updates.
|
|
#
|
|
|
|
# Pre assign the hooks so the first run of cmder gets a working prompt.
|
|
[ScriptBlock]$PrePrompt = {}
|
|
[ScriptBlock]$PostPrompt = {}
|
|
[ScriptBlock]$CmderPrompt = {
|
|
$Host.UI.RawUI.ForegroundColor = "White"
|
|
Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
|
|
checkGit($pwd.ProviderPath)
|
|
}
|
|
|
|
<#
|
|
This scriptblock runs every time the prompt is returned.
|
|
Explicitly use functions from MS namespace to protect from being overridden in the user session.
|
|
Custom prompt functions are loaded in as constants to get the same behaviour
|
|
#>
|
|
[ScriptBlock]$Prompt = {
|
|
$realLASTEXITCODE = $LASTEXITCODE
|
|
$host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf
|
|
PrePrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
|
|
CmderPrompt
|
|
Microsoft.PowerShell.Utility\Write-Host "`nλ " -NoNewLine -ForegroundColor "DarkGray"
|
|
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
|
|
$global:LASTEXITCODE = $realLASTEXITCODE
|
|
return " "
|
|
}
|
|
|
|
# Drop *.ps1 files into "$ENV:CMDER_ROOT\config\profile.d"
|
|
# to source them at startup.
|
|
if (-not (test-path "$ENV:CMDER_ROOT\config\profile.d")) {
|
|
mkdir "$ENV:CMDER_ROOT\config\profile.d"
|
|
}
|
|
|
|
pushd $ENV:CMDER_ROOT\config\profile.d
|
|
foreach ($x in ls *.ps1) {
|
|
# write-host write-host Sourcing $x
|
|
. $x
|
|
}
|
|
popd
|
|
|
|
$CmderUserProfilePath = Join-Path $env:CMDER_ROOT "config\user-profile.ps1"
|
|
if(Test-Path $CmderUserProfilePath) {
|
|
# Create this file and place your own command in there.
|
|
. "$CmderUserProfilePath"
|
|
} else {
|
|
# This multiline string cannot be indented, for this reason I've not indented the whole block
|
|
|
|
Write-Host -BackgroundColor Darkgreen -ForegroundColor White "First Run: Creating user startup file: $CmderUserProfilePath"
|
|
|
|
$UserProfileTemplate = @'
|
|
# Use this file to run your own startup commands
|
|
|
|
## Prompt Customization
|
|
<#
|
|
.SYNTAX
|
|
<PrePrompt><CMDER DEFAULT>
|
|
λ <PostPrompt> <repl input>
|
|
.EXAMPLE
|
|
<PrePrompt>N:\Documents\src\cmder [master]
|
|
λ <PostPrompt> |
|
|
#>
|
|
|
|
[ScriptBlock]$PrePrompt = {
|
|
|
|
}
|
|
|
|
# Replace the cmder prompt entirely with this.
|
|
# [ScriptBlock]$CmderPrompt = {}
|
|
|
|
[ScriptBlock]$PostPrompt = {
|
|
|
|
}
|
|
|
|
## <Continue to add your own>
|
|
|
|
|
|
'@
|
|
|
|
New-Item -ItemType File -Path $CmderUserProfilePath -Value $UserProfileTemplate > $null
|
|
|
|
}
|
|
|
|
# Once Created these code blocks cannot be overwritten
|
|
Set-Item -Path function:\PrePrompt -Value $PrePrompt -Options Constant
|
|
Set-Item -Path function:\CmderPrompt -Value $CmderPrompt -Options Constant
|
|
Set-Item -Path function:\PostPrompt -Value $PostPrompt -Options Constant
|
|
|
|
# Functions can be made constant only at creation time
|
|
# ReadOnly at least requires `-force` to be overwritten
|
|
Set-Item -Path function:\prompt -Value $Prompt -Options ReadOnly
|