Alternatív ablakkezelés Linuxban

Azok közé tartozom, akik beállítják a Caps Lock funkciót az elrendezés váltására, mert lusta vagyok megnyomni 2 billentyűt, amikor meg tudom nyomni az egyiket. Még 2 felesleges billentyűt is szeretnék: az egyikkel az angol kiosztást kapcsolnám be, a másikkal az oroszhoz. De a második felesleges kulcs a helyi menü előhívása, ami annyira felesleges, hogy sok laptopgyártó kivágja. Tehát meg kell elégedni azzal, ami van.

És nem szeretném az ikonjaikat keresni a tálcán, amikor ablakokat váltok, és nem akarom elkapni a neveket görgetéskor Alt + Tab, görgesse át az asztalokat, stb. Szeretnék lenyomni egy billentyűkombinációt (ideális esetben csak egyet, de már nincsenek szabad, szükségtelen billentyűk), és azonnal a kívánt ablakhoz jutok. 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 ötlet
  • stb.

Sőt, ha megnyomja például a on 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 az ablakát fókuszba kell helyezni, ha nem, akkor futtassuk le a kívánt programot, és betöltéskor vigyük át a fókuszt.

Azokra az esetekre, amelyekre az előző szkript nem vonatkozik, univerzális billentyűkombinációkat szeretnék, amelyek könnyen hozzárendelhetők bármelyik nyitott ablakhoz. Például 10 kombinációt rendeltem hozzá Alt + 1 a Alt + 0, amelyek nincsenek semmilyen programhoz kötve. Csak kattinthatok Alt + 1 és az éppen fókuszban lévő ablak fókuszba kerül, ha rákattint Alt + 1.

A vágás alatt van még néhány funkció leírása és válasz arra, hogyan lehet ezt megtenni. De azonnal figyelmeztetem, hogy az ilyen testreszabás „maga számára” súlyos függőséget és akár elvonást is okozhat, ha Windows, Mac OS vagy akár valaki más számítógépét Linux alatt kell használnia.

Valójában, ha jobban belegondolunk, nem használunk olyan sok programot napi szinten. Böngésző, terminál, IDE, valamilyen messenger, fájlkezelő, számológép és talán ez szinte minden. Nem sok billentyűkombinációra van szükség a mindennapi feladatok 95%-ának elvégzéséhez.

Azoknál a programoknál, amelyeknél több ablak van nyitva, az egyik kijelölhető a fő ablaknak. Például több IntelliJ Idea ablak van nyitva és hozzá van rendelve Alt + E. Normál körülmények között, amikor megnyomja Alt + E ennek a programnak néhány ablaka megnyílik, valószínűleg az, amelyik először nyílt meg. Ha azonban rákattint Alt + E amikor ennek a programnak az egyik ablaka már fókuszban van, akkor ez az ablak lesz a fő ablak, és ez lesz az, amelyik a következő kombinációk lenyomásakor lesz fókuszban.

A főablak átrendelhető. Ehhez először vissza kell állítani a kombinációt, majd hozzá kell rendelni egy másik ablakot főablakként. Egy kombináció visszaállításához meg kell nyomnia magát a kombinációt, majd egy speciális visszaállítási kombinációt, amelyhez hozzárendeltem Alt+Backspace. Ez meghív egy szkriptet, amely megszünteti a főablak hozzárendelését az előző kombinációhoz. Ezután az előző bekezdésben leírtak szerint hozzárendelhet egy új főablakot. A hivatkozott ablak univerzális kombinációkra való visszaállítása ugyanígy történik.

A bevezető hosszúra sikeredett, de először el akartam mondani, mit fogunk csinálni, majd elmagyarázni, hogyan kell csinálni.

Azoknak, akik belefáradtak az olvasásba

Röviden, a forgatókönyvekre mutató hivatkozás a cikk végén található.

De továbbra sem tudja azonnal telepíteni és használni. Először ki kell találnia, hogyan találja meg a szkript a kívánt ablakot. E nélkül nem lehet megmondani a szkriptnek, hogy pontosan hova kell a fókuszt áthelyezni. És meg kell értenie, mit kell tennie, ha hirtelen nem található megfelelő ablak.

És nem fogok arra összpontosítani, hogyan kell beállítani a szkriptek végrehajtását a billentyűkombinációk megnyomásával. Például a KDE-ben ez a Rendszerbeállítások → Parancsikonok → Egyéni gyorsbillentyűk menüpontban található. Ennek más ablakkezelőkben is így kell lennie.

Bemutatkozik a wmctrl

Wmctrl — konzol segédprogram az X Window Managerrel való interakcióhoz. Ez a script kulcsprogramja. Nézzük meg gyorsan, hogyan használhatod.

Először is jelenítsük meg a megnyitott 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 Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)
...

választási lehetőség -l megjeleníti az összes megnyitott ablak listáját, és -NS hozzáfűzi az osztály nevét a kimenethez (skype.Skype, Navigátor.Firefox stb). Itt kell az ablakazonosító (1. oszlop), az osztálynév (3. oszlop) és az ablaknév (utolsó oszlop).

Megpróbálhat aktiválni néhány ablakot az opció segítségével -a:

$ wmctrl -a skype.Skype -x

Ha minden a terv szerint ment, a Skype ablaknak meg kell jelennie a képernyőn. Ha az opció helyett -x opció használata -i, akkor az osztálynév helyett megadhatjuk az ablakazonosítót. Az id-vel az a probléma, hogy az ablak azonosítója az alkalmazás minden indításakor változik, és ezt nem tudjuk előre. Másrészt ez az attribútum egyedileg azonosít egy ablakot, ami fontos lehet, ha egy alkalmazás egynél több ablakot nyit meg. Erről kicsit tovább.

Ebben a szakaszban emlékeznünk kell arra, hogy a kívánt ablakot a regex használatával fogjuk megkeresni kimenet alapján wmctrl -lx. De ez nem jelenti azt, hogy valami bonyolultat kell használnunk. Általában az osztálynév vagy az ablaknév elegendő.

Alapvetően a fő gondolatnak már világosnak kell lennie. Az ablakkezelő globális gyorsbillentyűi/parancsikon-beállításaiban konfigurálja a parancsfájl végrehajtásához szükséges kombinációt.

A szkriptek használata

Először telepítenie kell a konzol segédprogramjait wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Ezután le kell töltenie a szkripteket, és hozzá kell adnia őket $ PATH. Általában beteszem ő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 volt ott, akkor létre kell hozni és újra kell indítani (vagy újra bejelentkezni), ellenkező esetben ~/bin nem fog ütni $ PATH. Ha mindent helyesen csinált, akkor a szkripteknek elérhetőnek kell lenniük a konzolról, és működnie kell a Tab-befejezésnek.

Fő szkript showwin 2 paramétert vesz fel: az első egy regex, amivel megkeressük a kívánt ablakot, a második paraméter pedig egy parancs, amelyet akkor kell végrehajtani, ha a kívánt ablak nem található.

Megpróbálhat futtatni egy szkriptet, például:

$ showwin "Mozilla Firefox$" firefox

Ha a Firefox telepítve van, akkor annak ablakát kell fókuszálni. Még ha a Firefox nem is futott, el kellett volna indulnia.

Ha működik, akkor megpróbálhatja beállítani a parancsok végrehajtását a kombinációkon. A globális gyorsbillentyűk/parancsikonok beállításainál adja hozzá:

  • 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

Stb. Mindenki tetszés szerint konfigurálhatja a billentyűkombinációkat és a szoftvereket.
Ha minden jól sikerült, akkor a fenti kombinációk használatával egyszerűen gombnyomással válthatunk az ablakok között.

A króm szerelmeseinek csalódást okozok: inkognitóban képes megkülönböztetni a normál ablakot a kimenete alapján wmctrl Nem teheted, ugyanazok az osztálynevek és az ablakcímek. A javasolt regexben az N* és I* karakterekre csak azért van szükség, hogy ezek a reguláris kifejezések eltérjenek egymástól, és főablakként lehessen őket rendelni.

Az előző kombináció főablakának visszaállításához (valójában a regexhez, amely showwin legutóbb hívott) meg kell hívnia a scriptet showwinDetach. Ezt a szkriptet egy billentyűkombinációhoz rendeltem Alt+Backspace.

A forgatókönyvnél showwin van még egy funkció. Ha egy paraméterrel hívják (ebben az esetben a paraméter csak egy azonosító), akkor egyáltalán nem ellenőrzi a regex-et, hanem minden ablakot megfelelőnek tekint. Ez önmagában haszontalannak tűnik, de így bármelyik ablakot kijelölhetjük főnek, és gyorsan átválthatunk az adott ablakra.

A következő kombinációkat konfiguráltam:

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

Így bármilyen ablakot kombinációkhoz köthetek Alt + 1...Alt + 0. Csak kattintással Alt + 1 Az aktuális ablakot ehhez a kombinációhoz kötöm. Kattintással törölhetem a kötést Alt + 1, és akkor Alt+Backspace. Vagy csukja be az ablakot, az is működik.

A következőkben néhány technikai részletet mondok el. Nem kell elolvasnia őket, csak próbálja meg beállítani őket, és meglátja. De továbbra is azt javaslom, hogy megértsd mások szkriptjeit, mielőtt futtatnád őket a számítógépeden :).

Hogyan lehet megkülönböztetni ugyanazon alkalmazás különböző ablakait

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

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

Az első ablak normál módú, a második pedig a Privát böngészés. Szeretném ezeket az ablakokat különböző alkalmazásoknak tekinteni, és különböző billentyűkombinációkkal váltani rájuk.

Bonyolítani kell az ablakot váltó szkriptet. Ezt a megoldást használtam: jelenítse meg az összes ablak listáját, tegye grep reguláris kifejezéssel vegye az első sort a következővel: fej, kapja meg az első oszlopot (ez lesz az ablakazonosító) segítségével vágott, váltson ablakra azonosítóval.

Kellene egy vicc a reguláris kifejezésekkel és két problémával, de valójában nem használok semmi bonyolultat. Szükségem van reguláris kifejezésekre, hogy jelezhessem a sor végét (a „$” szimbólumot), és meg tudjam különböztetni a „Mozilla Firefox$” és a „Mozilla Firefox (Private Browsing)$” kifejezéseket.

A parancs valahogy így néz ki:

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

Itt már sejthető a szkript második tulajdonsága: ha a grep nem ad vissza semmit, akkor a kívánt alkalmazás nincs megnyitva, és a második paraméter parancsának végrehajtásával kell elindítani. Ezután rendszeresen ellenőrizze, hogy a kívánt ablak megnyílt-e, hogy áthelyezze a fókuszt rá. Nem koncentrálok erre; akinek szüksége van rá, az megnézi a forrásokat.

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

Tehát megtanultuk, hogyan vihetjük át a fókuszt a kívánt alkalmazás ablakára. De mi van akkor, ha egy alkalmazásban egynél több ablak van nyitva? Melyikre helyezzem a hangsúlyt? A fenti szkript valószínűleg átkerül az első megnyitott ablakba. Mi azonban nagyobb rugalmasságot szeretnénk. Szeretnék emlékezni arra, hogy melyik ablakra van szükségünk, és átváltani az adott ablakra.

Az ötlet a következő volt: Ha meg akarunk emlékezni egy adott ablakra egy billentyűkombinációhoz, akkor ezt a kombinációt kell megnyomnunk, amikor a kívánt ablak a fókuszban van. A jövőben, ha megnyomja ezt a kombinációt, a fókusz erre az ablakra kerül. Amíg az ablak be nem záródik, vagy visszaállítjuk ezt a szkriptkombinációt showwinDetach.

Script algoritmus showwin valami ilyesmi:

  • Ellenőrizze, hogy korábban emlékeztünk-e annak az ablaknak az azonosítójára, amelyre a fókuszt át kell helyezni.
    Ha emlékszel, és egy ilyen ablak még mindig létezik, akkor áthelyezzük rá a fókuszt, és kilépünk.
  • Megnézzük, hogy melyik ablak van jelenleg fókuszban, és ha megfelel a kérésünknek, akkor jegyezzük meg az azonosítóját, hogy a jövőben odalépjünk és kilépjünk.
  • Legalább egy megfelelő ablakot keresünk, ha létezik, vagy megnyitjuk a kívánt alkalmazást.

Az xdotool konzol segédprogrammal megtudhatja, hogy melyik ablak van jelenleg fókuszban, ha a kimenetét hexadecimális formátumra konvertálja:

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

A legegyszerűbb módja annak, hogy megjegyezzen valamit a bashban, ha fájlokat hoz létre a memóriában található virtuális fájlrendszerben. Ubuntuban ez alapértelmezés szerint engedélyezve van /dev/shm/. A többi disztribúcióról nem tudok mit mondani, remélem van valami hasonló. Megnézheti a következő paranccsal:

$ mount -l | grep tmpfs

A szkript üres könyvtárakat hoz létre ebben a mappában, például: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Ezenkívül minden alkalommal, amikor elhívják, szimbolikus hivatkozást hoz létre /dev/shm/$USER/showwin/showwin_last on /dev/shm/$USER/showwin/$SEARCH_REGEX. Erre azért lesz szükség, hogy szükség esetén szkript segítségével eltávolítsuk egy bizonyos kombináció ablakazonosítóját showwinDetach.

Mit lehet javítani

Először is, a szkripteket manuálisan kell konfigurálni. Bizonyára sokan meg sem próbálják konfigurálni a rendszert, mivel sok mindent bele kell ásni és kézzel kell végezni. Ha lehetséges lenne egyszerűen telepíteni a csomagot, és mindent könnyebben konfigurálni, akkor talán szerezne némi népszerűséget. És akkor nézze meg, az alkalmazást szabványos disztribúciókban adják ki.

És talán könnyebben is meg lehet csinálni. Ha egy ablak azonosítójával megtudhatja az azt létrehozó folyamat azonosítóját, és a folyamat azonosítójával megtudhatja, hogy melyik parancs hozta létre, akkor lehetséges lenne a beállítás automatizálása. Valójában nem értettem, hogy lehetséges-e, amit ebben a bekezdésben írtam. Az a helyzet, hogy én személy szerint elégedett vagyok azzal, ahogy most működik. De ha valaki másnak kényelmesnek találja az egész megközelítést, és valaki javít rajta, akkor szívesen használok jobb megoldást.

További probléma, ahogy már írtam, hogy bizonyos esetekben az ablakokat nem lehet megkülönböztetni egymástól. Ezt eddig csak inkognitóban figyeltem meg chrome/chromiumban, de talán máshol is van hasonló. Végső megoldásként mindig van lehetőség univerzális kombinációkra Alt + 1...Alt + 0. Ismét Firefoxot használok, és személy szerint számomra ez a probléma nem jelentős.

De számomra az a jelentős probléma, hogy Mac OS-t használok munkához, és ott nem tudtam ilyesmit konfigurálni. hasznosság wmctrl Azt hiszem, sikerült telepítenem, de nem igazán működik Mac OS-en. Valamit lehet tenni az alkalmazással Automator, de olyan lassú, hogy még akkor sem kényelmes használni, ha működik. A billentyűkombinációkat sem tudtam úgy beállítani, hogy minden programban működjenek. Ha valaki hirtelen előáll valami megoldással, szívesen használom.

Ahelyett, hogy egy következtetés

Kiderült, hogy váratlanul sok szó van egy ilyen egyszerűnek tűnő funkcióhoz. Át akartam adni az ötletet, és nem túlterhelni a szöveget, de még nem jöttem rá, hogyan mondjam el egyszerűbben. Talán jobb lenne videó formátumban, de az emberek nem szeretik ezt itt.

Beszéltem egy kicsit arról, hogy mi van a szkript alatt, és hogyan kell beállítani. Magát a forgatókönyvet nem részleteztem, de csak 50 soros, szóval nem nehéz megérteni.

Remélem, hogy valaki más is kipróbálja ezt az ötletet, és talán még értékelni is fogja. Magamról elmondhatom, hogy a forgatókönyv körülbelül 3 éve készült, és NAGYON kényelmes számomra. Annyira kényelmes, hogy komoly kényelmetlenséget okoz, amikor mások számítógépeivel dolgozik. És működő MacBook-kal.

Link a szkriptekhez

Forrás: will.com

Hozzászólás