Alternatív ablakkezelés Linuxon

Olyanok közé tartozom, akik a Caps Lockot használják a nyelvi váltásra, mert lusta vagyok két billentyűt megnyomni, amikor lehet egyet nyomni. Még két felesleges billentyűt is szeretnék: az egyiket az angol nyelvű billentyűzet bekapcsolásához, a másikat pedig az oroszhoz. De a második felesleges billentyű - a kontextus menü megnyitása - annyira felesleges, hogy sok laptopgyártó kiszedi. Így hát be kell érnem azzal, ami van.

Emellett nem akarom, hogy az ablakok váltásakor keresgéljem a tálcán a ikonjaikat, vagy a neveiket lesném a Alt+Tab, váltogassak az asztalok között stb. Egy billentyűkombinációt szeretnék megnyomni (ideális esetben egyet, de már nincsenek szabad felesleges billentyűim), és azonnal a szükséges ablakba szeretnék jutni. Például így:

  • Alt+F: Firefox
  • Alt+D: Firefox (Privát böngészés)
  • Alt+T: Terminál
  • Alt+M: Számológép
  • Alt+E: IntelliJ Idea
  • stb.

Ráadásul, ha például megnyomom az Alt+M , szeretném látni a számológépet függetlenül attól, hogy ez a program éppen fut-e. Ha fut, akkor a fókuszt az ablakra kell átkapcsolni, ha meg nem, akkor el kell indítani a szükséges programot, és a fókuszt átadni, amikor betöltődik.

Azokra az esetekre, amelyeket a korábbi forgatókönyv nem fed le, szeretném, ha lennének univerzális billentyűkombinációk, amelyeket könnyen hozzárendelhetek bármely nyitott ablakhoz. Például nekem 10 kombinációm van az Alt+1 tól Alt+0, amelyek nincsenek semmilyen programhoz hozzákapcsolva. Egyszerűen megnyomhatom, Alt+1 és az ablak, amelyik éppen fókuszban van, fókuszt kap, amikor megnyomom. Alt+1.

A tovább mögött egy pár funkció leírása és válasz arra, hogy ezt hogyan lehet megvalósítani. De előre figyelmeztetek, hogy az ilyen 'saját igények' szerinti testreszabás erős függőséget okozhat és akár megvonási tüneteket is eredményezhet, ha Windows-t, Mac OS-t, vagy akár egy másik Linuxos számítógépet kell használnom.

Valójában, ha jobban belegondolunk, nem használunk olyan sok programot a mindennapokban. Egy böngésző, terminál, IDE, valamilyen üzenetküldő, fájlkezelő, számológép, és valószínűleg ennyi az egész. Nem szükséges olyan sok billentyűkombináció ahhoz, hogy a mindennapi feladatok 95%-át lefedjük.

Azoknak a programoknak, amelyekből több ablak nyitva van, az egyiket fő ablaknak lehet megjelölni. Például több IntelliJ Idea ablak van megnyitva, ezek egyikét az Alt+Ebillentyűhöz rendelhetjük. Normál körülmények között, amikor megnyomom ezt, Alt+E megnyílik a program ablakának egy példánya, valószínűleg az, amelyik az első volt. Azonban, ha rákattintunk, Alt+E amikor a program ablakainak egyike már fókuszban van, éppen ez az ablak lesz a fő, és erre az ablakra fog fókuszálni a következő billentyűkombinációk megnyomásakor.

A főablakot újra be lehet állítani. Ehhez először vissza kell állítani a kombinációt, majd egy másik ablakot kell megjelölni főablakként. A kombináció visszaállításához meg kell nyomni a kombinációt, majd a speciális visszaállító kombinációt, ami nálam a következő: Alt+Backspace. Ez meghív egy szkriptet, ami visszavonja a főablak beállítását az előző kombinációhoz. Ezt követően új főablakot rendelhetünk hozzá, ahogy azt az előző bekezdésben leírtam. Az általános kombinációkhoz való ablak visszaállítása hasonlóképpen történik.

Az intro hosszú lett, de először is arról akartam beszélni, hogy mit fogunk csinálni, majd elmondani, hogyan csináljuk.

Aki már unja az olvasást,

Röviden, a szkriptek linkje a cikk végén található.

De úgysem fog azonnal telepíteni és használni. Először meg kell értenie, hogyan találja meg a szkript a megfelelő ablakot. Anélkül nem lehet megmondani, hová kell átadni a fókuszt a szkriptnek. És meg kell értenie, mi a teendő, ha hirtelen nem található megfelelő ablak.

Továbbá nem fogom hangsúlyozni, hogyan kell beállítani a szkriptek futtatását billentyűkombinációk megnyomásával. Például KDE-ben ez a Rendszerbeállítások → Billentyűparancsok → Egyedi billentyűparancsok menü alatt található. Más ablakkezelőkben is hasonlónak kell lennie.

Ismerjünk meg egy wmctrl-t

Wmctrl — egy parancssori segédeszköz az X Window Manager-rel való interakcióhoz. Ez a kulcsfontosságú program a szkripthez. Nézzük meg gyorsan, hogyan használhatjuk.

Először is, hozzuk létre a nyitott ablakok listáját:

$ 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 Fordító - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Legjobb bejegyzések az utolsó 24 órában / Habr - Mozilla Firefox (Privát böngészés)
...

Opció -l megmutatja az összes nyitott ablak listáját, míg -x hozzáadja a kimenethez az osztály nevét (skype.Skype, Navigator.Firefox stb.). Itt az ablak azonosítóra (1. oszlop), osztály nevére (3. oszlop) és az ablak címére (az utolsó oszlop) lesz szükségünk.

Megpróbálhatunk aktiválni egy ablakot az alábbi opcióval: -a:

$ wmctrl -a skype.Skype -x

Ha minden a tervek szerint halad, akkor a képernyőn meg kell jelennie a Skype ablakának. Ha a lehetőség helyett -x az opciót istifadə etməlisiniz -i, akkor az osztálynév helyett megadhatjuk az ablak azonosítóját. Az azonosítóval az a probléma, hogy az ablak azonosítója minden alkalmazás indításakor megváltozik, így előre nem tudjuk, mi lesz az. Másrészt ez a tulajdonság egyértelműen az ablakra utal, ami fontos lehet, ha az alkalmazás több ablakot nyit. Erről később.

Ezen a ponton meg kell jegyeznünk, hogy a megfelelő ablakot a regex segítségével fogjuk keresni a kimenet alapján wmctrl -lx. De ez nem azt jelenti, hogy feltétlenül valami bonyolultat kell használnunk. Általában elegendő az osztály neve vagy az ablak neve.

Alapvetően már tisztában kell lennünk a fő ötlettel. A globális gyorsbillentyűk/beállítások beállítása során a window managerben beállítjuk a szükséges kombinációt a script futtatásához.

Hogyan használjuk a skripteket

Első lépésként telepítenünk kell a konzolos segédprogramokat wmctrl és xdotool:

$ sudo apt-get install wmctrl xdotool

Ezután le kell tölteni a skripteket és hozzá kell adni a $PATH. Én általában a következő mappába teszem őket ~\/bin:

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

Ha a könyvtár ~\/bin nem létezett, akkor létre kell hozni, és újra kell indítani (vagy újra be kell jelentkezni), különben ~\/bin nem fog bekerülni a $PATH. Ha minden helyesen lett elvégezve, akkor a skripteknek elérhetőnek kell lenniük a konzolból, és működnie kell a Tab-alapú automatikus kiegészítésnek.

A fő skript showwin két paramétert fogad: az első a regex, amellyel a szükséges ablakot keressük, a második paraméter pedig az a parancs, amelyet végre kell hajtani, ha nem találjuk a keresett ablakot.

Megpróbálhatjuk végrehajtani a skriptet, például:

$ showwin "Mozilla Firefox$" firefox

Ha a Firefox telepítve van, az ablakának fókuszba kell kerülnie. Még ha a Firefox nem is volt elindítva, el kell indulnia.

Ha ez sikerült, próbálhatjuk beállítani a parancsok végrehajtását a kombinációkra. A globális gyorsbillentyűk/beállításokban hozzáadjuk:

  • Alt+F: showwin «Mozilla Firefox$» firefox
  • Alt+D: showwin «Mozilla Firefox (Privát böngészés)$» «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

Stb. A billentyűzet- és szoftverbeállításokat mindenki a saját kényelme szerint állíthatja be.
Ha minden helyesen történt, akkor a fent megadott kombinációkkal egyszerű billentyűnyomásokkal válthatunk az ablakok között.

Csalódást fogok okozni a Chrome-rajongóknak: az inkognitó mód nem különbözik a normál ablak kimenetétől. wmctrl Nem lehet, mert az osztályok nevei és az ablakok címei megegyeznek. A megadott regexek N* és I* karakterei csak arra szolgálnak, hogy ezek a reguláris kifejezések különbözzenek egymástól, és így különböző ablakokat lehessen fő ablakoknak kijelölni.

Az előző kombináció fő ablakának visszaállításához (tulajdonképpen a regex számára, amely showwin utoljára hívva lett) futtatni kell a szkriptet showwinDetach. Nálam ezt a szkriptet billentyűkombinációra állították be. Alt+Backspace.

A szkriptnek showwin még egy funkciója van. Amikor egy paraméterrel hívják meg (ebben az esetben a paraméter csupán egy azonosító), akkor nem ellenőrzi a regexet, hanem minden ablakot megfelelőnek tekint. Ez önmagában haszontalannak tűnik, de így bármelyik ablakot fő ablaknak lehet kijelölni, és gyorsan válthatunk erre az ablakra.

Nálam ezek a kombinációk vannak beállítva:

  • Alt+1: showwin «CustomKey1»
  • Alt+2: showwin «CustomKey2»
  • …
  • Alt+0: showwin «CustomKey0»
  • Alt+Backspace: showwinDetach

Így bármely ablakot hozzárendelhetek a kombinációkhoz. Alt+1…Alt+0Csak megnyomva Alt+1 az aktuális ablakot hozzárendelem ehhez a kombinációhoz. A hozzárendelést úgy tudom törölni, hogy megnyomom Alt+1, majd Alt+Backspace. Vagy egyszerűen bezárhatom az ablakot, ez is működik.

Most mesélek egy kicsit a technikai részletekről. Nem kötelező elolvasni, csak próbáld beállítani és nézd meg. De azért javaslom, hogy előbb értsd meg mások szkriptjeit, mielőtt futtatod őket a saját számítógépeden :).

Hogyan különböztessük meg az egy alkalmazás különböző ablakait

Alapvetően a legelső példa, a „wmctrl -a skype.Skype -x”, működött, és felhasználható. De nézzük meg újra a Firefox példáját, amelyben 2 ablak van nyitva:

0x04400003  0 Navigator.Firefox                   N/A Google Fordító - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Legjobb publikációk az elmúlt 24 órában / Habr - Mozilla Firefox (Privát böngészés)

Az első ablak — normál mód, a második — Privát böngészés. Ezeket az ablakokat külön alkalmazásoknak szeretnénk tekinteni, és különböző billentyűkombinációkkal szeretnénk váltani közöttük.

Meg kell bonyolítani a szkriptet, amely az ablakok között vált. Egy ilyen megoldást használtam: kiírtam az összes ablak listáját, készítettem grep regexet, az első sort az headsegítségével kivettem, az első oszlopot (ez az ablak azonosítója lesz) a cutsegítségével, és az ablakra az azonosító alapján váltottam.

Itt egy vicc kellene a reguláris kifejezésekről és két problémáról, de valójában semmi bonyolultat nem használok. A reguláris kifejezések nekem arra kellenek, hogy meg tudjam adni a sor végét (a „$” jelet), és meg tudjam különböztetni a „Mozilla Firefox$”-ot a „Mozilla Firefox (Private Browsing)$”-tól.

A parancs körülbelül így néz ki:

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

Itt már lehet sejteni a script másik sajátosságát: ha a grep nem ad vissza semmit, akkor a szükséges alkalmazás nincs megnyitva, és el kell indítani a második paraméterben szereplő parancsot. Aztán időnként ellenőrizni kell, hogy megnyílt-e a szükséges ablak, hogy át tudjuk adni neki a fókuszt. Nem fogom túlságosan hangsúlyozni ezt, aki akarja, az megnézi a forrást.

Amikor az alkalmazás ablakai nem megkülönböztethetők

Tehát megtanultuk, hogyan adjuk át a fókuszt a szükséges alkalmazás ablakának. De mi van, ha több mint egy ablak van megnyitva az alkalmazásból? Melyiknek adjuk át a fókuszt? A fenti script valószínűleg az első megnyitott ablakra fog fókuszálni. Azonban nagyobb rugalmasságot szeretnénk. Jó lenne, ha meg tudnánk jegyezni, hogy pontosan melyik ablakra van szükségünk, és ehhez az ablakhoz tudnánk kapcsolódni.

Az ötlet az volt: Ha egy megadott ablakot szeretnénk megjegyezni a billentyűkombinációhoz, akkor a kombinációt akkor kell megnyomni, amikor a szükséges ablak fókuszban van. Később, amikor megnyomjuk ezt a kombinációt, a fókusz pontosan erre az ablakra fog menni. Amíg az ablak be nem záródik, vagy amíg nem töröljük ezt a kombinációt a scriptben. showwinDetach.

A script algoritmus showwin kb. így néz ki:

  • Ellenőrizzük, hogy nem jegyeztük-e meg korábban az ablak azonosítóját, amelynek a fókuszát át kell adni.
    Ha megjegyeztük, és az ablak továbbra is létezik, akkor átadjuk neki a fókuszt, majd kilépünk.
  • Nézzük meg, hogy melyik ablak van most fókuszban, és ha az megfelel az igényeinknek, akkor megjegyezzük az azonosítóját a későbbi váltás céljából, majd kilépünk.
  • Átmegyünk bármilyen megfelelő ablakhoz, ha az létezik, vagy megnyitjuk a szükséges alkalmazást.

A fókuszban lévő ablakról a xdotool konzol utility segítségével tudunk információt szerezni, a kimenetét hexadecimális formátumra átkonvertálva:

$ printf "0xx" `xdotool getwindowfocus`

Valamit megjegyezni bash-ben a legegyszerűbb, ha fájlokat hozunk létre a memóriában található virtuális fájlrendszerben. Az Ubuntu-ban ez alapértelmezés szerint csatlakoztatva van a /dev/shm/. Más disztribúciókról nem tudok mondani semmit, remélem, hogy hasonló is van. Lehet nézni a következő parancssal:

$ mount -l | grep tmpfs

A szkript üres mappákat fog létrehozni ebben a mappában, így: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Továbbá, minden egyes híváskor létrehoz egy symlinket /dev/shm/$USER/showwin/showwin_last Gyorsan emlékezzünk vissza, hogyan működik a moduláris aritmetika. Az óra már egy ismert koncepció. Az órák használata /dev/shm/$USER/showwin/$SEARCH_REGEX. Erre szükség lesz ahhoz, hogy szükség esetén eltávolíthasd az ablak id-ját egy adott kombinációval a szkript segítségével showwinDetach.

Mit lehet javítani

Először is, a szkripteket kézzel kell beállítani. Bizonyára, az igény miatt, hogy sokat kell tudni és sokat kell kézzel csinálni, sokan még csak meg sem próbálják beállítani a rendszert. Ha lenne lehetőség egyszerűen telepíteni egy csomagot és mindent könnyebben beállítani, akkor talán ez egy kis népszerűséget nyerne. És talán még a standard disztribúciókba is belekerülne az alkalmazás.

És talán még egyszerűbb is lenne. Ha az ablak id-jából meg lehetne tudni a létrehozó folyamat id-ját, és az id-ból meg lehetne tudni, hogy melyik parancs hozta létre, akkor automatizálni lehetne a beállítást. Valójában nem néztem utána, hogy az általam írtak megvalósíthatóak-e. Az a helyzet, hogy számomra a jelenlegi működés elfogadható. De ha valaki másnak a megközelítés tetszik, és valaki javít azon, akkor örömmel használom a jobb megoldást.

Egy másik probléma, ahogy már említettem, az, hogy bizonyos esetekben az ablakokat nem lehet megkülönböztetni egymástól. Eddig ezt csak a Chrome/Chromium incognito módban tapasztaltam, de lehet, hogy máshol is van hasonló. Legrosszabb esetben mindig van lehetőség az univerzális kombinációkra. Alt+1…Alt+0. Ismétlem, Firefoxot használok, és számomra ez a probléma nem jelentős.

De egy számomra jelentős probléma az, hogy a munkám miatt Mac OS-t használok, és ott semmit sem tudtam ilyen módon beállítani. Az alkalmazást wmctrl úgy tűnik, hogy sikerült telepítenem, de Mac OS-en nem igazán működik. Valamit lehet csinálni az Automatorral, de annyira lassú, hogy kényelmetlen használni, még akkor is, amikor működik. A billentyűparancsokat úgy beállítani, hogy minden programban működjenek, szintén nem sikerült. Ha valaki megoldást talál, örömmel használom.

Összegzésként

Meghökkentően sok szó született egy olyan, látszólag egyszerű funkcionalitásról. Szerettem volna átadni az elképzelést, anélkül hogy túlterhelném a szöveget, de még nem találtam ki, hogyan lehetne egyszerűbben elmondani. Talán videó formátumban jobb lenne, de itt ezt nem annyira szeretik.

Egy kicsit meséltem arról, hogy mi van a háttérben a szkript és hogyan lehet beállítani. A szkript részleteibe nem mentem bele, de csak 50 sorból áll, így nem nehéz kitalálni.

Remélem, hogy valaki még kipróbálja ezt az ötletet, és talán értékelni is fogja. Magamról annyit mondhatok, hogy a szkript körülbelül 3 éve készült, és nekem EZ NAGYON kényelmes. Olyannyira kényelmes, hogy komoly diszkomfortot okoz más számítógépekkel való munkavégzéskor. És a munkahelyi MacBookommal is.

Link a szkriptekhez

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster