Odpicowany Windows Terminal – moja wersja

O Windows Terminal wspomniałem w zeszłym roku i nie spodziewałem się, że stanie się podstawowym narzędziem w codziennej pracy. Na dodatek, niesamowicie prosty w konfiguracji i personalizacji.

Windows Terminal – kolejna dobra zmiana Microsoftu

Windows Terminal to aplikacja konsolowa typu open source z obsługą wielu zakładek, sponsorowaną przez firmę Microsoft. Każda z tych zakładek może obsłużyć konsole cmd, Powershell, a także pracować z podsystemem WSL, środowiskami, odpalonymi z poziomu dockera, a nawet połączyć się ze zdalnymi zasobami dzięki protokołom SSH. W tym ostatnim przypadku należałoby dodać usługę OpenSSH (dostępna jako ficzer systemu Windows).

Porzucam wszelkie inne alternatywy, takie jak: Conemu2, Fluent Terminal czy Hyper.is. Mam nadzieję, ze stanie się domyślną konsolą w kolejnych wydaniach systemu Windows.

Zalety Windows Terminal

  • Szybkość działania,
  • personalizacje zakładek (kolory, fonty, tła),
  • dostosowanie skrótów (tryb palety poleceń dostępne pod kombinacją CTRL + Shift + P) ,
  • dynamiczny podział ekranu WT na dowolne obszary,
  • otwieranie hiperłączy
  • emoji jako ikonka zakładek,
  • nieograniczona ilość profili

Ustawienia

Wszelkie personalizacje zakładek, profili czy zmiana globalnej konfiguracji dokonujemy z poziomu pliku konfiguracyjnego (dostaniecie się z poziomu aplikacji). Jest to plik JSON, więc od razu polecam ustawienia darmowego VS Code jako domyślnego edytora. Wszelkie zmiany, które zostaną wprowadzone, są widoczne z miejsca (po zapisie).

Struktura konfiguracji jest bardzo prosta, została podzielona na sekcje:

  • Globalne – domyślne, determinująca zachowanie aplikacji, znajduje się w górnej częsci aplikacji (pełna lista dostępnych parametrów).
  • Profiles – lista skonfigurowanych profili (sesji), zawierające informacje o personalizacji, uruchomiających się poleceniach (powershell ssh python node). Na początek dostępne są 3 profile (powershell cmd azure oraz – jesli jest zainstalowane – wsl) i dodatkowo jest utworzona sekcja defaults, będąca wspólną przestrzenią dla konfiguracji, by nie powielać powtarzającej się konfiguracji (dla mnie to np. rodzina czcionek i jej wysokość).
  • Schemes – zestawy kolorystyczne, które można wykorzystać do w terminalu; społeczność dostarczyła już odpowiednie narzędzie, pozwalające na przegląd dostępnych motywów i skopiowanie do konfiguracji.
  • Keybindings – zmapowanie własnych skrótów klawiaturowych, zarówno globalnych, jak i mocno specyficznych akcji (np. uruchomienie konkretnego profilu).

Podział okienka

Windows Terminal potrafi dzielić główny obszar na kilka paneli z różnymi powłokami systemowymi, dzięki czemu mam obok siebie pogląd np. na logi z Docker oraz logi z appki Node.js. Od dawna miał to Conemu2 czy CMDer, ma teraz Windows Terminal.

Tworzenie

Do dyspozycji mamy następujące kombinacje:

  • Podział w pionie: alt+ shift + -;
  • podział w poziomie alt+ shift + =;
  • automatyczny podział (w zależność od dostępnego obszaru) alt+ shift + d;
  • przytrzymać alt i kliknąć myszką w przycisk + lub z menu wybrać interesujący nas profil;

Przełączanie paneli

Aby przechodzić między panelami, wystarczy przy pomocy strzałek + alt przechodzić do interesującego panela (aktywny panel będzie wyróżniony obwódką).

Zmiana rozmiaru panelu

Nic bardziej trudnego. Wystarczy w aktywnym panelu przytrzymać alt + shift i za pomocą strzałek zmieniać rozmiar.

Paleta komend

Nie mogło zabraknąć i palety komend, dobrze znanej z VS Code, w którym pracuję na codzień. Kombinacja ctrl + shift + p otworzy paletę (szufladę) komend z możliwością filtrowania akcji czy poleceń, wbudowanych w terminal.

Dokumentacja

Jak na open-source’ową aplikację przystało, to Windows Terminal posiada bogatą dokumentację. Dlatego tutaj znajdziecie wszelkie informacje na temat paneli.

Moja konfiguracja

// To view the default settings, hold "alt" while clicking on the "Settings" button.
// For documentation on these settings, see: <https://aka.ms/terminal-documentation>
{
    "$schema": "<https://aka.ms/terminal-profiles-schema>",
    "defaultProfile": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
    "copyOnSelect": true,
    "useTabSwitcher": true,
    "profiles": {
        "defaults": {
            "fontFace": "JetBrainsMono NF",
            "fontSize": 10
        },
        "list": [
            {
                // Make changes here to the powershell.exe profile
                "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
                "name": "PowerShell",
                "commandline": "powershell.exe",
                "fontFace": "JetBrainsMono NF",
                "fontSize": 10,
                "hidden": false,
                "acrylicOpacity": 0.5,
                "closeOnExit": true,
                "colorScheme": "Tomorrow Night",
                "padding": "0, 0, 0, 0",
                "snapOnInput": true,
                "startingDirectory": "d:/",
                // "startingDirectory": "%USERPROFILE%",
                "useAcrylic": false,
                "backgroundImage": "%USERPROFILE%\\desktop_dark_mode.jpg",
                "backgroundImageOpacity": 0.2,
                "backgroundImageStretchMode": "uniformToFill"
            },
            {
                // Make changes here to the cmd.exe profile
                "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
                "name": "cmd",
                "commandline": "cmd.exe",
                "hidden": false,
                "acrylicOpacity": 0.75,
                "closeOnExit": true,
                "colorScheme": "Night Owl",
                "cursorColor": "#FFFFFF",
                "padding": "0, 0, 0, 0",
                "snapOnInput": true,
                // "startingDirectory": "%USERPROFILE%",
                "startingDirectory": "d:/",
                "useAcrylic": false,
                "backgroundImage": "%USERPROFILE%\\desktop_dark_mode.jpg",
                "backgroundImageOpacity": 0.2,
                "backgroundImageStretchMode": "uniformToFill"
            },
            {
                "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
                "hidden": false,
                "name": "Ubuntu",
                "source": "Windows.Terminal.Wsl",
                "acrylicOpacity": 0.5,
                "closeOnExit": true,
                "colorScheme": "Campbell",
                "padding": "0, 0, 0, 0",
                "snapOnInput": true,
                "startingDirectory": "%USERPROFILE%",
                "useAcrylic": false,
                "backgroundImage": "%USERPROFILE%\\desktop_dark_mode.jpg",
                "backgroundImageOpacity": 0.2,
                "backgroundImageStretchMode": "uniformToFill"
            },
            {
                "guid": "{07b52e3e-de2c-5db4-bd2d-ba144ed6c273}",
                "hidden": false,
                "name": "Ubuntu-20.04",
                "source": "Windows.Terminal.Wsl",
                "acrylicOpacity": 0.5,
                "closeOnExit": true,
                "colorScheme": "Ubuntu",
                "padding": "0, 0, 0, 0",
                // "backgroundImage": "%USERPROFILE%\\desktop_dark_mode.jpg",
                "backgroundImage": "%USERPROFILE%\\ubuntu.png",
                "backgroundImageOpacity": 0.2,
                "backgroundImageStretchMode": "none",
                "backgroundImageAlignment": "bottomRight"
            },
            {
                "name": "Malinka",
                "tabTitle": "Malinka",
                "commandline": "ssh [email protected]",
                "icon": "%USERPROFILE%\\raspberry-32.png",
                "hidden": false,
                "acrylicOpacity": 0.75,
                "closeOnExit": true,
                "colorScheme": "Dracula",
                "cursorColor": "#FFFFFF",
                "padding": "0, 0, 0, 0",
                "snapOnInput": true,
                "backgroundImage": "%USERPROFILE%\\raspberrypi.png",
                "backgroundImageOpacity": 0.3,
                // "backgroundImageStretchMode": "uniformToFill",
                "backgroundImageStretchMode": "none",
                "backgroundImageAlignment": "bottomRight"
            },
            {
                "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
                "hidden": true,
                "name": "Azure Cloud Shell",
                "source": "Windows.Terminal.Azure"
            }
        ]
    },
    // Add custom color schemes to this array
    "schemes": [
        {
            "background": "#0C0C0C",
            "black": "#0C0C0C",
            "blue": "#0037DA",
            "brightBlack": "#767676",
            "brightBlue": "#3B78FF",
            "brightCyan": "#61D6D6",
            "brightGreen": "#16C60C",
            "brightPurple": "#B4009E",
            "brightRed": "#E74856",
            "brightWhite": "#F2F2F2",
            "brightYellow": "#F9F1A5",
            "cyan": "#3A96DD",
            "foreground": "#CCCCCC",
            "green": "#13A10E",
            "name": "Campbell",
            "purple": "#881798",
            "red": "#C50F1F",
            "white": "#CCCCCC",
            "yellow": "#C19C00"
        },
        {
            "background": "#000000",
            "black": "#000000",
            "blue": "#000080",
            "brightBlack": "#808080",
            "brightBlue": "#0000FF",
            "brightCyan": "#00FFFF",
            "brightGreen": "#00FF00",
            "brightPurple": "#FF00FF",
            "brightRed": "#FF0000",
            "brightWhite": "#FFFFFF",
            "brightYellow": "#FFFF00",
            "cyan": "#008080",
            "foreground": "#C0C0C0",
            "green": "#008000",
            "name": "Vintage",
            "purple": "#800080",
            "red": "#800000",
            "white": "#C0C0C0",
            "yellow": "#808000"
        },
        {
            "background": "#282C34",
            "black": "#282C34",
            "blue": "#61AFEF",
            "brightBlack": "#5A6374",
            "brightBlue": "#61AFEF",
            "brightCyan": "#56B6C2",
            "brightGreen": "#98C379",
            "brightPurple": "#C678DD",
            "brightRed": "#E06C75",
            "brightWhite": "#DCDFE4",
            "brightYellow": "#E5C07B",
            "cyan": "#56B6C2",
            "foreground": "#DCDFE4",
            "green": "#98C379",
            "name": "One Half Dark",
            "purple": "#C678DD",
            "red": "#E06C75",
            "white": "#DCDFE4",
            "yellow": "#E5C07B"
        },
        {
            "background": "#FAFAFA",
            "black": "#383A42",
            "blue": "#0184BC",
            "brightBlack": "#4F525D",
            "brightBlue": "#61AFEF",
            "brightCyan": "#56B5C1",
            "brightGreen": "#98C379",
            "brightPurple": "#C577DD",
            "brightRed": "#DF6C75",
            "brightWhite": "#FFFFFF",
            "brightYellow": "#E4C07A",
            "cyan": "#0997B3",
            "foreground": "#383A42",
            "green": "#50A14F",
            "name": "One Half Light",
            "purple": "#A626A4",
            "red": "#E45649",
            "white": "#FAFAFA",
            "yellow": "#C18301"
        },
        {
            "background": "#002B36",
            "black": "#073642",
            "blue": "#268BD2",
            "brightBlack": "#002B36",
            "brightBlue": "#839496",
            "brightCyan": "#93A1A1",
            "brightGreen": "#586E75",
            "brightPurple": "#6C71C4",
            "brightRed": "#CB4B16",
            "brightWhite": "#FDF6E3",
            "brightYellow": "#657B83",
            "cyan": "#2AA198",
            "foreground": "#839496",
            "green": "#859900",
            "name": "Solarized Dark",
            "purple": "#D33682",
            "red": "#DC322F",
            "white": "#EEE8D5",
            "yellow": "#B58900"
        },
        {
            "background": "#FDF6E3",
            "black": "#073642",
            "blue": "#268BD2",
            "brightBlack": "#002B36",
            "brightBlue": "#839496",
            "brightCyan": "#93A1A1",
            "brightGreen": "#586E75",
            "brightPurple": "#6C71C4",
            "brightRed": "#CB4B16",
            "brightWhite": "#FDF6E3",
            "brightYellow": "#657B83",
            "cyan": "#2AA198",
            "foreground": "#657B83",
            "green": "#859900",
            "name": "Solarized Light",
            "purple": "#D33682",
            "red": "#DC322F",
            "white": "#EEE8D5",
            "yellow": "#B58900"
        },
        {
            "name": "vscode",
            "background": "#232323",
            "black": "#000000",
            "blue": "#579BD5",
            "brightBlack": "#797979",
            "brightBlue": "#9BDBFE",
            "brightCyan": "#2BC4E2",
            "brightGreen": "#1AD69C",
            "brightPurple": "#DF89DD",
            "brightRed": "#F6645D",
            "brightWhite": "#EAEAEA",
            "brightYellow": "#F6F353",
            "cyan": "#00B6D6",
            "foreground": "#D3D3D3",
            "green": "#3FC48A",
            "purple": "#CA5BC8",
            "red": "#D8473F",
            "white": "#EAEAEA",
            "yellow": "#D7BA7D"
        },
        {
            "background": "#011627",
            "black": "#011627",
            "blue": "#82AAFF",
            "brightBlack": "#44596B",
            "brightBlue": "#5CA7E4",
            "brightCyan": "#21C7A8",
            "brightGreen": "#22DA6E",
            "brightPurple": "#7E57C2",
            "brightRed": "#EF5350",
            "brightWhite": "#FFFFFF",
            "brightYellow": "#FFEB95",
            "cyan": "#7FDBCA",
            "foreground": "#CCCCCC",
            "green": "#ADDB67",
            "name": "Night Owl",
            "purple": "#C792EA",
            "red": "#F78C6C",
            "white": "#BEC5D4",
            "yellow": "#FFCB8B"
        },
        {
            "name": "Tomorrow Night",
            "black": "#000000",
            "red": "#cc6666",
            "green": "#b5bd68",
            "yellow": "#f0c674",
            "blue": "#81a2be",
            "purple": "#b294bb",
            "cyan": "#8abeb7",
            "white": "#ffffff",
            "brightBlack": "#000000",
            "brightRed": "#cc6666",
            "brightGreen": "#b5bd68",
            "brightYellow": "#f0c674",
            "brightBlue": "#81a2be",
            "brightPurple": "#b294bb",
            "brightCyan": "#8abeb7",
            "brightWhite": "#ffffff",
            "background": "#1d1f21",
            "foreground": "#c5c8c6"
        },
        {
            "name": "Ubuntu",
            "black": "#2e3436",
            "red": "#cc0000",
            "green": "#4e9a06",
            "yellow": "#c4a000",
            "blue": "#3465a4",
            "purple": "#75507b",
            "cyan": "#06989a",
            "white": "#d3d7cf",
            "brightBlack": "#555753",
            "brightRed": "#ef2929",
            "brightGreen": "#8ae234",
            "brightYellow": "#fce94f",
            "brightBlue": "#729fcf",
            "brightPurple": "#ad7fa8",
            "brightCyan": "#34e2e2",
            "brightWhite": "#eeeeec",
            "background": "#300a24",
            "foreground": "#eeeeec"
        },
        {
            "name": "Solarized Dark - Patched",
            "black": "#002831",
            "red": "#d11c24",
            "green": "#738a05",
            "yellow": "#a57706",
            "blue": "#2176c7",
            "purple": "#c61c6f",
            "cyan": "#259286",
            "white": "#eae3cb",
            "brightBlack": "#475b62",
            "brightRed": "#bd3613",
            "brightGreen": "#475b62",
            "brightYellow": "#536870",
            "brightBlue": "#708284",
            "brightPurple": "#5956ba",
            "brightCyan": "#819090",
            "brightWhite": "#fcf4dc",
            "background": "#001e27",
            "foreground": "#708284"
        },
        {
            "name": "Dracula",
            "cursorColor": "#F8F8F2",
            "selectionBackground": "#44475A",
            "background": "#282A36",
            "foreground": "#F8F8F2",
            "black": "#21222C",
            "blue": "#BD93F9",
            "cyan": "#8BE9FD",
            "green": "#50FA7B",
            "purple": "#FF79C6",
            "red": "#FF5555",
            "white": "#F8F8F2",
            "yellow": "#F1FA8C",
            "brightBlack": "#6272A4",
            "brightBlue": "#D6ACFF",
            "brightCyan": "#A4FFFF",
            "brightGreen": "#69FF94",
            "brightPurple": "#FF92DF",
            "brightRed": "#FF6E6E",
            "brightWhite": "#FFFFFF",
            "brightYellow": "#FFFFA5"
        }
    ],
    // Add any keybinding overrides to this array.
    // To unbind a default keybinding, set the command to "unbound"
    // settings.json
    "keybindings": [
        {
            "command": {
                "action": "copy",
                "singleLine": false
            },
            "keys": "ctrl+c"
        },
        {
            "command": "paste",
            "keys": "ctrl+v"
        },
        {
            "command": "find",
            "keys": "ctrl+f"
        },
        {
            "command": {
                "action": "splitPane",
                "split": "auto",
                "splitMode": "duplicate"
            },
            "keys": "alt+d"
        },
        {
            "command": {
                "action": "closePane"
            },
            "keys": "ctrl+w"
        },
        {
            "command": {
                "action": "newTab"
            },
            "keys": "ctrl+t"
        }
    ]
}

Efekt powyżzszej konfiguracji mam taki:

Dodatkowe informacje

Instalacja dedykowanych fontów z ligaturą (glyph)

Większość dostępnych fontów w systemie nie posiada specjalnych znaczków (glyphów), przez co w konsoli może objawić się pustymi znakami (prostokąty). Microsoft wypuścił rodzinę fontów Cascadia Code, dedykowaną do programowania (można ustawić zarówno w VS Code jak i w Windows Termnal). Ściągamy z repozytorium archiwum, rozpakowujemy i instalujemy dla wszystkich użytkowników. W konfiguracji konsoli czy terminala zmieniamy font-family na Cascadia Code PL.

Osobiście korzystam z JetBrains Mono ale zauważyłem, ze i tutaj są puste prostąkąty. Z pomoc przyszło świetne repozytorium termnalowych fontów – NerdFonts.com zawierające pokaźny katalog dostępnych odpowiednio zmodyfikowanych fontów. W tym ww. JetBrains Mono.

Doping powershella – Oh My Posh

Przyzwyczaiłem się do powłoki systemowej ZSH wraz z oh-my-zsh, która niemal zawsze ląduje na moich linuksowych zabawkach. Ze zdziwienieniem odkryłem fakt, ze podobne rozwiązanie mozna zastosować w Powershellu – z pomocą przychodzi oh-my-posh.

Instalacja jest trywialna.

  1. Instalacja modułów w Powershell
Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser
  1. Uruchomić polecenie notepad $PROFILE za pomocą kombinacji win+r albo w Powershellu.
  2. Otwiera się notatnik, Jeśli to pierwszy raz robimy, to pojawi sie pytanie o utworzenie pliku – klikamy na tak
  3. Wklejamy poniższy fragment kodu:
Import-Module posh-git
Import-Module oh-my-posh
Set-Theme Agnoster

Agnoster to nazwa motywu kolorystycznego, można zatem wybrać inny z dostępnej listy albo utworzyć własny.

  1. Przeładować / odświeżyć powershella za pomocą komendy . $profile

Protip: Skoro mamy utworzony skrypt, uruchamiający się wraz z powershellem, to możemy pokusić się o własne funkcje pomocnicze, dziąłające w terminalu.

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

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 GotoWorkspace
{
	Set-Location d:\\w
}

function GotoProjekt
{
	Set-Location d:\\w\\projekt
}

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

Ściągawka znaleziona u Cezarego Walenciuka.

Podsumowanie

To nie są wszystkie możliwości windowsowego Terminala – patrząc na dość pokaźną dokumentację. Warto poświęcić czas na dopieszczenie terminala, urozmaicić codzienny workflow. Jako zatwardziały wieloletni użytkownik Okienek tym bardziej nie mam zamiaru zmieniać systemu. Praktycznie wszystko to, co potrzebuje do codziennej pracy jako web developer, mam pod ręką.

Z drugiej strony mocno przejechałem się na WSL2 i jego sławnej szybkości, ale to już temat na odrębny wpis.

0 0 vote
Article Rating
Subscribe
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

3 komentarzy
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
xpil
1 miesiąc temu

Mi się WSL2 bardzo podoba (Windows Terminal zresztą też), niestety nie jest w pełni zgodny z Dockerem (sieć!), a ponieważ od pół roku siedzę zawodowo w Dokerze po uszy, musiałem się przesiąć na Linuksa.

xpil
Reply to  bobiko
1 miesiąc temu

Pracę mam ostatnio dość mocno związaną z Dockerem. Wersja Dockera pod Windows nie jest w pełni kompatybilna z linuksową/makową w części sieciowej, dlatego musiałem się przesiąść. Gdyby nie ten jeden szczegół, pewnie nadal używałbym Windows.

Brak Adobe Readera pod Linuksem boli mnie dość mocno, zwłaszcza niemożność składania podpisów pod dokumentami.

Cała reszta… czym dłużej używam Linuksa, tym mniej mi on przeszkadza ;)

3
0
Would love your thoughts, please comment.x
()
x
%d bloggers like this: