CmderNarzędzie NR.14 W poprzednim wpisie pokazałem Ci jak przygotować do pracy Windows Terminal. Teraz czy to samo można zrobić z Cmder. Tak, ale znalazłem także pewien bug programu, który widać nie radził sobie z modułami PowerShell posh-git i oh-my-posh.

Być może ty też masz ten problem. O to, co zrobiłem.

Dla przypomnienia Cmder może zostać pobrany tutaj: https://cmder.net/

Zmiana fonta

W opcjach Cmder radzę zmienić czcionkę na jedną z tych specjalnych np. na czcionkę Cascadia Code PL, którą możesz pobrać tutaj 

https://github.com/microsoft/cascadia-code/releases

Jeśli chciałbyś zobaczyć inne czcionki programistyczne to tutaj masz ich listę :

https://www.nerdfonts.com/

Zmiana czionki w Cmder

Uruchomienie posh-git i oh-my-posh

Teraz co trzeba zrobić, żeby PowerShell w Cmder uruchomił te wspaniałe moduły do wsparcia Git-a.

W oknie Startup/Task możesz zobaczyć jaki plik uruchamia się przed PowerShellem w Cmder

Co uruchamia się w Cmder

Ja zainstalowałem Cmder w folderze C:\Program Files (x86)\Cmder\

Zaglądam więc do folderu C:\Program Files (x86)\Cmder\config i znajduję tam plik user-profile.ps1

Do pliku dodaje kod :

Import-Module posh-git
Import-Module oh-my-posh
Set-Theme darkblood

Jest to ten sam kod, który dodałem do Windows Terminal.

Z jakiegoś jednak powodu kolory całego terminala mogą ulec destrukcji. Cmder ma swój kod zmieniający tło konsoli i nasz moduł też więc problemy mogą się pojawić.

Problem z Cmder

Najlepiej by było wczytać style po deklaracji konsoli? Tylko jak to zrobić

Ogólnie może najlepiej by było odczytać główny plik konfiguracyjny, z którego korzysta PowerShell, a nie koniecznie Cmder.

Wpisując : 

$profile

Odnajdziesz ścieżkę do tego pliku . U mnie jest to ścieżka : D:\PanNiebieski\Documenty\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

Wpisując :

notepad $profile

Będziesz mógł teraz ten z plik z edytować. Do niego, jeśli tego nie zrobiłeś dodajesz :

Import-Module posh-git
Import-Module oh-my-posh
Set-Theme darkblood

Teraz gdy uruchamiasz nową instancję PowerShell w Cmder wystarczy, że wpiszesz :

. $profile

Aby załadować ten plik domyślnego profilu. W ten sposób przynajmniej kod skryptów będzie taki sam i dla Windows Terminal i dla Cmder.

Dodatkowo możesz w pliku $profile stworzyć kilka funkcji pomocniczych.

function U
{
    param
    (
        [int] $Code
    )
 
    if ((0 -le $Code) -and ($Code -le 0xFFFF))
    {
        return [char] $Code
    }
 
    if ((0x10000 -le $Code) -and ($Code -le 0x10FFFF))
    {
        return [char]::ConvertFromUtf32($Code)
    }
 
    throw "Invalid character code $Code"
}

function ShowCharts
{
	Write-Host "$(U 0xE0B0) $(U 0x00B1) $(U 0xE0A0) $(U 0x27A6) $(U 0x2718) $(U 0x26A1) $(U 0x2699)"
}

function GotoGit
{
	Set-Location d:\github 
}

function Theme1
{
	Set-Theme Paradox
}
function Theme2
{
	Set-Theme darkblood
}

Funkcja ShowCharts wyświetli mi wszystkie specjalne znaki, z których korzysta moduł oh-my-push.

Pokaz komendy ShowCharts

Utworzyłem też sobie pomocnicze funkcję do ustawiania styli konsoli.

Gdy jednak to za mało?

Po pierwsze jak się  pozbyć niebieskiego tła w PowerShell przez Cmder . Proste uruchamiasz normalną konsolę CMD i tam uruchamiasz "PowerShell".

Dodatkowo nawet wtedy stwierdziłem, że pewne kolory styli są rozwalone. Postanowiłem więc dodać do folderu "C:\Program Files\WindowsPowerShell\Modules\oh-my-posh\2.0.440\Themes" dodaj swój styl. Ścieżka u Ciebie może być inna. Tutaj znajduje się moduł "oh-my-posh", a w nim jego style.

Oto kod mojego stylu:

#requires -Version 2 -Modules posh-git

function Write-Theme {

    param(
        [bool]
        $lastCommandFailed,
        [string]
        $with
    )

    $lastColor = $sl.Colors.PromptBackgroundColor
    $prompt = Write-Prompt -Object $sl.PromptSymbols.StartSymbol -ForegroundColor $sl.Colors.PromptForegroundColor -BackgroundColor $sl.Colors.SessionInfoBackgroundColor

    #check the last command state and indicate if failed
    If ($lastCommandFailed) {
        $prompt += Write-Prompt -Object "$($sl.PromptSymbols.FailedCommandSymbol) " -ForegroundColor $sl.Colors.CommandFailedIconForegroundColor -BackgroundColor $sl.Colors.SessionInfoBackgroundColor
    }

    #check for elevated prompt
    If (Test-Administrator) {
        $prompt += Write-Prompt -Object "$($sl.PromptSymbols.ElevatedSymbol) " -ForegroundColor $sl.Colors.AdminIconForegroundColor -BackgroundColor $sl.Colors.SessionInfoBackgroundColor
    }

    $user = $sl.CurrentUser
    $computer = $sl.CurrentHostname
    $path = Get-FullPath -dir $pwd
    if (Test-NotDefaultUser($user)) {
        $prompt += Write-Prompt -Object "$user@$computer " -ForegroundColor $sl.Colors.SessionInfoForegroundColor -BackgroundColor $sl.Colors.SessionInfoBackgroundColor
    }

    if (Test-VirtualEnv) {
        $prompt += Write-Prompt -Object "$($sl.PromptSymbols.SegmentForwardSymbol) " -ForegroundColor $sl.Colors.SessionInfoBackgroundColor -BackgroundColor $sl.Colors.VirtualEnvBackgroundColor
        $prompt += Write-Prompt -Object "$($sl.PromptSymbols.VirtualEnvSymbol) $(Get-VirtualEnvName) " -ForegroundColor $sl.Colors.VirtualEnvForegroundColor -BackgroundColor $sl.Colors.VirtualEnvBackgroundColor
        $prompt += Write-Prompt -Object "$($sl.PromptSymbols.SegmentForwardSymbol) " -ForegroundColor $sl.Colors.VirtualEnvBackgroundColor -BackgroundColor $sl.Colors.PromptBackgroundColor
    }
    else {
        $prompt += Write-Prompt -Object "$($sl.PromptSymbols.SegmentForwardSymbol) " -ForegroundColor $sl.Colors.SessionInfoBackgroundColor -BackgroundColor $sl.Colors.PromptBackgroundColor
    }

    # Writes the drive portion
    $prompt += Write-Prompt -Object "$path " -ForegroundColor $sl.Colors.PromptForegroundColor -BackgroundColor $sl.Colors.PromptBackgroundColor

    $status = Get-VCSStatus
    if ($status) {
        $themeInfo = Get-VcsInfo -status ($status)
        $lastColor = $themeInfo.BackgroundColor + 8



        $prompt += Write-Prompt -Object $($sl.PromptSymbols.SegmentForwardSymbol) -ForegroundColor $sl.Colors.PromptBackgroundColor -BackgroundColor $lastColor
        $prompt += Write-Prompt -Object " $($themeInfo.VcInfo) " -BackgroundColor $lastColor -ForegroundColor $sl.Colors.GitForegroundColor
    }

    # Writes the postfix to the prompt
    $prompt += Write-Prompt -Object $sl.PromptSymbols.SegmentForwardSymbol -ForegroundColor $lastColor -BackgroundColor $black

    $timeStamp = Get-Date -UFormat %R
    $timestamp = "[$timeStamp]"

    $prompt += Set-CursorForRightBlockWrite -textLength ($timestamp.Length + 1)
    #$prompt += Write-Prompt $timeStamp -ForegroundColor $sl.Colors.PromptForegroundColor

    $prompt += Set-Newline

    if ($with) {
        $prompt += Write-Prompt -Object "$($with.ToUpper()) " -BackgroundColor $sl.Colors.WithBackgroundColor -ForegroundColor $sl.Colors.WithForegroundColor
    }
    $prompt += Write-Prompt -Object ($sl.PromptSymbols.PromptIndicator) -ForegroundColor $sl.Colors.PromptBackgroundColor
    $prompt += ' '
    $prompt
}

$sl = $global:ThemeSettings #local settings
$sl.PromptSymbols.StartSymbol = ' '
$sl.PromptSymbols.PromptIndicator = [char]::ConvertFromUtf32(0x276F)
$sl.PromptSymbols.SegmentForwardSymbol = [char]::ConvertFromUtf32(0xE0B0)
$sl.Colors.PromptForegroundColor = [ConsoleColor]::White
$sl.Colors.PromptSymbolColor = [ConsoleColor]::White
$sl.Colors.PromptHighlightColor = [ConsoleColor]::DarkRed
$sl.Colors.GitForegroundColor = [ConsoleColor]::Black
$sl.Colors.WithForegroundColor = [ConsoleColor]::DarkRed
$sl.Colors.WithBackgroundColor = [ConsoleColor]::Magenta
$sl.Colors.VirtualEnvBackgroundColor = [System.ConsoleColor]::Red
$sl.Colors.VirtualEnvForegroundColor = [System.ConsoleColor]::White

$sl.Colors.SessionInfoBackgroundColor = [ConsoleColor]::Black
$sl.Colors.PromptBackgroundColor = [ConsoleColor]::DarkBlue
$sl.Colors.AdminIconForegroundColor = [System.ConsoleColor]::Yellow
$my = [System.ConsoleColor]::DarkYellow
$black = [ConsoleColor]::Black
$sl.PromptSymbols.ElevatedSymbol = ''

Teraz konsola w Cmder wygląda dużo lepiej :

Moja konsola Cmder

Na koniec do Cmder możesz dodać opcję chowania konsoli jakby to była gra Quake.

Quake style Cmder

Teraz za każdym razem, gdy wciśniesz "Ctrl + `" będziesz mógł schować konsole lub ją pokazać. Zawsze też możesz zmienić ten skrót klawiszowy.

Quake style Cmder shortcut

To wszystko teraz twój Cmder jest gotowy pracy