Alternatívna správa okien v Linuxe

Som jeden z tých, ktorí nastavili Caps Lock na prepínanie rozloženia, pretože som lenivý stlačiť 2 klávesy, keď môžem stlačiť jednu. Dokonca by som chcel 2 zbytočné klávesy: jeden by som použil na zapnutie anglického rozloženia a druhý na ruštinu. Druhým zbytočným kľúčom je ale vyvolanie kontextového menu, ktoré je také zbytočné, že ho mnohí výrobcovia notebookov vysekávajú. Takže sa musíte uspokojiť s tým, čo máte.

A tiež nechcem hľadať ich ikony na paneli úloh pri prepínaní okien alebo zachytávať mená pri prechádzaní Alt + Tab, rolovanie cez plochy a pod. Chcem stlačiť kombináciu kláves (ideálne len jednu, ale už nie sú voľné zbytočné klávesy) a okamžite sa dostať do okna, ktoré potrebujem. Napríklad takto:

  • Alt+F: Firefox
  • Alt+D: Firefox (súkromné ​​prehliadanie)
  • Alt+T: Terminál
  • Alt+M: Kalkulačka
  • Alt+E: Nápad IntelliJ
  • atď.

Navyše stlačením napr Alt+M Chcem vidieť kalkulačku bez ohľadu na to, či je tento program práve spustený. Ak je spustený, jeho okno je potrebné zamerať, a ak nie, spustite požadovaný program a preneste zameranie, keď sa načíta.

Pre prípady, ktoré nie sú pokryté predchádzajúcim skriptom, chcem mať univerzálne kombinácie kláves, ktoré sa dajú ľahko priradiť ku ktorémukoľvek z otvorených okien. Napríklad mám priradených 10 kombinácií z Alt + 1 na Alt + 0, ktoré nie sú viazané na žiadne programy. Môžem len kliknúť Alt + 1 a okno, ktoré je práve zaostrené, sa po kliknutí aktivuje Alt + 1.

Pod rezom je popis niekoľkých ďalších funkcií a odpoveď na to, ako sa to dá urobiť. Okamžite vás však upozorním, že takéto prispôsobenie „pre seba“ môže spôsobiť ťažkú ​​závislosť a dokonca aj odvykanie, ak potrebujete používať Windows, Mac OS alebo dokonca počítač niekoho iného s Linuxom.

V skutočnosti, ak sa nad tým zamyslíte, nepoužívame toľko programov denne. Prehliadač, terminál, IDE, nejaký messenger, správca súborov, kalkulačka a možno to je takmer všetko. Na pokrytie 95 % každodenných úloh nie je potrebných veľa kombinácií klávesov.

Pri programoch, ktoré majú otvorených niekoľko okien, možno jedno z nich označiť ako hlavné. Napríklad máte otvorených a priradených viacero okien IntelliJ Idea Alt + E. Za normálnych podmienok, keď stlačíte Alt + E otvorí sa nejaké okno tohto programu, pravdepodobne to, ktoré bolo otvorené ako prvé. Ak však kliknete na Alt + E keď je jedno z okien tohto programu už zaostrené, potom bude toto konkrétne okno priradené ako hlavné a bude to to, ktoré bude zaostrené po stlačení nasledujúcich kombinácií.

Hlavné okno je možné zmeniť. Ak to chcete urobiť, musíte najprv obnoviť kombináciu a potom jej priradiť ďalšie okno ako hlavné okno. Ak chcete resetovať kombináciu, musíte stlačiť samotnú kombináciu a potom špeciálnu kombináciu resetovania, ku ktorej mám priradenú Alt + Backspace. Toto zavolá skript, ktorý zruší priradenie hlavného okna pre predchádzajúcu kombináciu. A potom môžete priradiť nové hlavné okno, ako je popísané v predchádzajúcom odseku. Obnovenie prepojeného okna na univerzálne kombinácie prebieha rovnakým spôsobom.

Úvod sa ukázal byť dlhý, ale chcel som najprv povedať, čo budeme robiť, a potom vysvetliť, ako na to.

Pre tých, ktorí sú unavení z čítania

Stručne povedané, odkaz na skripty je na konci článku.

Stále ho však nebudete môcť nainštalovať a používať hneď. Najprv musíte zistiť, ako skript nájde požadované okno. Bez toho nebude možné skriptu povedať, kam presne treba preniesť ohnisko. A musíte pochopiť, čo robiť, ak sa náhle nenájde vhodné okno.

A nebudem sa zameriavať na to, ako nakonfigurovať vykonávanie skriptov stlačením kombinácií klávesov. Napríklad v KDE je to v Nastaveniach systému → Skratky → Vlastné skratky. Malo by to tak byť aj v iných správcoch okien.

Predstavujeme wmctrl

Wmctrl — pomôcka konzoly na interakciu s X Window Manager. Toto je kľúčový program pre skript. Poďme sa rýchlo pozrieť na to, ako ho môžete použiť.

Najprv si zobrazme zoznam otvorených okien:

$ 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žnosť -l zobrazí zoznam všetkých otvorených okien a -NS pripojí názov triedy k výstupu (skype.Skype, Navigátor.Firefox atď). Tu potrebujeme ID okna (stĺpec 1), názov triedy (stĺpec 3) a názov okna (posledný stĺpec).

Môžete sa pokúsiť aktivovať nejaké okno pomocou možnosti -a:

$ wmctrl -a skype.Skype -x

Ak všetko prebehlo podľa plánu, na obrazovke by sa malo objaviť okno Skype. Ak namiesto opcie -x použiť možnosť -i, potom namiesto názvu triedy môžete zadať ID okna. Problém s id je v tom, že id okna sa mení pri každom spustení aplikácie a nemôžeme ho vedieť vopred. Na druhej strane tento atribút jednoznačne identifikuje okno, čo môže byť dôležité, keď aplikácia otvára viac ako jedno okno. Viac o tom trochu ďalej.

V tejto fáze si musíme zapamätať, že budeme hľadať požadované okno pomocou regulárneho výrazu podľa výstupu wmctrl -lx. To však neznamená, že musíme použiť niečo zložité. Zvyčajne stačí názov triedy alebo názov okna.

V podstate by už mala byť jasná hlavná myšlienka. V globálnych nastaveniach klávesových skratiek/skratiek pre správcu okien nakonfigurujte požadovanú kombináciu na spustenie skriptu.

Ako používať skripty

Najprv musíte nainštalovať pomocné programy konzoly wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Ďalej si musíte stiahnuť skripty a pridať ich do $ PATH. Zvyčajne ich vkladám ~/bin:

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

Ak je adresár ~/bin nebol tam, potom ho musíte vytvoriť a reštartovať (alebo sa znova prihlásiť), inak ~/bin nezasiahne $ PATH. Ak je všetko vykonané správne, skripty by mali byť prístupné z konzoly a dokončenie kariet by malo fungovať.

Hlavný scenár showwin berie 2 parametre: prvý je regex, pomocou ktorého budeme hľadať požadované okno a druhý parameter je príkaz, ktorý je potrebné vykonať, ak sa požadované okno nenájde.

Môžete skúsiť spustiť skript, napríklad:

$ showwin "Mozilla Firefox$" firefox

Ak je nainštalovaný Firefox, jeho okno by sa malo zamerať. Aj keby Firefox nebol spustený, mal by sa spustiť.

Ak to funguje, môžete sa pokúsiť nakonfigurovať vykonávanie príkazov na kombinácie. V globálnych nastaveniach klávesových skratiek/skratiek pridajte:

  • Alt+F: zobrazí firefox „Mozilla Firefox$“.
  • Alt+D: showwin "Mozilla Firefox (súkromné ​​prehliadanie)$" "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: zobrazí „skype.Skype“ skypeforlinux
  • Alt+E: predstavte nápad „jetbrains-idea“.sh

Atď. Každý si môže nakonfigurovať kombinácie klávesov a softvér, ako uzná za vhodné.
Ak všetko fungovalo správne, pomocou vyššie uvedených kombinácií budeme môcť prepínať medzi oknami jednoduchým stlačením klávesov.

Milovníkov chrómu sklamem: dokáže inkognito rozlíšiť bežné okno podľa výstupu wmctrl Nemôžete, majú rovnaké názvy tried a názvy okien. V navrhovanom regulárnom výraze sú znaky N* a I* potrebné len preto, aby sa tieto regulárne výrazy navzájom líšili a mohli byť priradené ako hlavné okná.

Ak chcete obnoviť hlavné okno predchádzajúcej kombinácie (v skutočnosti pre regulárny výraz, ktorý showwin volaný naposledy), musíte zavolať skript showwinOdpojiť. Tento skript mám priradený ku kombinácii kláves Alt + Backspace.

Pri scenári showwin je tu ešte jedna funkcia. Pri volaní s jedným parametrom (v tomto prípade je parametrom len identifikátor), nekontroluje regulárny výraz, ale považuje všetky okná za vhodné. Samo o sebe sa to zdá zbytočné, ale takto môžeme označiť ľubovoľné okno ako hlavné a rýchlo prepnúť na to konkrétne okno.

Mám nakonfigurované nasledujúce kombinácie:

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

Takto môžem naviazať ľubovoľné okná na kombinácie Alt + 1...Alt + 0. Stačí kliknúť Alt + 1 Na túto kombináciu viažem aktuálne okno. Väzbu môžem zrušiť kliknutím Alt + 1a potom Alt + Backspace. Alebo zatvorte okno, to tiež funguje.

Ďalej vám poviem nejaké technické detaily. Nemusíte ich čítať, ale skúste si ich nastaviť a uvidíte. Ale aj tak by som odporučil porozumieť skriptom iných ľudí pred ich spustením na počítači :).

Ako rozlíšiť medzi rôznymi oknami tej istej aplikácie

V zásade fungoval úplne prvý príklad „wmctrl -a skype.Skype -x“ a dá sa použiť. Pozrime sa však znova na príklad s Firefoxom, v ktorom sú otvorené 2 okná:

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

Prvé okno je normálny režim a druhé je Súkromné ​​prehliadanie. Chcel by som tieto okná považovať za rôzne aplikácie a prepínať do nich pomocou rôznych kombinácií kláves.

Je potrebné skomplikovať skript, ktorý prepína okná. Použil som toto riešenie: zobraziť zoznam všetkých okien, urobte grep podľa regulárneho výrazu zoberte prvý riadok s hlava, získajte prvý stĺpec (toto bude ID okna) pomocou rez, prepnúť na okno podľa id.

Mal by tam byť vtip o regulárnych výrazoch a dvoch problémoch, ale v skutočnosti nepoužívam nič zložité. Potrebujem regulárne výrazy, aby som mohol označiť koniec riadku (symbol „$“) a rozlíšiť „Mozilla Firefox$“ od „Mozilla Firefox (súkromné ​​prehliadanie)$“.

Príkaz vyzerá asi takto:

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

Tu už môžete hádať o druhej vlastnosti skriptu: ak grep nič nevráti, požadovaná aplikácia nie je otvorená a musíte ju spustiť vykonaním príkazu z druhého parametra. A potom pravidelne kontrolujte, či sa požadované okno otvorilo, aby ste naň preniesli zameranie. Nebudem sa na to zameriavať; každý, kto to potrebuje, sa pozrie na zdroje.

Keď okná aplikácií nie sú rozlíšiteľné

Takže sme sa naučili, ako preniesť zameranie do okna požadovanej aplikácie. Ale čo ak má aplikácia otvorených viac ako jedno okno? Na ktorý sa mám zamerať? Skript vyššie sa s najväčšou pravdepodobnosťou prenesie do prvého otvoreného okna. Chceli by sme však väčšiu flexibilitu. Chcel by som mať možnosť zapamätať si, ktoré okno potrebujeme a prepnúť na to konkrétne okno.

Myšlienka bola takáto: Ak si chceme zapamätať konkrétne okno pre kombináciu klávesov, potom musíme túto kombináciu stlačiť, keď je požadované okno zaostrené. Keď v budúcnosti stlačíte túto kombináciu, zameranie bude dané tomuto oknu. Kým sa okno nezavrie alebo kým nevykonáme reset pre túto kombináciu skriptov showwinOdpojiť.

Algoritmus skriptu showwin niečo také:

  • Skontrolujte, či sme si predtým zapamätali ID okna, na ktoré sa má preniesť zameranie.
    Ak si pamätáte a takéto okno stále existuje, presunieme naň zameranie a skončíme.
  • Pozeráme sa na to, ktoré okno je momentálne v centre pozornosti, a ak sa zhoduje s našou požiadavkou, zapamätajte si jeho ID, aby ste naň v budúcnosti prešli a skončili.
  • Ideme aspoň do nejakého vhodného okna, ak existuje, alebo otvoríme požadovanú aplikáciu.

Pomocou nástroja konzoly xdotool môžete zistiť, ktoré okno je aktuálne zaostrené, a to tak, že jeho výstup skonvertujete do hexadecimálneho formátu:

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

Najjednoduchší spôsob, ako si niečo zapamätať v bash, je vytvoriť súbory vo virtuálnom súborovom systéme umiestnenom v pamäti. V Ubuntu je to predvolene povolené /dev/shm/. Nemôžem povedať nič o iných distribúciách, dúfam, že existuje niečo podobné. Môžete sa pozrieť pomocou príkazu:

$ mount -l | grep tmpfs

Skript vytvorí v tomto priečinku prázdne adresáre, ako je tento: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Okrem toho sa pri každom vyvolaní vytvorí symbolický odkaz /dev/shm/$USER/showwin/showwin_last na /dev/shm/$USER/showwin/$SEARCH_REGEX. Bude to potrebné, aby sa v prípade potreby odstránilo ID okna pre určitú kombináciu pomocou skriptu showwinOdpojiť.

Čo sa dá zlepšiť

Po prvé, skripty musia byť nakonfigurované manuálne. Iste, kvôli potrebe vŕtať sa a robiť veľa rukami, sa mnohí z vás ani nepokúsia nakonfigurovať systém. Ak by bolo možné balík jednoducho nainštalovať a všetko nakonfigurovať jednoduchšie, možno by získal určitú popularitu. A potom sa pozrite, aplikácia by bola uvoľnená do štandardných distribúcií.

A možno sa to dá aj jednoduchšie. Ak podľa id okna môžete zistiť id procesu, ktorý ho vytvoril, a podľa id procesu, ktorý príkaz ho vytvoril, potom by bolo možné automatizovať nastavenie. Vlastne som nepochopil, či je možné to, čo som napísal v tomto odseku. Fakt je, že ja osobne som spokojný s tým, ako to teraz funguje. Ale ak niekomu okrem mňa vyhovuje celý prístup a niekto ho vylepší, tak rád použijem lepšie riešenie.

Ďalším problémom, ako som už písal, je, že v niektorých prípadoch sa okná nedajú od seba odlíšiť. Zatiaľ som to pozoroval len pri inkognito v chróme/chróme, ale možno je niečo podobné aj niekde inde. Ako posledná možnosť je vždy možnosť univerzálnych kombinácií Alt + 1...Alt + 0. Opäť používam Firefox a pre mňa osobne tento problém nie je podstatný.

Podstatným problémom pre mňa je však to, že na prácu používam Mac OS a nič také sa mi tam nepodarilo nakonfigurovať. užitočnosť wmctrl Myslím, že sa mi to podarilo nainštalovať, ale v systéme Mac OS to naozaj nefunguje. S aplikáciou sa dá niečo urobiť Automator, ale je taký pomalý, že nie je vhodné ho používať, aj keď funguje. Tiež som nemohol nastaviť kombinácie klávesov tak, aby fungovali vo všetkých programoch. Ak niekto zrazu príde s riešením, rád ho použijem.

namiesto záveru

Ukázalo sa, že na takú zdanlivo jednoduchú funkcionalitu je to nečakane veľké množstvo slov. Chcel som sprostredkovať myšlienku a nepreťažovať text, ale zatiaľ som neprišiel na to, ako to povedať jednoduchšie. Možno by to bolo lepšie vo formáte videa, ale ľudia to tu nemajú radi.

Trochu som hovoril o tom, čo je pod kapotou skriptu a ako ho nakonfigurovať. Nezachádzal som do detailov samotného scenára, ale má len 50 riadkov, takže nie je ťažké ho pochopiť.

Dúfam, že tento nápad ešte niekto vyskúša a možno ho aj ocení. Môžem o sebe povedať, že scenár bol napísaný asi pred 3 rokmi a VEĽMI mi vyhovuje. Tak pohodlné, že spôsobuje vážne nepohodlie pri práci s počítačmi iných ľudí. A s funkčným MacBookom.

Odkaz na skripty

Zdroj: hab.com

Pridať komentár