Jsem jedním z těch, kteří mají na Caps Lock nastavený přepínač rozložení, protože se mi nechce mačkat dvě klávesy, když mohu mačkat jednu. Dokonce bych chtěl mít dvě zbytečné klávesy: jednu bych používal pro přepínání na anglické rozložení a druhou pro ruské. Ale ta druhá zbytečná klávesa — to je vyvolání kontextového menu, což je tak zbytečné, že mnozí výrobci notebooků ji odstraňují. Takže musím být spokojený s tím, co mám.
A ještě nechci při přepínání oken hledat jejich ikony na panelu úloh, sledovat názvy při procházení přes Alt+Tab, procházet pracovními plochami a tak dále. Chci stisknout klávesovou zkratku (ideálně vůbec jednu, ale už není žádná volná zbytečná klávesa) a okamžitě se dostat do okna, které potřebuji. Například takto:
- Alt+F: Firefox
- Alt+D: Firefox (Soukromé procházení)
- Alt+T: Terminál
- Alt+M: Kalkulačka
- Alt+E: IntelliJ Idea
- a tak dále.
Přitom, když stisknu například Alt+M , chci vidět kalkulačku bez ohledu na to, zda je tato aplikace právě spuštěna. Pokud je spuštěna, oknu se musí předat fokus, a pokud ne — spustit potřebný program a předat mu fokus, když se načte.
Na případy, které nejsou pokryty předchozím scénářem, chci mít univerzální klávesové zkratky, na které lze snadno přiřadit jakákoli otevřená okna. Například mám přiřazeno 10 zkratek od Alt+1 do Alt+0, které nejsou vázány na žádné programy. Mohu jednoduše stisknout Alt+1 a okno, které je teď v focusu, dostane fokus při stisknutí Alt+1.
Pod nadpisem je popis ještě pár funkcí a odpověď na to, jak to lze udělat. Ale ihned varuji, že takováto personalizace „pro sebe“ může vyvolat silnou závislost a dokonce abstinenční příznaky při nutnosti používat Windows, Mac OS nebo dokonce cizí počítač s Linuxem.
Ve skutečnosti, pokud nad tím popřemýšlíme, nevyužíváme v každodenním životě tolik programů. Prohlížeč, terminál, IDE, nějaký messenger, správce souborů, kalkulačka a to je asi vše. Není potřeba tolik klávesových zkratek, aby pokryly 95 % každodenních úkolů.
Pro programy, které mají otevřeno několik oken, lze jedno z nich nastavit jako hlavní. Například mám otevřeno několik oken IntelliJ Idea, které jsou přiřazeny k Alt+E. Za normálních okolností se při stisknutí Alt+E otevře nějaké okno této aplikace, pravděpodobně to, které bylo otevřeno jako první. Pokud však stisknete Alt+E když je jedno z oken této aplikace již v fokus, toto okno bude nastaveno jako hlavní a právě jemu bude přenášen fokus při následných stisknutích kombinace.
Hlavní okno lze přenastavit. K tomu je potřeba nejprve kombinaci resetovat a poté přiřadit jinému oknu jako hlavní. K resetování kombinace je třeba stisknout samotnou kombinaci a poté speciální resetovací kombinaci, u mě je přidělená na Alt+Backspace. Tím se spustí skript, který zruší přiřazení hlavního okna pro předchozí kombinaci. A poté lze přiřadit nové hlavní okno, jak bylo popsáno v předchozím odstavci. Reset přiřazeného okna k univerzálním kombinacím probíhá analogicky.
Úvod se mi zdá dlouhý, ale chtěl jsem nejprve říct, co budeme dělat, a pak vysvětlit, jak to udělat.
Pro ty, kteří mají dost čtení
Jestli to shrnout, odkaz na skripty je na konci článku.
Ale stejně nebude možné hned nainstalovat a používat. Nejprve se musíš vyznat v tom, jak skript najde požadované okno. Bez toho nebude možné skriptu ukázat, kam přesně je potřeba přenést fokus. A je třeba pochopit, co dělat, pokud se náhle nenalezne vhodné okno.
A také se nebudu soustředit na to, jak nastavit spouštění skriptů pomocí klávesových kombinací. Například v KDE to je v Systémových nastaveních → Klávesové zkratky → Vlastní klávesové zkratky. V jiných správci oken by to mělo být také podobné.
Seznámení s wmctrl
Wmctrl — konzolová utilita pro interakci s X Window Managerem. Je to klíčový program pro skript. Pojďme se rychle podívat, jak ho lze používat.
Nejprve si vylistujeme 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 Překladač - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Nejlepší příspěvky za den / Habr - Mozilla Firefox (Soukromé prohlížení)
...Volba -l vypisuje seznam všech otevřených oken, a -x přidává k výstupu název třídy (skype.Skype, Navigator.Firefox atd.). Potřebujeme zde id okna (sloupec 1), název třídy (sloupec 3) a název okna (poslední sloupec).
Můžeme se pokusit aktivovat nějaké okno pomocí volby -a:
$ wmctrl -a skype.Skype -xPokud všechno šlo podle plánu, mělo by se na obrazovce objevit okno Skype. Pokud místo volby -x použít volbu -i, takže místo jména třídy můžeme uvést id okna. Problém s id je, že se mění při každém spuštění aplikace a my ho nemůžeme znát předem. Na druhou stranu tento atribut jednoznačně identifikuje okno, což může být důležité, když aplikace otevře více než jedno okno. O tom si povíme později.
V tomto kroku si musíme zapamatovat, že budeme hledat potřebné okno pomocí regex na výstupu wmctrl -lx. Ale to neznamená, že musíme nutně používat něco složitého. Obvykle stačí jméno třídy nebo název okna.
V zásadě by už měla být hlavní myšlenka jasná. V nastavení globálních klávesových zkratek/klávesových kombinací pro váš správce oken nastavujeme potřebnou kombinaci pro spuštění skriptu.
Jak používat skripty
Nejprve je třeba nainstalovat konzolové utilitky wmctrl a xdotool:
$ sudo apt-get install wmctrl xdotoolDále je třeba stáhnout skripty a přidat je do $PATH. Obvykle je ukládám do ~/bin:
$ cd ~/bin
$ git clone https://github.com/masyamandev/Showwin-script.git
$ ln -s ./Showwin-script/showwin showwin
$ ln -s ./Showwin-script/showwinDetach showwinDetachPokud adresář ~/bin neexistoval, je třeba ho vytvořit a restartovat (nebo se znovu přihlásit), jinak ~/bin nebude dostupný v $PATH. Pokud bylo vše uděláno správně, skripty by měly být dostupné z konzole a mělo by fungovat automatické doplňování pomocí Tab.
Hlavní skript showwin přebírá 2 parametry: první je regex, podle kterého budeme hledat potřebné okno, a druhý parametr je příkaz, který se má vykonat, pokud bylo požadované okno nenalezeno.
Můžete zkusit vykonat skript, například:
$ showwin "Mozilla Firefox$" firefoxPokud je Firefox nainstalován, měl by být oknu předán fokus. I když Firefox nebyl spuštěn, měl by se spustit.
Pokud to vyšlo, můžete zkusit nastavit provedení příkazů na kombinace. V nastavení globálních klávesových zkratek/klávesových kombinací přidáváme:
- Alt+F: showwin „Mozilla Firefox$“ firefox
- Alt+D: showwin „Mozilla Firefox (Private Browsing)$“ „firefox -private-window“
- Alt+C: showwin „chromium-browser.Chromium-browser N*“ chromium-browser
- Alt+X: showwin „chromium-browser.Chromium-browser I*“ „chromium-browser -incognito“
- Alt+S: showwin „skype.Skype“ skypeforlinux
- Alt+E: showwin „jetbrains-idea“ idea.sh
A tak dále. Klávesové kombinace a software si každý může nastavit podle vlastních preferencí.
Pokud se vše podaří správně, pak podle výše uvedených kombinací budeme moci přepínat mezi okny jednoduchým stisknutím kláves.
Zklamu milovníky Chromu: běžné okno nelze od inkognito odlišit podle výstupu. wmctrl Není to možné, mají stejné názvy tříd a titulky oken. V navržených regex jsou znaky N* a I* potřebné pouze k tomu, aby se tyto regulární výrazy od sebe lišily a aby bylo možné přiřadit různým oknům hlavní role.
Pro resetování hlavního okna předchozí kombinace (ve skutečnosti pro regex, který showwin byl vyvolán naposledy) je třeba zavolat skript showwinDetach. Tento skript je u mě přiřazen ke kombinaci kláves. Alt+Backspace.
Skript showwin má ještě jednu funkci. Když je vyvolán s jedním parametrem (v tomto případě je parametr prostě identifikátor), vůbec neskenuje regex a všechna okna považuje za vhodná. To samo o sobě se zdá být zbytečné, ale tímto způsobem můžeme přiřadit jakékoli okno jako hlavní a rychle přepínat přímo na toto okno.
Mám nastavené následující kombinace:
- Alt+1: showwin „CustomKey1“
- Alt+2: showwin „CustomKey2“
- …
- Alt+0: showwin „CustomKey0“
- Alt+Backspace: showwinDetach
Tak mohu přiřadit jakákoli okna k těmto kombinacím. Alt+1…Alt+0Stačí stisknout Alt+1 a přiřazuji aktuální okno k této kombinaci. Odradit přiřazení mohu stisknutím Alt+1, a poté Alt+Backspace. Nebo zavřít okno, to také funguje.
Dále se podělím o trochu technických detailů. Můžete je nečíst a jednoduše zkusit nastavit a podívat se. Ale přesto bych doporučil pochopit cizí skripty, než je spustíte na svém počítači :) .
Jak rozlišovat různá okna jedné aplikace
V podstatě, první příklad „wmctrl -a skype.Skype -x“ byl funkční a lze ho použít. Ale podívejme se znovu na příklad s Firefoxem, ve kterém jsou otevřená 2 okna:
0x04400003 0 Navigator.Firefox N/A Google Překladač - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Nejlepší publikace za den / Habr - Mozilla Firefox (Soukromé prohlížení)První okno je v běžném režimu, zatímco druhé je v režimu soukromého prohlížení. Tato okna bych chtěl považovat za různé aplikace a přepínat mezi nimi různými klávesovými zkratkami.
Je třeba zkomplikovat skript, který přepíná okna. Použil jsem takové řešení: vytvořit seznam všech oken, udělat grep podle regex, vzít první řádek pomocí head, získat první sloupec (to bude id okna) pomocí cut, přepnout na okno podle id.
Tady by měla být vtip o regulárních výrazech a dvou problémech, ale ve skutečnosti nic složitého nepoužívám. Regulárky potřebuji k tomu, abych mohl určit konec řádku (znak „$“) a rozlišovat „Mozilla Firefox$“ od „Mozilla Firefox (soukromé prohlížení)$“.
Tým vypadá přibližně takto:
$ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`Zde už si lze domyslet druhou zvláštnost skriptu: pokud grep nic nevrátí, znamená to, že požadovaná aplikace není otevřená, a je třeba ji spustit vykonáním příkazu z druhého parametru. A poté pravidelně kontrolovat, zda se neotevřelo požadované okno, abychom mu mohli předat fokus. Nebudu se na to zaměřovat, kdo chce, ten se podívá na zdrojové kódy.
Když jsou okna aplikací nerozlišitelná
Takže jsme se naučili předávat fokus oknu potřebné aplikace. Ale co když je otevřeno více než jedno okno dané aplikace? Na které z nich předat fokus? Skript výše pravděpodobně předá fokus prvnímu otevřenému oknu. Chtěli bychom však větší flexibilitu. Rádi bychom si pamatovali, které konkrétní okno potřebujeme, a přepínali se právě k tomu oknu.
Myšlenka byla taková: Pokud chceme pro kombinaci kláves zapamatovat určité okno, musíme stisknout tuto kombinaci ve chvíli, kdy je požadované okno v ohnisku. Při příštím stisknutí této kombinace bude fokus předán právě tomuto oknu. Dokud okno nezavřeme nebo neuděláme reset pro tuto kombinaci skriptu. showwinDetach.
Algoritmus skriptu showwin vypadá zhruba takto:
- Zkontrolujeme, jestli jsme dříve nezapamatovali ID okna, kterému je třeba předat fokus.
Pokud jsme zapamatovali a takové okno stále existuje, předáme mu fokus a skončíme. - Podíváme se, které okno je nyní zaměřeno, a pokud vyhovuje našemu požadavku, zapamatujeme si jeho ID pro pozdější přepínání a skončíme.
- Přejdeme k jakémukoli vhodnému oknu, pokud existuje, nebo otevřeme potřebnou aplikaci.
Zjistit, které okno je nyní zaměřeno, můžeme pomocí konzolové utility xdotool, převodem jejího výstupu do šestnáctkového formátu:
$ printf "0xx" `xdotool getwindowfocus`Něco si zapamatovat v bash je nejsnazší vytvářením souborů ve virtuálním souborovém systému, který se nachází v paměti. V Ubuntu je takový připojen ve výchozím nastavení /dev/shm/. O jiných distribucích nic říct nemohu, doufám, že něco podobného existuje také. Můžete to zkontrolovat pomocí příkazu:
$ mount -l | grep tmpfsSkript bude vytvářet prázdné adresáře v této složce, takto: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Dále při každém vyvolání vytvoří symlink /dev/shm/$USER/showwin/showwin_last na /dev/shm/$USER/showwin/$SEARCH_REGEX. To bude potřebné k tomu, abyste mohli v případě potřeby smazat ID okna pro určitou kombinaci pomocí skriptu showwinDetach.
Co lze zlepšit
Za prvé, skripty je třeba nastavovat ručně. Určitě, kvůli nutnosti se do toho ponořit a dělat mnoho věcí ručně, to mnohé z vás ani nenapadne pokusit se systém nastavit. Kdyby byla možnost jednoduše nainstalovat balíček a nastavit vše jednodušeji, možná by to získalo nějakou popularitu. A kdo ví, možná by pak do standardních distribucí přidali aplikaci.
A možná by to šlo udělat jednodušeji. Pokud podle ID okna můžete zjistit ID procesu, který ho vytvořil, a podle ID procesu zjistit, jaký příkaz ho vytvořil, bylo by možné automatizovat nastavení. Opravdu jsem se tímto odstavcem blíže nezabýval. Osobně mi vyhovuje to, jak to funguje teď. Ale pokud by se to někomu jinému kromě mě zdálo praktické a někdo by to vylepšil, rád bych využil lepší řešení.
Jiný problém, jak už jsem psal, spočívá v tom, že v některých případech nelze okna od sebe odlišit. Zatím jsem toto pozoroval pouze s režimem incognito v chrome/chromium, ale možná, že někde jinde je to podobné. V krajním případě vždy existuje možnost univerzálních kombinací Alt+1…Alt+0. Znovu, používám Firefox a pro mě osobně tento problém není zásadní.
Zásadním problémem pro mě je, že v práci používám Mac OS a tam jsem nic podobného nastavit nedokázal. Nástroj wmctrl se zdá, že jsem nainstaloval, ale na Mac OS správně nefunguje. Něco lze udělat s aplikací Automator, ale je tak pomalá, že se s ní nedá pohodlně pracovat ani když funguje. Také jsem nedokázal nastavit klávesové zkratky tak, aby pracovaly ve všech programech. Pokud někdo vymyslí řešení – budu rád, že ho budu moci používat.
Na závěr
Vyšlo to překvapivě hodně slov pro tak, na první pohled, jednoduchou funkčnost. Chtěl jsem vyjádřit 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 ve formátu videa bylo lepší, ale tady to tak příliš nemají rádi.
Trochu jsem se zmínil o tom, co se skrývá pod kapotou skriptu a jak jej nastavit. Do podrobností samotného skriptu jsem se nepouštěl, ale má jen 50 řádků, rychle se to dá pochopit.
Doufám, že někdo další tuto myšlenku vyzkouší a možná ji i ocení. Mohu říct, že skript byl napsán před třemi lety a mně to velmi usnadňuje práci. Natolik, že to způsobuje značné nepohodlí při práci na cizích počítačích. A na pracovním MacBooku.
Zdroj: habr.com
