Konfigurace Notion – klávesové zkratky, deklarace systému menu a spouštění aplikací

12. 1. 2017
Doba čtení: 8 minut

Sdílet

Minulý díl byl věnován základům konfigurace Notion. V dnešním dílu se zaměřím na klávesové zkratky, deklaraci systému hlavního, podřízeného a kontextového menu a na závěr spouštění aplikací.

Minulý díl jsem zakončil popisem tří důležitých funkcí, které se vyskytují v hlavním konfiguračním souboru a deklarují klávesové zkratky pro ovládání různých součástek prostředí. Nyní již představím alespoň část konfigurace , konkrétně pak definici zkratek pro třídu WScreen. Když pominu úvodní řádky nápovědy, tak první výkonné příkazy vypadají následovně:

defbindings("WScreen", {
    bdoc("Switch to n:th object (workspace, full screen client window) "..
         "within current screen."),
    kpress(META.."1", "WScreen.switch_nth(_, 0)"),
    kpress(META.."2", "WScreen.switch_nth(_, 1)"),
    kpress(META.."3", "WScreen.switch_nth(_, 2)"),

Jak je z výpisu patrné, byly zde použity všechny tři dříve komentované funkce. Dříve, než se pustím do bližšího komentáře ke konfiguraci, přidám ještě další deklaraci, která navazuje na výše uvedené příkazy:

    bdoc("Switch to next/previous object within current screen."),
    kpress(META.."comma", "WScreen.switch_prev(_)"),
    kpress(META.."period", "WScreen.switch_next(_)"),

Podle nápovědy je možné zjistit, že oba příkazy se týkají přechodu na vybranou pracovní plochu v rámci jedné obrazovky. Jak už je ale v podobných případech zvykem, ovládání je nastavené na číslice a další „divné“ znaky. Proto jsem celou tuto sekci změnil následovně:

defbindings("WScreen", {
    bdoc("Switch to n:th object (workspace, full screen client window) "..
         "within current screen."),
    kpress(META.."Control+F1", "WScreen.switch_nth(_, 0)"),
    kpress(META.."Control+F2", "WScreen.switch_nth(_, 1)"),
    kpress(META.."Control+F3", "WScreen.switch_nth(_, 2)"),
    kpress(META.."Control+F4", "WScreen.switch_nth(_, 3)"),
    kpress(META.."Control+F5", "WScreen.switch_nth(_, 4)"),

    bdoc("Switch to next/previous object within current screen."),
    kpress(META.."Left", "WScreen.switch_prev(_)"),
    kpress(META.."Right", "WScreen.switch_next(_)"),

Konkrétně se jedná o přepnutí na vybranou pracovní plochu pomocí kombinace Win+Ctrl+F1 – F5 a přechod na předchozí/následující pracovní plochu kombinací Win+šipka vlevo/vpravo. Ještě než se případní zájemci pustí do zkoušení uvedených funkcí, je třeba je upozornit na důležitou věc: není vůbec apriori jasné, kolik pracovních ploch je deklarováno (samozřejmě kromě té první a viditelné). Problém Notion je totiž v tom, že aktuální pracovní plochu nijak neoznačuje a neodlišuje od těch ostatních. Proto je vhodné na první pracovní ploše otevřít nějaké okno aplikace a následně použít další funkci, které je pořád v tom samém bloku deklarací:

    bdoc("Create a new workspace of chosen default type."),
    kpress(META.."F9", "ioncore.create_ws(_)"),

Pomocí kombinace Win+F9 je tedy možné vytvořit prakticky libovolný počet ploch stejného typu, jako je ta základní. Pro daný účel bude samozřejmě stačit vytvoření pouze druhé pracovní plochy a vyzkoušet příkazy pro přechody mezi oběma plochami. Jenom pro doplnění uvedu další funkci, která vytváří také nové pracovní plochy. Od té jednoduché ji odlišuje možnost v dialogu zadat parametry nově vytvářené pracovní plochy (označení plochy a způsob rozložení oken = layout). Tato funkce je v sekci WMPlex.toplevel.

    bdoc("Query for workspace to go to or create a new one."),
    kpress(ALTMETA.."F9", "mod_query.query_workspace(_)"),

Dále bych chtěl upozornit na deklaraci kombinovaných klávesových zkratek, které jsem zmiňoval v minulém dílu. Jedna z nich se nachází hned po prvních příkazech pro manipulaci s pracovními plochami (v textu jsem vynechal standardně zakomentované řádky)

    submap(META.."K", {
        bdoc("Go to first region demanding attention or previously active one."),
        kpress("K", "mod_menu.grabmenu(_, _sub, 'focuslist')"),

        bdoc("Clear all tags."),
        kpress("T", "ioncore.tagged_clear()"),
    }),

Zde je nutné konkrétně jako první použít kombinaci kláves Win+K a až se objeví změněný kurzor, tak následně využít samostatně klávesy K nebo T. Průzkum dalších funkcí a klávesových zkratek nyní ponechám na případných uživatelích a přesunu se na úplný konec hlavního konfiguračního souboru. Tam se totiž nacházejí deklarace položek menu. V ní se vyskytují čtyři další funkce, které jsou podle nápovědy definovány následovně:

  • hlavní menu, které může být jedno nebo více. Obsahuje název a seznam jednotlivých podřízených položek podle schématu
ioncore.defmenu(name, tab)
  • kontextové menu je velmi podobně konstruované a umožní definovat opět jedno nebo více menu včetně podřízených položek. Rozdíl proti hlavnímu menu je v tom, že se kontextové menu samozřejmě definuje pro nějaký kontext, např. rámeček, klientské okno apod.
ioncore.defctxmenu(ctx, ...)
  • oba uvedené typy menu pak mohou obsahovat dvě další úrovně. První z nich je funkce pro definici přímo podřízených položek menu. Funkce nastavuje název položky, příkaz k provedení nějaké akce a případný seznam omezení či nastavení
ioncore.menuentry(name, cmd, guard_or_opts)
  • další možností je pak definice celého podřízeného menu, které se skládá z vlastních přímých položek. K jeho deklaraci se používá funkce, která nastavuje název podřízeného menu (name, název sekce, kde je toto podřízené menu deklarováno pomocí funkce defmenu a nastavení zvýrazněné položky při spuštění menu (options)
 ioncore.submenu(name, sub_or_name, options)

Po teoretickém představení se vrátím ke konkrétní deklarací menu ve standardní konfiguraci WM. Jako první je asi logicky deklarované hlavní menu:

defmenu("mainmenu", {
    menuentry("Run...",         "mod_query.query_exec(_)"),
    menuentry("Terminal",       "mod_query.exec_on_merr(_, XTERM or 'xterm')"),
    menuentry("Lock screen",
        "notioncore.exec_on(_, notioncore.lookup_script('notion-lock'))"),
    menuentry("Help",           "mod_query.query_man(_)"),
    menuentry("About Notion",      "mod_query.show_about_ion(_)"),
    submenu("Styles",           "stylemenu"),
    submenu("Session",          "sessionmenu"),
})

Jak je z předchozího textu zřejmé, jsou zde obsaženy celkem tři z výše uvedených systémových funkcí:

  • defmenu – definuje hlavní menu pod uživatelským názvem mainmenu
  • menuentry – deklaruje jednotlivé přímé položky menu
  • submenu – definuje podřízené uživatelské menu

Konkrétně se dá konstatovat, že hlavní menu obsahuje celkem pět položek (jednoduchý spouštěč aplikací, spuštění terminálu, zamčení obrazovky, zobrazení nápovědy a informací o WM) a dvě podřízená menu. Jedno z nich je definováno na dalších řádcích:

-- Session control
 menudefmenu("sessionmenu", {
    menuentry("Save",           "ioncore.snapshot()"),
    menuentry("Restart",        "ioncore.restart()"),
    menuentry("Restart TWM",    "ioncore.restart_other('twm')"),
    menuentry("Exit",           "ioncore.shutdown()"),
})

Jedná se o podřízené menu pro správu sezení, kde jsou definovány základní položky pro uložení, restart a ukončení sezení. Kromě hlavního a podřízeného menu je také definované menu kontextové a to dokonce pro několik situací. Jako ukázku zde uvedu jednoduché kontextové menu pro klientské okno, konkrétně pro jeho ukončení:

-- Context menu for client windows
defctxmenu("WClientWin", "Client window", {
    menuentry("Kill",           "WClientWin.kill(_)"),
})

Kromě deklarace všech možných úrovní a položek menu je také důležité vědět, jakým způsobem se dá toto menu vyvolat. Pro hlavní menu je to naštěstí standardně nastaveno na začátku konfiguračního souboru, kde jsou celkem tři funkce, z toho jednu z nich jsem ještě podrobněji nepředstavil:

bdoc("Display the main menu."),
    kpress(ALTMETA.."F12", "mod_query.query_menu(_, _sub, 'mainmenu', 'Main menu:')"),
    mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),

Pouze pro přehled uvádím několik obrázků s otevřeným menu.

Deklarace samozřejmě patří do hlavního balíku deklarací klávesových zkratek pro správu oken (defbindings(„WScreen“, {). Jak jsem již uvedl, jsou zde dvě známé funkce – pro zobrazení nápovědy (bdoc) a klávesovou zkratku, která menu zobrazí pomocí klávesové kombinace Alt+F12 (kpress(…)). Dosud nepředstavená funkce mpress deklaruje spuštění nějaké akce pomocí stisku tlačítka myši. Kromě této funkce jsou pro ovládání myší k dispozici další funkce pro klik, dvojklik a tažení myší:

ioncore.mpress(buttonspec, cmd, guard)
ioncore.mclick(buttonspec, cmd, guard)
ioncore.mdblclick(buttonspec, cmd, guard)
ioncore.mdrag(buttonspec, cmd, guard)

Je možné si všimnout, že všechny uvedené funkce mají stejnou strukturu deklarace, kdy se definuje tlačítko či kombinace tlačítek myši, prováděný příkaz a volitelná definice podmínek. Dalším rozdílem pro otevření menu pomocí klávesové zkratky a myši je použití různých funkcí pro příkaz. Pro klávesovou zkratku je použita funkce

mod_menu.menu(mplex, sub, menu_or_name, param)

Pro spuštění menu pomocí myši je však použita specializovaná funkce

mod_menu.pmenu(win, sub, menu_or_name)

Jenom pro doplnění uvedu speciální funkci pro spouštění menu pomocí klávesnice:

mod_menu.grabmenu(mplex, sub, menu_or_name, param)

Rozdíl proti běžnému spuštění je v tom, že se zde vstup „osahává“ a pomocí klávesové zkratky, kterou se menu otevírá, je možné procházet podřízené položky. Tento doplněk by měl pro objasnění tvorby klávesových zkratek, myších akcí, deklaraci a otevírání menu stačit a bude možné přejít do dalšího kroku. Tím bude podobně jako v předchozích popisovaných WM definice spouštění základních systémových a uživatelských aplikací. Pro jejich deklaraci může sloužit příklad spuštění terminálu, který je k dispozici v základní konfiguraci. Pro nastavení dalších akcí bude nutné upravit konfiguraci ve dvou souborech. Jako první upravím soubor cfg_notion.lua, kde je v základu definován příkaz pro spuštění terminálu (v minulém díle již konfigurovaný):

XTERM="lilyterm"

Pro ukázkovou konfiguraci doplním a upravím celou sekci následovně:

-- Systemove funkce prostredi
LOCK    = "i3lock --color=008080 --pointer=default --show-failed-attempts"
SESSION    = "oblogout"

-- Spoustece aplikaci
DMENU = "dmenu_run"
GMRUN = "gmrun"
ROFI  = "rofi -show run -lines 20 -columns 2"

-- Uzivatelske aplikace
XTERM = "lilyterm"
WEBBR = "netsurf"
FIMAN = "xfe"
TEDIT = "mousepad"

Po uložení změn je možné se vrátit do konfiguračního souboru cfg_notioncore.lua a v něm najít příkaz pro spuštění terminálu pomocí klávesové zkratky. Ten vypadá následovně:

bdoc("Run a terminal emulator."),
kpress(ALTMETA.."F2", "mod_query.exec_on_merr(_, XTERM or 'xterm')"),

Pro spuštění terminálu je použita funkce, kterou nápověda doporučuje pro spuštění GUI aplikací. Existuje i obecnější funkce, kterou je možné použít také:

ioncore.exec_on(reg, cmd, merr_internal)

Tato funkce používá pro běh systémovou proměnnou DISPLAY k zobrazení na hlavním okně (reg). Pokud by se příkaz pro spuštění aplikace uvozoval jednou dvojtečkou, znamenalo by to spuštění aplikace v defaultním terminálu pomocí skriptu ion-runinxterm. Pokud by byl příkaz uvozen dvěma dvojtečkami, tento skript vyzve uživatele ke stisknutí klávesy Enter po ukončení příkazu v terminálu. Příklady lze nalézt i ve standardním konfiguračním souboru. Jenom pro úplnost uvedu ještě další příkaz pro spouštění aplikací, který kromě toho vrací i hodnotu PID nového procesu:

bitcoin_skoleni

integer ioncore.exec(string cmd)

To by opět mohlo k teorii spouštění aplikací stačit a konkrétní nastavení konfigurace si nechám do dalšího dílu.

Dnešní díl jsem věnoval popisu deklarace klávesových zkratek obecně a konkrétně pak na příkladech definice hlavního a podřízeného menu. Konkrétní ukázkou také byla deklarace spouštění základních systémových i uživatelských aplikací. K nim byl na závěr dílu doplněn popis různých variant spouštění aplikací pomocí nástrojů WM. V příštím dílu dokončím uživatelskou konfiguraci spouštěných uživatelských aplikací a zaměřím se na panel a systémovou lištu.

Autor článku