From 96ca7cea4a9ed44f93dc0ba724efdfc4f06bcb3f Mon Sep 17 00:00:00 2001 From: David Refoua Date: Mon, 24 Oct 2022 19:58:46 +0330 Subject: [PATCH 1/4] enhance cmder prompt --- CONTRIBUTING.md | 2 +- scripts/utils.ps1 | 4 +- vendor/clink.lua | 70 ++++++++++++++++++----------------- vendor/clink_settings.default | 9 +++++ vendor/init.bat | 2 +- vendor/profile.ps1 | 35 ++++++++++++------ 6 files changed, 72 insertions(+), 50 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 17279446e..9bfae7a12 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # How to contribute -Unfortunately we all can't work on cmder every day of the year, so I have decided to write some guidelines for contributing. +Unfortunately we all can't work on Cmder every day of the year, so I have decided to write some guidelines for contributing. If you follow them your contribution will likely be pulled in quicker. diff --git a/scripts/utils.ps1 b/scripts/utils.ps1 index 70f6d29fc..e9e79cac4 100644 --- a/scripts/utils.ps1 +++ b/scripts/utils.ps1 @@ -98,8 +98,8 @@ function Get-VersionStr { # Determine if git is available if (Get-Command "git.exe" -ErrorAction SilentlyContinue) { - # Determine if the current diesctory is a git repository - $GitPresent = Invoke-Expression "git rev-parse --is-inside-work-tree" -erroraction SilentlyContinue + # Determine if the current directory is a git repository + $GitPresent = Invoke-Expression "git rev-parse --is-inside-work-tree" -ErrorAction SilentlyContinue if ( $GitPresent -eq 'true' ) { $string = Invoke-Expression "git describe --abbrev=0 --tags" diff --git a/vendor/clink.lua b/vendor/clink.lua index 1c2488c9b..d50fa8e73 100644 --- a/vendor/clink.lua +++ b/vendor/clink.lua @@ -15,34 +15,34 @@ dofile(clink_lua_file) local function get_uah_color() - return uah_color or "\x1b[1;33;49m" -- Green = uah = [user]@[hostname] + return uah_color or "\x1b[1;33;49m" -- Green = uah = [user]@[hostname] end local function get_cwd_color() - return cwd_color or "\x1b[1;32;49m" -- Yellow cwd = Current Working Directory + return cwd_color or "\x1b[1;32;49m" -- Yellow cwd = Current Working Directory end local function get_lamb_color() - return lamb_color or "\x1b[1;30;49m" -- Light Grey = Lambda Color + return lamb_color or "\x1b[1;30;49m" -- Light Grey = Lambda Color end local function get_clean_color() - return clean_color or "\x1b[1;37;49m" + return clean_color or "\x1b[1;37;49m" end local function get_dirty_color() - return dirty_color or "\x1b[33;3m" + return dirty_color or "\x1b[33;3m" end local function get_conflict_color() - return conflict_color or "\x1b[31;1m" + return conflict_color or "\x1b[31;1m" end local function get_unknown_color() - return unknown_color or "\x1b[37;1m" + return unknown_color or "\x1b[37;1m" end --- @@ -57,9 +57,9 @@ end -- Ex: Input C:\Windows\System32 returns System32 --- local function get_folder_name(path) - local reversePath = string.reverse(path) - local slashIndex = string.find(reversePath, "\\") - return string.sub(path, string.len(path) - slashIndex + 2) + local reversePath = string.reverse(path) + local slashIndex = string.find(reversePath, "\\") + return string.sub(path, string.len(path) - slashIndex + 2) end @@ -115,32 +115,32 @@ local function set_prompt_filter() -- Much of the below was 'borrowed' from https://github.com/AmrEldib/cmder-powerline-prompt -- Symbol displayed for the home dir in the prompt. if not prompt_homeSymbol then - prompt_homeSymbol = "~" + prompt_homeSymbol = "~" end -- Symbol displayed in the new line below the prompt. if not prompt_lambSymbol then - prompt_lambSymbol = "λ" + prompt_lambSymbol = "λ" end if not prompt_type then - prompt_type = "full" + prompt_type = "full" end if prompt_useHomeSymbol == nil then - prompt_useHomeSymbol = false + prompt_useHomeSymbol = false end if prompt_useUserAtHost == nil then - prompt_useUserAtHost = false + prompt_useUserAtHost = false end if prompt_singleLine == nil then - prompt_singleLine = false + prompt_singleLine = false end if prompt_includeVersionControl == nil then - prompt_includeVersionControl = true + prompt_includeVersionControl = true end if prompt_type == 'folder' then @@ -158,9 +158,11 @@ local function set_prompt_filter() cr = "\n" if prompt_singleLine then - cr = ' ' + cr = ' ' end + cr = "\x1b[0m" .. cr + if env ~= nil then env = "("..env..") " else env = "" end if uah ~= '' then uah = get_uah_color() .. uah end @@ -168,7 +170,7 @@ local function set_prompt_filter() local version_control = prompt_includeVersionControl and "{git}{hg}{svn}" or "" - prompt = "{uah}{cwd}" .. version_control .. get_lamb_color() .. cr .. "{env}{lamb} \x1b[0m" + prompt = "{uah}{cwd}" .. version_control .. cr .. get_lamb_color() .. "{env}{lamb}\x1b[0m " prompt = string.gsub(prompt, "{uah}", uah) prompt = string.gsub(prompt, "{cwd}", cwd) prompt = string.gsub(prompt, "{env}", env) @@ -363,12 +365,12 @@ local function get_git_status() local code = line:sub(1, 2) -- print (string.format("code: %s, line: %s", code, line)) if code == "DD" or code == "AU" or code == "UD" or code == "UA" or code == "DU" or code == "AA" or code == "UU" then - is_status = false - conflict_found = true - break + is_status = false + conflict_found = true + break -- unversioned files are ignored, comment out 'code ~= "!!"' to unignore them elseif code ~= "!!" and code ~= "??" then - is_status = false + is_status = false end end file:close() @@ -440,16 +442,16 @@ local function get_git_status_setting() for line in gitStatusConfig:lines() do if string.match(line, 'false') then - gitStatusConfig:close() - return false + gitStatusConfig:close() + return false end end local gitCmdStatusConfig = io.popen("git --no-pager config cmder.cmdstatus 2>nul") for line in gitCmdStatusConfig:lines() do if string.match(line, 'false') then - gitCmdStatusConfig:close() - return false + gitCmdStatusConfig:close() + return false end end gitStatusConfig:close() @@ -640,11 +642,11 @@ for _,lua_module in ipairs(clink.find_files(completions_dir..'*.lua')) do end if clink.get_env('CMDER_USER_CONFIG') then - local cmder_config_dir = clink.get_env('CMDER_ROOT')..'/config/' - for _,lua_module in ipairs(clink.find_files(cmder_config_dir..'*.lua')) do - local filename = cmder_config_dir..lua_module - -- use dofile instead of require because require caches loaded modules - -- so config reloading using Alt-Q won't reload updated modules. - dofile(filename) - end + local cmder_config_dir = clink.get_env('CMDER_ROOT')..'/config/' + for _,lua_module in ipairs(clink.find_files(cmder_config_dir..'*.lua')) do + local filename = cmder_config_dir..lua_module + -- use dofile instead of require because require caches loaded modules + -- so config reloading using Alt-Q won't reload updated modules. + dofile(filename) + end end diff --git a/vendor/clink_settings.default b/vendor/clink_settings.default index 7e296b30b..39e397ead 100644 --- a/vendor/clink_settings.default +++ b/vendor/clink_settings.default @@ -17,3 +17,12 @@ history.max_lines = 10000 # name: Share history between instances # type: boolean history.shared = True + +# name: Auto-answer terminate prompt +# type: enum +# options: off,answer_yes,answer_no +cmd.auto_answer = answer_yes + +# name: Doskey completions +# type: color +color.doskey = yellow diff --git a/vendor/init.bat b/vendor/init.bat index d0d762f72..dd0d00890 100644 --- a/vendor/init.bat +++ b/vendor/init.bat @@ -155,7 +155,7 @@ if "%CMDER_CLINK%" == "1" ( :: Run Clink if defined CMDER_USER_CONFIG ( if not exist "%CMDER_USER_CONFIG%\settings" if not exist "%CMDER_USER_CONFIG%\clink_settings" ( - echo Generating clink initial settings in "%CMDER_USER_CONFIG%\clink_settings" + echo Generating Clink initial settings in "%CMDER_USER_CONFIG%\clink_settings" copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_USER_CONFIG%\clink_settings" echo Additional *.lua files in "%CMDER_USER_CONFIG%" are loaded on startup. ) diff --git a/vendor/profile.ps1 b/vendor/profile.ps1 index 566d7ad5b..021dc3b99 100644 --- a/vendor/profile.ps1 +++ b/vendor/profile.ps1 @@ -1,5 +1,6 @@ -# Init Script for PowerShell -# Created as part of cmder project +# Init Script for PowerShell +# Created as part of Cmder project +# This file must be saved using UTF-8 with BOM encoding for prompt to work correctly. # !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED # !!! Use "%CMDER_ROOT%\config\user_profile.ps1" to add your own startup commands @@ -16,8 +17,8 @@ if ($ENV:CMDER_USER_CONFIG) { } # We do this for Powershell as Admin Sessions because CMDER_ROOT is not being set. -if ($null -eq $ENV:CMDER_ROOT) { - if (-Not($null -eq $ENV:ConEmuDir)) { +if (!$ENV:CMDER_ROOT) { + if ($ENV:ConEmuDir) { $ENV:CMDER_ROOT = Resolve-Path($ENV:ConEmuDir + "\..\..") } else { $ENV:CMDER_ROOT = Resolve-Path($PSScriptRoot + "\..") @@ -25,7 +26,7 @@ if ($null -eq $ENV:CMDER_ROOT) { } # Remove trailing '\' -$ENV:CMDER_ROOT = ($ENV:CMDER_ROOT).trimend("\") +$ENV:CMDER_ROOT = ($ENV:CMDER_ROOT).TrimEnd("\") # Do not load bundled PsGet if a module installer is already available # -> recent PowerShell versions include PowerShellGet out of the box @@ -85,7 +86,7 @@ if (-Not ($null -eq $ENV:GIT_INSTALL_ROOT)) { $env:Path = Configure-Git -gitRoot "$ENV:GIT_INSTALL_ROOT" -gitType $ENV:GIT_INSTALL_TYPE -gitPathUser $gitPathUser } -if (Get-Command -Name "vim" -ErrorAction silentlycontinue) { +if (Get-Command -Name "vim" -ErrorAction SilentlyContinue) { New-Alias -name "vi" -value vim } @@ -98,10 +99,15 @@ $env:gitLoaded = $false [ScriptBlock]$PrePrompt = {} [ScriptBlock]$PostPrompt = {} [ScriptBlock]$CmderPrompt = { + $identity = [Security.Principal.WindowsIdentity]::GetCurrent() + $principal = [Security.Principal.WindowsPrincipal] $identity + $adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator + $color = "White" + if ($principal.IsInRole($adminRole)) { $color = "Red" } $Host.UI.RawUI.ForegroundColor = "White" - Write-Host -NoNewline "PS " + Microsoft.PowerShell.Utility\Write-Host -NoNewline "PS " -ForegroundColor $color Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green - if (Get-Command git -erroraction silentlycontinue) { + if (Get-Command git -ErrorAction SilentlyContinue) { checkGit($pwd.ProviderPath) } Microsoft.PowerShell.Utility\Write-Host "`nλ" -NoNewLine -ForegroundColor "DarkGray" @@ -170,7 +176,7 @@ if ($ENV:CMDER_USER_CONFIG) { } if (-Not (Test-Path $CmderUserProfilePath)) { - Write-Host -BackgroundColor Darkgreen -ForegroundColor White "First Run: Creating user startup file: $CmderUserProfilePath" + Write-Host -BackgroundColor DarkGreen -ForegroundColor White "First Run: Creating user startup file: $CmderUserProfilePath" Copy-Item "$env:CMDER_ROOT\vendor\user_profile.ps1.default" -Destination $CmderUserProfilePath } @@ -190,8 +196,13 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS Custom prompt functions are loaded in as constants to get the same behaviour #> [ScriptBlock]$Prompt = { + $lastSUCCESS = $? $realLASTEXITCODE = $LASTEXITCODE $host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf + Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x200B)`r$([char]0x1B)[K" + if ($lastSUCCESS -Or ($LASTEXITCODE -ne 0)) { + Microsoft.PowerShell.Utility\Write-Host + } PrePrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline CmderPrompt PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline @@ -201,9 +212,9 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS # Once Created these code blocks cannot be overwritten - # if (-not $(Get-Command PrePrompt).Options -match 'Constant') {Set-Item -Path function:\PrePrompt -Value $PrePrompt -Options Constant} + # if (-not $(Get-Command PrePrompt).Options -match 'Constant') {Set-Item -Path function:\PrePrompt -Value $PrePrompt -Options Constant} # if (-not $(Get-Command CmderPrompt).Options -match 'Constant') {Set-Item -Path function:\CmderPrompt -Value $CmderPrompt -Options Constant} - # if (-not $(Get-Command PostPrompt).Options -match 'Constant') {Set-Item -Path function:\PostPrompt -Value $PostPrompt -Options Constant} + # if (-not $(Get-Command PostPrompt).Options -match 'Constant') {Set-Item -Path function:\PostPrompt -Value $PostPrompt -Options Constant} Set-Item -Path function:\PrePrompt -Value $PrePrompt -Options Constant Set-Item -Path function:\CmderPrompt -Value $CmderPrompt -Options Constant @@ -216,4 +227,4 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS } $CMDER_INIT_END = $(Get-Date -UFormat %s) -# Write-Host "Elapsed Time: $(get-Date) `($($CMDER_INIT_END - $CMDER_INIT_START) total`)" +Write-Verbose "Elapsed Time: $(get-Date) `($($CMDER_INIT_END - $CMDER_INIT_START) total`)" From 0b7e47cdc2f4d5470de8464506a2e6dc537c4bac Mon Sep 17 00:00:00 2001 From: David Refoua Date: Mon, 24 Oct 2022 20:38:09 +0330 Subject: [PATCH 2/4] add new alias for file listing --- vendor/user_aliases.cmd.default | 1 + 1 file changed, 1 insertion(+) diff --git a/vendor/user_aliases.cmd.default b/vendor/user_aliases.cmd.default index 9dccdc42e..c69570463 100644 --- a/vendor/user_aliases.cmd.default +++ b/vendor/user_aliases.cmd.default @@ -6,6 +6,7 @@ ;= Add aliases below here e.=explorer . gl=git log --oneline --all --graph --decorate $* +l=ls --show-control-chars -CFGNhp --color --ignore={"NTUSER.DAT*","ntuser.dat*"} $* ls=ls --show-control-chars -F --color $* pwd=cd clear=cls From cbb10de06d8731cb5096dc4cf6566c19b81e169d Mon Sep 17 00:00:00 2001 From: David Refoua Date: Mon, 24 Oct 2022 20:54:24 +0330 Subject: [PATCH 3/4] consistent spaces --- Cmder.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cmder.bat b/Cmder.bat index 3062c3764..36d29d781 100644 --- a/Cmder.bat +++ b/Cmder.bat @@ -5,7 +5,7 @@ SET CMDER_ROOT=%~dp0 @if "%CMDER_ROOT:~-1%" == "\" SET CMDER_ROOT=%CMDER_ROOT:~0,-1% if not exist "%CMDER_ROOT%\config\user_ConEmu.xml" ( - copy "%CMDER_ROOT%\vendor\ConEmu.xml.default" "%CMDER_ROOT%\config\user_ConEmu.xml" + copy "%CMDER_ROOT%\vendor\ConEmu.xml.default" "%CMDER_ROOT%\config\user_ConEmu.xml" ) if exist "%~1" ( From 6e0e1729d84b0bc787b9ee9acb857f0f71e46448 Mon Sep 17 00:00:00 2001 From: David Refoua Date: Mon, 24 Oct 2022 21:01:55 +0330 Subject: [PATCH 4/4] use a variable to keep DRY --- vendor/init.bat | 72 +++++++++++++++++-------------------------------- 1 file changed, 24 insertions(+), 48 deletions(-) diff --git a/vendor/init.bat b/vendor/init.bat index dd0d00890..f132bc7d1 100644 --- a/vendor/init.bat +++ b/vendor/init.bat @@ -129,10 +129,15 @@ goto var_loop %print_debug% init.bat "Env Var - CMDER_ROOT=%CMDER_ROOT%" %print_debug% init.bat "Env Var - debug_output=%debug_output%" +:: Sets Cmder directory paths +SET CMDER_CONFIG_DIR=%CMDER_ROOT%\config + +:: Check if wre're using Cmder individual user profile if defined CMDER_USER_CONFIG ( %print_debug% init.bat "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '%CMDER_USER_CONFIG%'!" if not exist "%CMDER_USER_CONFIG%\..\opt" md "%CMDER_USER_CONFIG%\..\opt" + set CMDER_CONFIG_DIR=%CMDER_USER_CONFIG% ) :: Pick right version of Clink @@ -153,54 +158,29 @@ if "%CMDER_CLINK%" == "1" ( ) :: Run Clink - if defined CMDER_USER_CONFIG ( - if not exist "%CMDER_USER_CONFIG%\settings" if not exist "%CMDER_USER_CONFIG%\clink_settings" ( - echo Generating Clink initial settings in "%CMDER_USER_CONFIG%\clink_settings" - copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_USER_CONFIG%\clink_settings" - echo Additional *.lua files in "%CMDER_USER_CONFIG%" are loaded on startup. - ) - - if not exist "%CMDER_USER_CONFIG%\cmder_prompt_config.lua" ( - echo Creating Cmder prompt config file: "%CMDER_USER_CONFIG%\cmder_prompt_config.lua" - copy "%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default" "%CMDER_USER_CONFIG%\cmder_prompt_config.lua" - ) - - REM Cleanup lagacy Clink Settings file - if exist "%CMDER_USER_CONFIG%\settings" if exist "%CMDER_USER_CONFIG%\clink_settings" ( - del "%CMDER_USER_CONFIG%\settings" - ) - - REM Cleanup legacy Clink history file - if exist "%CMDER_USER_CONFIG%\.history" if exist "%CMDER_USER_CONFIG%\clink_history" ( - del "%CMDER_USER_CONFIG%\.history" - ) - - "%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_USER_CONFIG%" --scripts "%CMDER_ROOT%\vendor" - ) else ( - if not exist "%CMDER_ROOT%\config\settings" if not exist "%CMDER_ROOT%\config\clink_settings" ( - echo Generating Clink initial settings in "%CMDER_ROOT%\config\clink_settings" - copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_ROOT%\config\clink_settings" - echo Additional *.lua files in "%CMDER_ROOT%\config" are loaded on startup. - ) - - if not exist "%CMDER_ROOT%\config\cmder_prompt_config.lua" ( - echo Creating Cmder prompt config file: "%CMDER_ROOT%\config\cmder_prompt_config.lua" - copy "%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default" "%CMDER_ROOT%\config\cmder_prompt_config.lua" - ) + if not exist "%CMDER_CONFIG_DIR%\settings" if not exist "%CMDER_CONFIG_DIR%\clink_settings" ( + echo Generating Clink initial settings in "%CMDER_CONFIG_DIR%\clink_settings" + copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_CONFIG_DIR%\clink_settings" + echo Additional *.lua files in "%CMDER_CONFIG_DIR%" are loaded on startup. + ) - REM Cleanup lagacy Clink Settings file - if exist "%CMDER_ROOT%\config\settings" if exist "%CMDER_ROOT%\config\clink_settings" ( - del "%CMDER_ROOT%\config\settings" - ) + if not exist "%CMDER_CONFIG_DIR%\cmder_prompt_config.lua" ( + echo Creating Cmder prompt config file: "%CMDER_CONFIG_DIR%\cmder_prompt_config.lua" + copy "%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default" "%CMDER_CONFIG_DIR%\cmder_prompt_config.lua" + ) - REM Cleanup legacy Clink history file - if exist "%CMDER_ROOT%\config\.history" if exist "%CMDER_ROOT%\config\clink_history" ( - del "%CMDER_ROOT%\config\.history" - ) + :: Cleanup lagacy Clink Settings file + if exist "%CMDER_CONFIG_DIR%\settings" if exist "%CMDER_CONFIG_DIR%\clink_settings" ( + del "%CMDER_CONFIG_DIR%\settings" + ) - "%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_ROOT%\config" --scripts "%CMDER_ROOT%\vendor" + :: Cleanup legacy Clink history file + if exist "%CMDER_CONFIG_DIR%\.history" if exist "%CMDER_CONFIG_DIR%\clink_history" ( + del "%CMDER_CONFIG_DIR%\.history" ) + "%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_CONFIG_DIR%" --scripts "%CMDER_ROOT%\vendor" + if errorlevel 1 ( %print_error% "Failed to initialize Clink with error code: %errorlevel%" ) @@ -361,11 +341,7 @@ if defined CMDER_USER_CONFIG ( :: must also be self executing, see '.\user_aliases.cmd.default', :: and be in profile.d folder. if not defined user_aliases ( - if defined CMDER_USER_CONFIG ( - set "user_aliases=%CMDER_USER_CONFIG%\user_aliases.cmd" - ) else ( - set "user_aliases=%CMDER_ROOT%\config\user_aliases.cmd" - ) + set "user_aliases=%CMDER_CONFIG_DIR%\user_aliases.cmd" ) if "%CMDER_ALIASES%" == "1" (