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.i ↗s. 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 sekcjadefaults
, 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 pi@192.168.8.2",
"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.
- Instalacja modułów w Powershell
Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser
- Uruchomić polecenie
notepad $PROFILE
za pomocą kombinacjiwin+r
albo w Powershellu. - Otwiera się notatnik, Jeśli to pierwszy raz robimy, to pojawi sie pytanie o utworzenie pliku - klikamy na tak
- 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 list ↗y ↗ albo utworzyć własny.
- 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.