Radek Chalupa   konzultace a školení programování, vývoj software na zakázku

Prostředí i3 - úvod do vlastní konfigurace

21.3.2021

i3 je dlaždicový správce oken, rychlý a odlehčený, ale výborně konfigurovatelný. Je zaměřený na ovládání klávesnicí s plně nastavitelnými klávesovými zkratkami. Je napsaný v jazyce C s knihovnou xcb.

Jak jsem zmínil v úvodním příspěvku, při prvním přihlášení do i3 se vytvoří konfigurační soubor obsahující výchozí nastavení. Najdeme ho na cestě /home/jmeno-uzivatele/.config/i3/config. Veškeré nastavení včetně automaticky spouštěných aplikací najdeme právě v tomto souboru.

Konfigurační soubor můžeme otevřít a upravovat v libovolném textovém editoru.

Komentáře v tomto souboru jsou řádky začínající znakem #. Jedním ze základních "příkazů" je nastavení klávesové zkratky např.

bindsym $mod+f fullscreen toggle

znamená že současným stiskem modifikační klávesy ([win] nebo [alt] podle nastavení) a klávesy "f" přepneme okno které má fokus do celoobrazovkového zobrazení a zpět.

Dalším důležitým příkazem je exec kterým spustíme zadaný příkaz/aplikaci. Tento příkaz může být navázán na klávesovou zkratku. Například následující dva řádky v konfiguračním souboru umožňují klávesami zvýšit/snížit hlasitost zvukového výstupu o 2 procenta

bindsym Ctrl+Shift+Down exec amixer sset 'Master' 2%-
bindsym Ctrl+Shift+Up exec amixer sset 'Master' 2%+

Příkazem exec uvedeným na začátku řádku následovaným požadovaným příkazem, cestou k aplikaci můžeme nastavit automatické spouštění některých aplikací při spuštění i3. Například následující řádky nastaví pozice monitorů a spustí kompozitor compton

exec xrandr --output DVI-I-1 --left-of HDMI-0
exec compton --config /dev/null --backend glx --vsync opengl-swc

Nastavení písma provedeme jedním řádkem v konfiguračním souboru např.

font pango:DejaVu Sans Mono 11

Skupiny klávesových zkratek

Pokud se dostaneme do stavu, kdy máme velké množství vlastních klávesových zkratek a máme problém najít novou kombinaci která by třeba nekolidovala se standardními zkratkami používanými aplikacemi (jako Ctrl+S, Ctrl+O apod.), můžeme seskupit jednoduché zkratky (mohou být i jednopísmenné) do tzv. modu, který bude aktivní pouze omezenou bodu po vyvolání nějakou hlavní zkratkou. Ukázat si to můžeme na příkladu módu spouštění vybraných aplikací. Nejprve si vybereme zkratku kterou aktivujeme tento mód a pak můžeme spouštět aplikace (nebo samozřejmě provádět jakékoliv akce) jedním písmenem až do té doby než režim ukončíme a tyto zkratky budou neaktivní a nebudou tak kolidovat s jinými. Ukažme si konkrétní ukázku (blok "kódu" v konfiguračním souboru):

mode "launch-app" {
	bindsym g exec --no-startup-id geany; mode "default"
	bindsym f exec --no-startup-id firefox
	bindsym t exec --no-startup-id thunar; mode "default"
	# a dalsi zvolene aplikace ...

	#jedna nebo vice zkratek pro ukonceni imodu
	bindsym Return mode "default"
	bindsym Escape mode "default"
	bindsym $mod+F5 mode "default"
}
bindsym $mod+F5 mode "launch-app"

Jak je vidět z příkladu, pro mód si zvolíme nějaký název (zde je to "launch-app") na který se pak odvoláme v přiřazení klávesové zkratky pomocí bindsym.

Pokud jde o ukončení aktivovaného módu, to provedeme pomocí příkazu mode "default", který můžeme navázat na jednu nebo více klávesových zkratek (zde je to enter, esc nebo opětovný stisk $mod+F5, kterým jsme mod aktivovali. Pokud chceme aby se mód ukonči po vyvolání některého z jeho příkazů, použijeme volání mode "default" zapsaným po středníku za samotným příkazem. Využíváme tak funkci zřetězení příkazů, kterou lze samozřejmě použít i u jiné běžné klávesové zkratky, jednotlivé příkazy oddělíme středníkem a ty jsou pak na jednu zkratku provedeny všechny v pořadí jak jsou zapsané. V uvedené ukázce tedy po vyvolání aplikací Geany a Thunar je mód "automaticky" ukončen, zatímco po spuštění Firefoxu zůstane aktivní a následným stiskem jiné z jeho kláves spustíme jiný příkaz/aplikaci.

Plovoucí okna

I když i3 je dlaždicový správce oken, umožňuje přepnout vybrané okno do plovoucího režimu s tím že nemají běžné systémové ikony (zavření, minimalizace...), ale mají titulkový pruh za který je lze táhnout myší, nicméně i3 je klávesově orientovaný, takže manipulace s plovoucím oknem je snadná pomocí klávesnice.

Výchozí zkratkou pro přepnutí aktivního okna mezi dlaždicovým a plovoucím režimem je $mod+Shift+mezerník. Plovoucí okno (ale stejně tak i dlaždicové) můžeme přepnout do celoobrazovkového režimu zkratkou $mod+f.

Změnu velikosti plovoucích oken můžeme provádět tažením myší, ale i3 je klávesově zaměřený, a tak ve výchozím konfiguračním souboru je rychlá změna velikosti realizována s využitím výše popsaného "modu" který je vyvolán klávesou $mod+r a poté můžeme okno zvětšovat/zmenšovat pouhým stiskem jedné z kurzorových kláves (Left, Right, Up, Down), popř. klávesami j,k,l a ;.

Pro posun plovoucího okna na obrazovce klávesnicí si můžeme obdobně vytvořit samostatný "mod" se stejnými navigačními klávesami a vyvolaný nějakou "volnou" kombinací kláves.

Já osobně používám společný mod pro změnu velikosti a přesun okna rozšířením zmíněného existujícího modu pro změnu velikosti tak, že posun je realizován současným stiskem Shift a kláves pro změnu velikosti, kterým se okno posune o 8 pixelů a kombinace $mod+Shift s kurzorovou klávesou posune okno o 16 pixelů. Příslušný upravený "kód" v konfiguračním souboru vypadá takto:

# resize window (you can also use the mouse for that)
mode "resize" {
        # These bindings trigger as soon as you enter the resize mode

        # Pressing left will shrink the window’s width.
        # Pressing right will grow the window’s width.
        # Pressing up will shrink the window’s height.
        # Pressing down will grow the window’s height.
        bindsym j resize shrink width 10 px or 10 ppt
        bindsym k resize grow height 10 px or 10 ppt
        bindsym l resize shrink height 10 px or 10 ppt
        bindsym semicolon resize grow width 10 px or 10 ppt

        # same bindings, but for the arrow keys
        bindsym Left resize shrink width 10 px or 10 ppt
        bindsym Down resize grow height 10 px or 10 ppt
        bindsym Up resize shrink height 10 px or 10 ppt
        bindsym Right resize grow width 10 px or 10 ppt

        bindsym Shift+Right move right 8 px
        bindsym $mod+Shift+Right move right 16 px
        bindsym Shift+Left move left 8 px
        bindsym $mod+Shift+Left move left 16 px
        bindsym Shift+Up move up 8 px
        bindsym $mod+Shift+Up move up 16 px
        bindsym Shift+Down move down 8 px
        bindsym $mod+Shift+Down move down 16 px
        
        # back to normal: Enter or Escape or $mod+r
        bindsym Return mode "default"
        bindsym Escape mode "default"
        bindsym $mod+r mode "default"
}

bindsym $mod+r mode "resize"