Hlavní navigace

Konfigurace Qtile – klávesové zkratky, pracovní plochy, styly rozložení oken

22. 9. 2016
Doba čtení: 11 minut

Sdílet

Minulým dílem byla ukončena kapitola popisu a konfigurace Spectrwm. V dnešním dílu se zaměřím na Qtile a představím klávesové zkratky, pracovní plochy a styly rozložení oken.

V minulém dílu jsem dokončil uživatelskou konfiguraci Spectrwm a od dnešního dílu se zaměřím na dalšího vybraného zástupce dlaždicových WM – Qtile. Zatím se provedla pouze základní instalace WM a při jeho spuštění byl použit globální konfigurační soubor. Tento soubor se nachází zde:

/usr/share/doc/qtile/default_config.py

Jeho standardní verzi dávám do přílohy

Qtile – standardní konfigurace

Abych mohl zahájit uživatelskou konfiguraci, musím dostat globální soubor na vytvořeného uživatele. To se provede jednoduchým kopírováním pomocí příkazů:

mkdir -p $HOME/.config/qtile

cp /usr/share/doc/qtile/default_config.py $HOME/.config/qtile/config.py

Pokud se na tento soubor zaměřím, tak je jasných několik věcí:

  • jedná se o soubor skriptovacího jazyka Python, což bylo již dříve avizováno
  • konfigurace se nastavuje pomocí nástrojů a funkcí Pythonu a různých knihoven Qtile. V tomto se projevuje skutečnost, že WM je v Pythonu napsaný a s jeho pomocí se také provádí konfigurace
  • soubor má celkem 152 řádků včetně těch prázdných
  • již v základní konfiguraci je nastavených mnoho důležitých ovládacích příkazů
  • celý konfigurační soubor je velmi podrobně komentovaný
  • konfigurační soubor je rozdělený do několika specifických sekcí
  • velmi podrobný popis možností konfigurace je možné najít na stránkách projektu Qtile Doc
  • manuálová stránka je naopak velmi stručná a je v příloze Nápověda Qtile

Důležitý je řádek, který definuje tzv. modifikátor. To je klávesa, s jejíž pomocí je možné spouštět standardní nebo uživatelské akce. V konkrétním případě vypadá úsek konfigurace pro nastavení modifikátoru takto:

mod = mod4

Jak je jasně patrné již z minulých dílů seriálu, je standardním modifikátorem klávesa Win. Je samozřejmě možné použít i jinou klávesu, ale podle mého názoru to není nutné ani moc vhodné. Proto jí nechám na původní hodnotě. Již na této jednoduché konfiguraci se pokusím ukázat, jaké možnosti Qtile uživatelům nabízí. Za tímto účelem je nutné si povšimnout prvních tří výkonných řádků v konfiguraci se zaměřením na ten úplně první:

from libqtile.config import Key, Screen, Group, Drag, Click

Obecně je možné říct, že se v těchto řádcích provádí deklarace a import použitých knihoven/funkcí/tříd Qtile pro uživatelskou konfiguraci. Pro daný účel je důležitá funkce Key (knihovna libqtile.config). Pro zájemce uvedu, že všechny knihovny jsou v systému dostupné v adresáři /usr/lib/pythonX.Y/site-packages/libqtile. Kromě této základní funkce pro definování klávesových zkratek a k nim navázaných akcí, existuje i podobná, modifikovaná funkce. Ta vychází z podobné funkce ve WM XMonad a umožní definovat klávesové zkratky trochu jinak (v tzv. Emacs-like formátu). Pro její implementaci do konfiguračního souboru je nutné změnit výše uvedený první řádek konfigurace podle nápovědy takto:

from libqtile.config import EzKey as Key, Screen, Group, Drag, Click

Touto změnou dostaneme k dispozici definovaný soubor modifikátorů, přiřazených takto:

modifier_keys = {
'M': 'mod4',
'A': 'mod1',
'S': 'shift',
'C': 'control',
}

Pokud by chtěl někdo zkusit variantu, která je uvedená v oficiální nápovědě, tak narazí! Ne proto, že by nápověda kázala nějaké bludy. Problém je v tom, že se v konfiguračním souboru nacházejí již nějaké příkazy a funkce, které se liší pro obě uvedené knihovny. Mně se osvědčil tento postup. Jako první si upravím import knihoven takto:

from libqtile.config import Key, Screen, Group, Drag, Click, EzKey

Pak změním základní konfiguraci modifikátorů:

EzKey.modifier_keys = { 'W': 'mod4', 'A': 'mod1', 'S': 'shift', 'C': 'control', }

Problém je pořád ale v tom, že celý konfigurační soubor je postavený na původní deklaraci, takže všechny příkazy jsou v obecném tvaru např.

Key([mod, "control"], "r", lazy.restart()),
Key([mod, "control"], "q", lazy.shutdown()),
Key([mod], "r", lazy.spawncmd()),

Já jsem schválně vybral tyto tři důležité příkazy (restart WM, ukončení WM a jednoduchý spouštěč aplikací), které je velmi vhodné před prvním spuštěním Qtile v nové konfiguraci změnit asi takto (opět se využije i nová kombinace modifikátorů, aby bylo nastavení stejné, jako v předchozí konfiguraci Spectrwm):

EzKey("W+A+r", lazy.restart()),
EzKey("W+A+q", lazy.shutdown()),
EzKey("W+r", lazy.spawncmd()),

Vzhledem k tom, že se už jedná o poměrně zásadní změnu v konfiguraci, bylo by asi vhodné se poohlédnout po nějaké možnosti konfiguraci testovat. Jak bude vidět dále, je zatím vhodnější provádět změny v konfiguraci BEZ spuštěného Qtile, takže se test hodí dvojnásobně! Zde se opět projeví výhoda Pythonu a testování je jednoduché (pokud se po spuštění příkazu neobjeví žádné hlášení, je konfigurace v pořádku):

python2[python3] -m py_compile ~/.config/qtile/config.py

V mém případě proběhla kontrola bez problémů, takže bylo možné přikročit ke spuštění Qtile na zkoušku. Zatím jsem pro jistotu neprováděl zakomentování původní verze vybraných příkazů. Ještě důležité upozornění: NESMÍ se provést zakomentování řádku s původní deklarací modifikátoru! Jinak by došlo při startu WM k chybě a ten by se nespustil. Když už jsem narazil na možné chyby: ne vše je schopen odhalit výše uvedený příkaz a tak je uživatelům k dispozici logovací soubor $HOME/.local/share/qtile/qtile.log. Tam je v případě potřeby možné najít nastalé problémy a jejich bližší identifikaci. Pokud bude start WM úspěšný, je možné se vrátit do konfiguračního souboru a starou verzi uvedených příkazů zakomentovat nebo vymazat. V rámci popisu konfigurace se budou staré verze použitých příkazů vždy nahrazovat novými a mazat, aby konfigurační soubor nebyl příliš nepřehledný.

Jenom pro doplnění informací o možnostech nastavení klávesových zkratek uvedu, že modifikátorů může být ještě více, než bylo uvedeno, a mohou se vybírat z souboru tlačítek

“shift”, “lock”, “control”, “mod1”, “mod2”, “mod3”, “mod4”, “mod5”

V rámci samotných kláves je samozřejmě možné využít všechny dostupné a funkční klávesy na uživatelské klávesnici. Vzhledem k tomu, že je občas problém s používáním tzv. funkčních kláves, zde je jejich stručný přehled:

Return, BackSpace, Tab, space, Home, End, Left, Up, Right, Down,
F1 - F12,
XF86AudioRaiseVolume, XF86AudioLowerVolume, XF86AudioMute,
XF86AudioNext, XF86AudioPrev, XF86MonBrightnessUp, XF86MonBrightnessDown

To by asi mohlo ke klávesovým zkratkám stačit a je možné tuto sekci opustit. Více o klávesových kombinacích je možné najít v nápovědě Nápověda Keys. Následně se pak můžu pustit do popisu a představení dalšího uživatelského nastavení. V rámci nějakého rozumného rozsahu článků i celého seriálu nebude možné uvést všechno, co je v konfiguraci dostupné. Proto vyberu jenom některé věci a ty ostatní z konfiguračního souboru odstraním nebo ponechám v původní podobě. V reálné konfiguraci by to asi nebylo moc vhodné, ale pro demonstrační účely to bude akceptovatelné. Konfiguraci začnu u nastavení pracovních/virtuálních ploch. Ty se v rámci Qtile nazývají GROUPS. Ve standardní konfiguraci je jich definováno celkem osm a pro jejich názvy jsou použita malá písmena. Kromě samotné definice pracovních ploch jsou definovány i dvě akce: přechod na vybranou pracovní plochu a přesun aktivního okna na vybranou plochu. Příslušná sekce vypadá následovně:

groups = [Group(i) for i in "asdfuiop"]

for i in groups:
    # mod1 + letter of group = switch to group
    keys.append(
        Key([mod], i.name, lazy.group[i.name].toscreen())
    )
    # mod1 + shift + letter of group = switch to & move focused window to group
    keys.append(
        Key([mod, "shift"], i.name, lazy.window.togroup(i.name))
    )

Já nastavím opět celkově pět pracovních ploch, ale je třeba si něco říct k jejich názvům. Asi logicky by se nabízelo použití velkých písmen. Problém je ale v tom, že pak není možné přepínat plochy přímo kombinací kláves Win+název, nefunguje ani Win+Shift+název. Něco podobného platí i pro použití číslic. Nefunguje ani numerická klávesnice, ani horní řada kláves (myšleno samozřejmě na české klávesnici!). Proto ponechám malá písmena a definici změním velmi jednoduše tak, že použiju prvních pět písmen abecedy A-E.

Po uložení změny nestačí provést pouze restart WM, je nutné ho ukončit a znovu nastartovat (pro ukončení je příkaz Win+Alt+Q). Pak je možné ověřit, že bez problémů funguje přechod nebo přesun aktivního okna na vybranou plochu, kde je použije příslušná kombinace Win+[Shift]+A[B,C,D,E]. Vzhledem k použití speciální funkce pro název plochy není možné použít druhý způsob definice klávesové zkratky, takže provedu pouze „komprimaci“ stávajících příkazů do jednoho řádku. K tomu si ale přidám ještě další tři funkce pro manipulaci s plochami: přechod na další plochu, přechod na předchozí plochu a přechod na poslední viditelnou plochu. Tam už jsou jenom „běžné“ příkazy, a tak je možné použít kratší způsob zápisu. Celá sekce ploch pak bude vypadat následovně:

groups = [Group(i) for i in "abcde"]
for i in groups:
    # Win + letter of group = switch to group
    keys.append(Key([mod], i.name, lazy.group[i.name].toscreen()) )

    # Win + shift + letter of group = switch to & move focused window to group
    keys.append(Key([mod, "shift"], i.name, lazy.window.togroup(i.name)) )

    # Win + Left arrow = Move to the group on the left
    keys.append(EzKey("W-<Left>", lazy.screen.prev_group()) )

    # Win + Right arrow = Move to the group on the right
    keys.append(EzKey("W-<Right>", lazy.screen.next_group()) )

    # Win + Home key = Move to the last visited group
    keys.append(EzKey("W-<Home>", lazy.screen.toggle_group()) )

U definice posledních třech kombinací je třeba si povšimnout nutnosti uzavírání použitých funkčních kláves do špičatých závorek. Při druhém způsobu definice by to vypadalo třeba takto:

keys.append(Key([mod], "Home", lazy.screen.toggle_group()) )

To by pro aktuální účely z oblasti pracovních ploch mohlo stačit. Je samozřejmě možné používat i další funkce, ale za tímto účelem zájemce odkážu na nápovědu Nápověda Groups. Tam najdou kromě jiného třeba možnosti nastavení pravidel pro spouštění určitých aplikací na určité ploše atd. Celkový výsledek popsané změny konfigurace je vidět na obrázku

Nastavení pracovních ploch

Na pracovní plochy bych navázal nastavením sady základních aplikací tak, jak jsem to dělal u Spectrwm. V konfiguračním souboru je k dispozici pouze jeden příkaz pro spuštění vybrané aplikace, který vypadá následovně:

Key([mod], "Return", lazy.spawn("xterm")),

Vyjdu z tohoto vzoru, ale použiju jiný zápis, abych definoval celkem devět příkazů pro spuštění zámku obrazovky, správce sezení, tři spouštěče aplikací a čtyři základní uživatelské aplikace. Sekce bude mít následující konečný kód:

# Declare user applications
EzKey("W-A-<BackSpace>", lazy.spawn("i3lock --color=008080 --pointer=default --show-failed-attempts")),
EzKey("W-A-<End>", lazy.spawn("oblogout")),

EzKey("W-A-p", lazy.spawn("dmenu_run -fn monospace:bold:size=11")),
EzKey("W-A-g", lazy.spawn("gmrun")),
EzKey("W-A-<space>", lazy.spawn("rofi -show run -lines 20 -columns 2")),

EzKey("W-A-<Return>", lazy.spawn("lilyterm")),
EzKey("W-A-b", lazy.spawn("netsurf")),
EzKey("W-A-e", lazy.spawn("mousepad")),
EzKey("W-A-f", lazy.spawn("xfe")),

Než budu pokračovat dále, tak se v rámci spouštění aplikací krátce vrátím k jednoduchému spouštěči, který byl zmíněn hned na začátku konfigurace. Jedná se o něco podobného, co je známé třeba z Fluxboxu, Awesome a dalších WM. Při použití příslušné klávesové kombinace (Win+R) se vpravo od přehledu pracovních ploch objeví text spawn: a za ním prostor pro zadání názvu spouštěné aplikace. Funguje to velmi podobně, jako při spouštění aplikací z terminálu. Po zadání nějakých položek si spouštěč jejich názvy pamatuje a při jeho otevření je možné pomocí kurzorových kláves šipka nahoru/dolů seznamem listovat. Spuštění vybrané aplikace se vždy provede klávesou Enter. Znovu ukrýt jednoduchý spouštěč je možné klávesou Esc. Pokud by se při přítomnosti nějaké položky ze seznamu dříve spuštěných aplikací použila opětovně kombinace pro jeho spuštění (Win+R), dojde k vymazání položky ze seznamu. Více je vidět na následujících obrázcích

Spuštěný jednoduchý spouštěč

Položka seznamu spuštěných aplikací

Další zajímavou sekcí konfigurace je nastavení způsobu rozložení otevřených oken, zde nazvaná Layouts. Základní konfigurace je velmi jednoduchá a definuje dvě varianty:

layouts = [
    layout.Max(),
    layout.Stack(num_stacks=2)
]

Základní nastavení a možnosti budu jako obvykle demonstrovat na oknech tří spuštěných aplikací: textový editor, správce souborů a terminál. Rozložení oken v Qtile fungují trochu jinak, než jsem ukazoval ve Spectrwn. V aktuální konfiguraci jsou definovány pouze dva styly rozložení s tím, že jako defaultní je použit vždy ten první deklarovaný. Ten je pak platný pro všechny deklarované pracovní plochy. Jak už asi název prvního rozložení napovídá, jedná se o umístění vždy jednoho otevřeného okna na celou plochu obrazovky. Když jsem tedy aplikace otevřel ve výše uvedeném pořadí, na obrazovce je vidět jenom terminál. O dalších oknech aplikací není nikde ani stopy či poznámky. Proto je nyní vhodný čas podívat se na možnosti manipulace s okny a jejich rozložením:

  • Win+mezerník – přesunuje kurzor k dalším otevřeným oknům aplikací pořád dokola
  • Win+J – přesune kurzor nahoru do dalšího okna ve stohu. Pro maximalizované rozložení má stejnou funkci, jako první akce
  • Win+K – přesune kurzor dolů do dalšího okna ve stohu. Pro maximalizované rozložení má stejnou funkci, jako první akce
  • Win+Ctrl+J – přesune aktivní okno nahoru ve stohu oken. Pro maximalizované rozložení nemá žádný efekt
  • Win+Ctrl+K – přesune aktivní okno dolů ve stohu oken. Pro maximalizované rozložení nemá žádný efekt
  • Win+Shift+mezerník – prohodí pořadí sekcí (hlavní, stohovací) oken v příslušném rozložení oken
  • Win+Shift+Enter – přepíná zobrazení jednoho/všech oken ve stohovací sekci příslušného rozložení
  • Win+W – zavře aktuální okno
  • Win+Tab – pro aktuální pracovní plochu přechází do dalšího rozložení (pořád dokola) v pořadí, v jaké byly deklarovány

Pomocí posledního příkazu provedu přepnutí do dalšího deklarovaného rozložení, jak to ukazuje obrázek

Stohovací rozložení oken

root_podpora

Jak je z obrázku zřejmé (podobně jako u Spectrwm), je na levé straně jedno hlavní okno a na pravé dvě nebo více oken ve stohovací sekci. Na tomto rozložení je už možné vyzkoušet některé výše uvedené akce. Pro dnešní díl už toho bylo dost a další informace o rozložení oken na obrazovce si nechám na díl příští.

Dnešní díl jsem věnoval popisu konfigurace dalšího zástupce dlaždicových WM – Qtile. Bylo probráno nastavení klávesových zkratek a spouštění aplikací s jejich pomocí. Dále jsem popsal nastavení pracovních ploch a základní manipulaci s nimi. Díl byl potom zakončen úvodem do konfigurace stylu rozložení oken na ploše. V příštím dílu budu pokračovat v popisu a konfiguraci stylů rozložení oken. Jako poslední se také v příštím dílu i celé kapitole o Qtile objeví popis a konfigurace systémového panelu.

Byl pro vás článek přínosný?