Alternativní správa oken v Linuxu

Jsem jedním z těch, kteří nastavili Caps Lock na přepínání rozložení, protože jsem příliš líný mačkat 2 klávesy, když můžu stisknout jednu. Chtěl bych dokonce 2 zbytečné klávesy: jeden bych použil na zapnutí anglického rozložení a druhý na ruštinu. Druhou zbytečnou klávesou je ale vyvolání kontextové nabídky, která je natolik zbytečná, že ji mnoho výrobců notebooků vysekává. Musíte se tedy spokojit s tím, co máte.

A také nechci hledat jejich ikony na hlavním panelu při přepínání oken nebo chytat názvy při procházení Alt + Tab, procházet plochy atd. Chci stisknout kombinaci kláves (ideálně jen jednu, ale už nejsou volné zbytečné klávesy) a okamžitě se dostat do okna, které potřebuji. Například takto:

  • Alt+F: Firefox
  • Alt+D: Firefox (soukromé prohlížení)
  • Alt+T: Terminál
  • Alt+M: Kalkulačka
  • Alt+E: IntelliJ nápad
  • atd.

Navíc přitlačením např. na Alt+M Chci vidět kalkulačku bez ohledu na to, zda je tento program aktuálně spuštěn. Pokud je spuštěn, pak je třeba jeho oknu aktivovat, a pokud ne, spusťte požadovaný program a přeneste fokus, když se načte.

Pro případy, které nejsou pokryty předchozím skriptem, chci mít univerzální kombinace kláves, které lze snadno přiřadit kterémukoli z otevřených oken. Mám například přiřazeno 10 kombinací od Alt + 1 na Alt + 0, které nejsou vázány na žádné programy. Můžu jen kliknout Alt + 1 a okno, které je aktuálně zaostřené, bude zaostřeno po kliknutí Alt + 1.

Pod řezem je popis několika dalších funkcí a odpověď na to, jak to lze provést. Okamžitě vás však varuji, že takové přizpůsobení „pro sebe“ může způsobit těžkou závislost a dokonce abstinenci, pokud potřebujete používat Windows, Mac OS nebo dokonce počítač někoho jiného s Linuxem.

Ve skutečnosti, když se nad tím zamyslíte, nepoužíváme tolik programů denně. Prohlížeč, terminál, IDE, nějaký messenger, správce souborů, kalkulačka a možná, to je téměř vše. K pokrytí 95 % každodenních úkolů nepotřebujete mnoho klávesových zkratek.

U programů, které mají několik otevřených oken, lze jedno z nich označit jako hlavní. Máte například otevřených a přiřazených více oken IntelliJ Idea Alt + E. Za normálních podmínek, když stisknete Alt + E otevře se nějaké okno tohoto programu, pravděpodobně to, které bylo otevřeno jako první. Pokud však kliknete na Alt + E když je jedno z oken tohoto programu již zaostřeno, pak toto konkrétní okno bude přiřazeno jako hlavní a bude to to, které bude zaostřeno při stisknutí následujících kombinací.

Hlavní okno lze přeřadit. Chcete-li to provést, musíte kombinaci nejprve resetovat a poté k ní přiřadit další okno jako hlavní okno. Chcete-li resetovat kombinaci, musíte stisknout samotnou kombinaci a poté speciální resetovací kombinaci, ke které ji mám přiřazenou Alt+Backspace. To zavolá skript, který zruší přiřazení hlavního okna pro předchozí kombinaci. A pak můžete přiřadit nové hlavní okno, jak je popsáno v předchozím odstavci. Obnovení propojeného okna na univerzální kombinace probíhá stejným způsobem.

Úvod se ukázal být dlouhý, ale chtěl jsem nejprve říct, co budeme dělat, a pak vysvětlit, jak na to.

Pro ty, kteří jsou unaveni čtením

Stručně řečeno, odkaz na skripty je na konci článku.

Stále jej však nebudete moci nainstalovat a používat hned. Nejprve budete muset zjistit, jak skript najde požadované okno. Bez toho nebude možné skriptu říci, kam přesně je potřeba přenést ohnisko. A musíte pochopit, co dělat, když se náhle nenajde vhodné okno.

A nebudu se zaměřovat na to, jak nakonfigurovat provádění skriptů stisknutím kombinace kláves. Například v KDE je v Nastavení systému → Zástupci → Vlastní zástupci. Tak by to mělo být i v ostatních správcích oken.

Představujeme wmctrl

Wmctrl — konzolový nástroj pro interakci s X Window Manager. Toto je klíčový program pro skript. Pojďme se v rychlosti podívat na to, jak jej můžete využít.

Nejprve si zobrazme seznam otevřených oken:

$ wmctrl -lx
0x01e0000e -1 plasmashell.plasmashell             N/A Desktop — Plasma
0x01e0001e -1 plasmashell.plasmashell             N/A Plasma
0x03a00001  0 skype.Skype                         N/A Skype
0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)
...

Možnost -l zobrazí seznam všech otevřených oken a -X připojí k výstupu název třídy (skype.Skype, Navigator.Firefox atd). Zde potřebujeme id okna (sloupec 1), název třídy (sloupec 3) a název okna (poslední sloupec).

Můžete zkusit aktivovat nějaké okno pomocí možnosti -a:

$ wmctrl -a skype.Skype -x

Pokud vše proběhlo podle plánu, na obrazovce by se mělo objevit okno Skype. Pokud místo opce -x použít možnost -i, pak místo názvu třídy můžete zadat id okna. Problém s id je v tom, že id okna se mění při každém spuštění aplikace a nemůžeme to vědět předem. Na druhou stranu tento atribut jednoznačně identifikuje okno, což může být důležité, když aplikace otevírá více než jedno okno. Více o tom trochu dále.

V této fázi si musíme pamatovat, že požadované okno budeme hledat pomocí regulárního výrazu podle výstupu wmctrl -lx. To ale neznamená, že musíme použít něco složitého. Obvykle stačí název třídy nebo název okna.

V podstatě by již měla být jasná hlavní myšlenka. V globálním nastavení klávesových zkratek/klávesových zkratek pro správce oken nakonfigurujte požadovanou kombinaci pro spuštění skriptu.

Jak používat skripty

Nejprve musíte nainstalovat konzolové nástroje wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Dále si musíte stáhnout skripty a přidat je do $ PATH. Obvykle je dávám dovnitř ~/bin:

$ cd ~/bin
$ git clone https://github.com/masyamandev/Showwin-script.git
$ ln -s ./Showwin-script/showwin showwin
$ ln -s ./Showwin-script/showwinDetach showwinDetach

Pokud je adresář ~/bin tam nebyl, pak jej musíte vytvořit a restartovat (nebo se znovu přihlásit), jinak ~/bin nezasáhne $ PATH. Pokud je vše provedeno správně, pak by skripty měly být přístupné z konzole a mělo by fungovat doplňování karet.

Hlavní scénář showwin bere 2 parametry: první je regex, pomocí kterého budeme hledat požadované okno, a druhý parametr je příkaz, který je potřeba provést, pokud se požadované okno nenajde.

Můžete zkusit spustit skript, například:

$ showwin "Mozilla Firefox$" firefox

Pokud je nainstalován Firefox, jeho okno by mělo být zaměřeno. I když Firefox neběžel, měl by se spustit.

Pokud to funguje, můžete zkusit nakonfigurovat provádění příkazů na kombinacích. V globálním nastavení klávesových zkratek/zkratek přidejte:

  • Alt+F: showwin „Mozilla Firefox$“ firefox
  • Alt+D: showwin "Mozilla Firefox (soukromé prohlížení)$" "firefox -private-window"
  • Alt+C: showwin "chromium-browser.Chromium-browser N*" chrom-browser
  • Alt+X: showwin "chromium-browser.Chromium-browser I*" "chromium-browser -inkognito"
  • Alt+S: showwin „skype.Skype“ skypeforlinux
  • Alt+E: showwin nápad „jetbrains-idea“.sh

atd. Každý si může nakonfigurovat kombinace kláves a software, jak uzná za vhodné.
Pokud vše fungovalo správně, pak pomocí výše uvedených kombinací budeme moci přepínat mezi okny pouhým stisknutím kláves.

Milovníky chromu zklamu: dokáže inkognito rozlišit běžné okno podle výstupu wmctrl Nemůžete, mají stejné názvy tříd a názvy oken. V navrhovaném regulárním výrazu jsou znaky N* a I* potřeba pouze proto, aby se tyto regulární výrazy od sebe lišily a mohly být přiřazeny jako hlavní okna.

Chcete-li obnovit hlavní okno předchozí kombinace (ve skutečnosti pro regulární výraz, který showwin volalo minule), musíte zavolat skript showwinOdpojit. Tento skript mám přiřazený ke kombinaci kláves Alt+Backspace.

U scénáře showwin je tu ještě jedna funkce. Když je volána s jedním parametrem (v tomto případě je parametr jen identifikátor), nekontroluje regulární výraz vůbec, ale považuje všechna okna za vhodná. Samo o sobě se to zdá zbytečné, ale můžeme tak označit libovolné okno jako hlavní a rychle se na to konkrétní okno přepnout.

Mám nakonfigurované následující kombinace:

  • Alt+1: showwin "CustomKey1"
  • Alt+2: showwin "CustomKey2"
  • ...
  • Alt+0: showwin "CustomKey0"
  • Alt+Backspace: showwinDetach

Tímto způsobem mohu svázat libovolná okna na kombinace Alt + 1...Alt + 0. Stačí kliknout Alt + 1 Připojuji aktuální okno k této kombinaci. Vazbu mohu zrušit kliknutím Alt + 1a pak Alt+Backspace. Nebo zavřete okno, to také funguje.

Dále vám řeknu nějaké technické detaily. Nemusíte je číst, ale zkuste je nastavit a uvidíte. Ale přesto bych doporučil porozumět cizím skriptům, než je spustíte na svém počítači :).

Jak rozlišit mezi různými okny stejné aplikace

V zásadě fungoval úplně první příklad „wmctrl -a skype.Skype -x“ a lze jej použít. Ale podívejme se znovu na příklad s Firefoxem, ve kterém jsou otevřena 2 okna:

0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)

První okno je normální režim a druhé je soukromé prohlížení. Chtěl bych tato okna považovat za různé aplikace a přepínat do nich pomocí různých kombinací kláves.

Je potřeba zkomplikovat skript, který přepíná okna. Použil jsem toto řešení: zobrazit seznam všech oken, proveďte grep podle regulárního výrazu vezměte první řádek s hlava, získejte první sloupec (toto bude ID okna) pomocí střih, přepnout do okna podle id.

Měl by být vtip o regulárních výrazech a dvou problémech, ale ve skutečnosti nepoužívám nic složitého. Potřebuji regulární výrazy, abych mohl označit konec řádku (symbol „$“) a odlišit „Mozilla Firefox$“ od „Mozilla Firefox (Soukromé prohlížení)$“.

Příkaz vypadá asi takto:

$ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`

Zde již můžete hádat o druhé vlastnosti skriptu: pokud grep nic nevrací, požadovaná aplikace není otevřena a musíte ji spustit provedením příkazu z druhého parametru. A pak pravidelně kontrolujte, zda se požadované okno otevřelo, abyste do něj mohli přenést fokus. Nebudu se na to zaměřovat; každý, kdo to potřebuje, se podívá na zdroje.

Když okna aplikací nejsou rozlišitelná

Naučili jsme se tedy, jak přenést fokus do okna požadované aplikace. Ale co když má aplikace otevřeno více než jedno okno? Na který se mám zaměřit? Výše uvedený skript se s největší pravděpodobností přenese do prvního otevřeného okna. Chtěli bychom však větší flexibilitu. Chtěl bych mít možnost si zapamatovat, které okno potřebujeme, a přepnout na to konkrétní okno.

Myšlenka byla tato: Pokud si chceme zapamatovat konkrétní okno pro kombinaci kláves, musíme tuto kombinaci stisknout, když je požadované okno zaostřené. Když v budoucnu stisknete tuto kombinaci, fokus bude věnován tomuto konkrétnímu oknu. Dokud se okno nezavře nebo neprovedeme reset této kombinace skriptů showwinOdpojit.

Algoritmus skriptu showwin něco takového:

  • Zkontrolujte, zda jsme si dříve zapamatovali ID okna, na které se má fokus přenést.
    Pokud si pamatujete a takové okno stále existuje, přeneseme na něj fokus a ukončíme.
  • Podíváme se na to, které okno je aktuálně zaměřeno, a pokud odpovídá našemu požadavku, zapamatujte si jeho id, abychom na něj v budoucnu přešli a skončili.
  • Jdeme alespoň do nějakého vhodného okna, pokud existuje, nebo otevřeme požadovanou aplikaci.

Pomocí konzole xdotool můžete zjistit, které okno je aktuálně zaostřené, převedením jeho výstupu do hexadecimálního formátu:

$ printf "0x%08x" `xdotool getwindowfocus`

Nejjednodušší způsob, jak si v bash něco zapamatovat, je vytvořit soubory ve virtuálním souborovém systému umístěném v paměti. V Ubuntu je to ve výchozím nastavení povoleno /dev/shm/. O ostatních distribucích nemohu nic říci, doufám, že existuje něco podobného. Můžete se podívat pomocí příkazu:

$ mount -l | grep tmpfs

Skript vytvoří v této složce prázdné adresáře, jako je tento: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Navíc při každém zavolání vytvoří symbolický odkaz /dev/shm/$USER/showwin/showwin_last na /dev/shm/$USER/showwin/$SEARCH_REGEX. To bude nutné, aby bylo možné v případě potřeby odstranit ID okna pro určitou kombinaci pomocí skriptu showwinOdpojit.

Co lze zlepšit

Nejprve je nutné skripty nakonfigurovat ručně. Určitě se mnoho z vás kvůli nutnosti vrtat a dělat hodně rukama nebude ani pokoušet systém konfigurovat. Pokud by bylo možné balíček jednoduše nainstalovat a vše jednodušeji nakonfigurovat, pak by si možná získal nějakou oblibu. A pak se podívejte, aplikace by byla uvolněna do standardních distribucí.

A možná to jde udělat jednodušeji. Pokud podle id okna můžete zjistit id procesu, který jej vytvořil, a podle id procesu, který příkaz jej vytvořil, pak by bylo možné automatizovat nastavení. Vlastně jsem nepochopil, zda je možné to, co jsem napsal v tomto odstavci. Fakt je, že já osobně jsem s tím, jak to teď funguje, spokojený. Pokud ale někomu jinému než mně bude celý přístup vyhovovat a někdo ho vylepší, tak rád použiji lepší řešení.

Dalším problémem, jak jsem již psal, je, že v některých případech nelze okna od sebe odlišit. Zatím jsem to pozoroval jen u inkognita v chromu/chromu, ale snad je něco podobného ještě někde jinde. V krajním případě je vždy možnost univerzálních kombinací Alt + 1...Alt + 0. Opět používám Firefox a pro mě osobně tento problém není podstatný.

Pro mě je ale podstatný problém, že k práci používám Mac OS a nic takového jsem tam nemohl nakonfigurovat. utility wmctrl Myslím, že se mi to podařilo nainstalovat, ale na Mac OS to opravdu nefunguje. S aplikací se dá něco dělat Automator, ale je tak pomalý, že není vhodné jej používat, i když funguje. Také jsem nemohl nastavit kombinace kláves tak, aby fungovaly ve všech programech. Pokud někdo najednou přijde s řešením, rád ho použiji.

Místo závěru

Ukázalo se, že je to nečekaně velké množství slov pro tak zdánlivě jednoduchou funkcionalitu. Chtěl jsem sdělit myšlenku a nepřetěžovat text, ale zatím jsem nepřišel na to, jak to říct jednodušeji. Možná by to bylo lepší ve formátu videa, ale tady to lidé nemají rádi.

Trochu jsem mluvil o tom, co je pod kapotou skriptu a jak jej nakonfigurovat. Nešel jsem do detailů samotného scénáře, ale má jen 50 řádků, takže není těžké mu porozumět.

Doufám, že tento nápad ještě někdo vyzkouší a třeba ho i ocení. Mohu o sobě říci, že scénář byl napsán asi před 3 lety a VELMI mi vyhovuje. Tak pohodlné, že to způsobuje vážné nepohodlí při práci s počítači jiných lidí. A s fungujícím MacBookem.

Odkaz na skripty

Zdroj: www.habr.com

Přidat komentář