Alternativno upravljanje oken v Linuxu

Sem eden tistih, ki nastavijo Caps Lock za preklapljanje postavitev, ker sem prelen, da bi pritisnil 2 tipki, ko lahko pritisnem eno. Želel bi celo 2 nepotrebna ključa: enega bi uporabil za vklop angleške postavitve, drugega pa za rusko. Toda druga nepotrebna tipka je priklic kontekstnega menija, ki je tako nepotreben, da ga številni proizvajalci prenosnikov izrezujejo. Zato moraš biti zadovoljen s tem, kar imaš.

Prav tako ne želim iskati njihovih ikon v opravilni vrstici, ko menjam okna, ali loviti imen, ko se pomikam po Alt + Tab, pomikanje po namizjih itd. Želim pritisniti kombinacijo tipk (idealno samo eno, vendar ni več prostih nepotrebnih tipk) in takoj priti do okna, ki ga potrebujem. Na primer takole:

  • Alt+F: Firefox
  • Alt+D: Firefox (zasebno brskanje)
  • Alt+T: Terminal
  • Alt+M: Kalkulator
  • Alt+E: Ideja IntelliJ
  • itd.

Poleg tega s pritiskom na npr Alt+M Želim videti kalkulator, ne glede na to, ali se ta program trenutno izvaja. Če se izvaja, je treba njegovo okno usmeriti v fokus, če ne, zaženite želeni program in prenesite fokus, ko se naloži.

Za primere, ki niso zajeti v prejšnjem skriptu, želim imeti univerzalne kombinacije tipk, ki jih je mogoče enostavno dodeliti kateremu koli od odprtih oken. Na primer, imam dodeljenih 10 kombinacij iz Alt + 1 za Alt + 0, ki niso vezani na noben program. Lahko samo kliknem Alt + 1 in okno, ki je trenutno v fokusu, bo ob kliku dobilo fokus Alt + 1.

Pod rezom je opis še nekaj funkcij in odgovor, kako je to mogoče storiti. Toda takoj vas bom opozoril, da lahko takšno prilagajanje "zase" povzroči hudo zasvojenost in celo odtegnitev, če morate uporabljati Windows, Mac OS ali celo računalnik nekoga drugega z Linuxom.

Pravzaprav, če dobro pomislite, dnevno ne uporabljamo toliko programov. Brskalnik, terminal, IDE, nekakšen messenger, upravitelj datotek, kalkulator in morda je to skoraj vse. Za pokritje 95 % vsakodnevnih opravil ni potrebnih veliko kombinacij tipk.

Pri programih, ki imajo odprtih več oken, je lahko eno od njih označeno kot glavno. Na primer, imate odprtih in dodeljenih več oken IntelliJ Idea Alt + E. V normalnih pogojih, ko pritisnete Alt + E Odprlo se bo neko okno tega programa, najverjetneje tisto, ki je bilo prvo odprto. Če pa kliknete na Alt + E ko je eno od oken tega programa že v fokusu, bo to določeno okno dodeljeno kot glavno in bo tisto, ki bo v fokusu, ko pritisnete naslednje kombinacije.

Glavno okno je mogoče prerazporediti. Če želite to narediti, morate kombinacijo najprej ponastaviti in ji nato dodeliti drugo okno kot glavno okno. Če želite ponastaviti kombinacijo, morate pritisniti samo kombinacijo in nato posebno kombinacijo za ponastavitev, ki jo imam dodeljeno Alt + vračalka. To bo poklicalo skript, ki bo preklical dodelitev glavnega okna za prejšnjo kombinacijo. Nato lahko dodelite novo glavno okno, kot je opisano v prejšnjem odstavku. Ponastavitev povezanega okna na univerzalne kombinacije poteka na enak način.

Uvod se je izkazal za dolgega, vendar sem želel najprej povedati, kaj bomo naredili, nato pa razložiti, kako to narediti.

Za tiste, ki ste utrujeni od branja

Skratka, povezava do skript je na koncu članka.

Vendar ga še vedno ne boste mogli namestiti in uporabljati takoj. Najprej boste morali ugotoviti, kako skript najde želeno okno. Brez tega scenariju ne bo mogoče povedati, kam točno mora biti fokus prenesen. In razumeti morate, kaj storiti, če nenadoma ne najdete ustreznega okna.

In ne bom se osredotočal na to, kako konfigurirati izvajanje skriptov s pritiskom na kombinacije tipk. Na primer, v KDE je v sistemskih nastavitvah → Bližnjice → Bližnjice po meri. Tako bi moralo biti tudi v drugih upravljalnikih oken.

Predstavljamo wmctrl

Wmctrl — konzolni pripomoček za interakcijo z X Window Manager. To je ključni program za scenarij. Oglejmo si na hitro, kako ga lahko uporabite.

Najprej prikažimo seznam odprtih 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 prikaže seznam vseh odprtih oken in -x izhodu doda ime razreda (skype.Skype, Navigator.Firefox itd). Tukaj potrebujemo ID okna (stolpec 1), ime razreda (stolpec 3) in ime okna (zadnji stolpec).

Lahko poskusite aktivirati kakšno okno z možnostjo -a:

$ wmctrl -a skype.Skype -x

Če je šlo vse po načrtu, bi se moralo na zaslonu prikazati okno Skype. Če namesto možnosti -x uporabite možnost -i, potem lahko namesto imena razreda podate ID okna. Težava z id-jem je, da se id okna spremeni ob vsakem zagonu aplikacije in tega ne moremo vedeti vnaprej. Po drugi strani pa ta atribut enolično identificira okno, kar je lahko pomembno, ko aplikacija odpre več kot eno okno. Več o tem malo naprej.

Na tej stopnji se moramo spomniti, da bomo iskali želeno okno z uporabo regularnega izraza z izhodom wmctrl -lx. Vendar to ne pomeni, da moramo uporabiti nekaj zapletenega. Običajno zadošča ime razreda ali ime okna.

V bistvu bi morala biti glavna ideja že jasna. V globalnih nastavitvah hitrih tipk/bližnjic za upravitelja oken konfigurirajte zahtevano kombinacijo za izvedbo skripta.

Kako uporabljati skripte

Najprej morate namestiti pripomočke za konzolo wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Nato morate prenesti skripte in jih dodati v $ PATH. Ponavadi jih dam noter ~/bin:

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

Če imenik ~/bin ni bilo tam, potem ga morate ustvariti in znova zagnati (ali se znova prijaviti), sicer ~/bin ne bo udaril $ PATH. Če je vse opravljeno pravilno, bi morali biti skripti dostopni s konzole in dokončanje zavihkov mora delovati.

Glavni scenarij showwin ima 2 parametra: prvi je regularni izraz, s katerim bomo iskali zahtevano okno, drugi parameter pa je ukaz, ki ga je treba izvesti, če zahtevanega okna ne najdemo.

Lahko poskusite zagnati skript, na primer:

$ showwin "Mozilla Firefox$" firefox

Če je Firefox nameščen, mora biti njegovo okno v fokusu. Tudi če Firefox ne deluje, bi se moral zagnati.

Če deluje, lahko poskusite konfigurirati izvajanje ukazov na kombinacijah. V globalnih nastavitvah hitrih tipk/bližnjic dodajte:

  • Alt+F: showwin “Mozilla Firefox$” firefox
  • Alt+D: showwin "Mozilla Firefox (zasebno brskanje)$" "firefox -private-window"
  • Alt+C: showwin "brskalnik Chromium. Brskalnik Chromium N*" brskalnik Chromium
  • Alt+X: showwin "brskalnik chromium. Brskalnik Chromium I*" "brskalnik chromium -incognito"
  • Alt+S: showwin “skype.Skype” skypeforlinux
  • Alt+E: showwin “jetbrains-idea” idea.sh

Itd. Vsakdo lahko konfigurira kombinacije tipk in programsko opremo, kot se mu zdi primerno.
Če je vse potekalo pravilno, bomo z zgornjimi kombinacijami lahko preklapljali med okni s preprostim pritiskom na tipke.

Razočaral bom ljubitelje kroma: navadno okno lahko brez beleženja zgodovine loči po izpisu wmctrl Ne morete, imajo enaka imena razredov in naslove oken. V predlaganem regularnem izrazu sta znaka N* in I* potrebna samo zato, da se ti regularni izrazi med seboj razlikujejo in jih je mogoče dodeliti kot glavna okna.

Za ponastavitev glavnega okna prejšnje kombinacije (pravzaprav za regularni izraz, ki showwin poklican zadnjič) morate poklicati skript showwinDetach. Ta skript imam dodeljen kombinaciji tipk Alt + vračalka.

Pri scenariju showwin obstaja še ena funkcija. Ko ga pokličemo z enim parametrom (v tem primeru je parameter samo identifikator), sploh ne preveri regularnega izraza, ampak meni, da so vsa okna primerna. Samo po sebi se to zdi neuporabno, a na ta način lahko katero koli okno določimo za glavno in hitro preklopimo na to okno.

Nastavljene imam naslednje kombinacije:

  • Alt+1: showwin "CustomKey1"
  • Alt+2: showwin "CustomKey2"
  • ...
  • Alt+0: showwin "CustomKey0"
  • Alt + vračalka: showwinDetach

Tako lahko poljubna okna povežem s kombinacijami Alt + 1...Alt + 0. Samo s klikom Alt + 1 Trenutno okno vežem na to kombinacijo. Vezavo lahko prekličem s klikom Alt + 1, in potem Alt + vračalka. Ali zaprite okno, tudi to deluje.

Nato vam bom povedal nekaj tehničnih podrobnosti. Ni vam jih treba brati, ampak samo poskusite jih nastaviti in si oglejte. Vendar bi vseeno priporočal, da razumete skripte drugih ljudi, preden jih zaženete na svojem računalniku :).

Kako razlikovati med različnimi okni iste aplikacije

Načeloma je že prvi primer “wmctrl -a skype.Skype -x” deloval in ga je mogoče uporabiti. A poglejmo še enkrat primer s Firefoxom, v katerem sta odprti 2 okni:

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

Prvo okno je običajni način, drugo pa zasebno brskanje. Ta okna bi rad obravnaval kot različne aplikacije in nanje preklopil z različnimi kombinacijami tipk.

Treba je zakomplicirati skripto, ki preklaplja okna. Uporabil sem to rešitev: prikaži seznam vseh oken, naredi grep z regularnim izrazom, vzemite prvo vrstico z Glava, pridobite prvi stolpec (to bo ID okna) z uporabo cut, preklopi na okno po id.

Moral bi se šaliti o regularnih izrazih in dveh težavah, a v resnici ne uporabljam nič zapletenega. Potrebujem regularne izraze, da lahko označim konec vrstice (simbol »$«) in ločim »Mozilla Firefox$« od »Mozilla Firefox (zasebno brskanje)$«.

Ukaz izgleda nekako takole:

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

Tukaj lahko že ugibate o drugi funkciji skripta: če grep ne vrne ničesar, potem želena aplikacija ni odprta in jo morate zagnati z izvedbo ukaza iz drugega parametra. Nato občasno preverite, ali se je želeno okno odprlo, da se fokus prenese nanj. Ne bom se osredotočal na to; kdor to potrebuje, bo pogledal vire.

Ko okna aplikacij niso razločljiva

Tako smo se naučili, kako prenesti fokus na okno želene aplikacije. Kaj pa, če ima aplikacija odprtih več kot eno okno? Na katerega naj se osredotočim? Zgornji skript se bo najverjetneje prenesel v prvo odprto okno. Vendar bi si želeli več prožnosti. Rad bi si lahko zapomnil, katero okno potrebujemo, in preklopil na to določeno okno.

Ideja je bila naslednja: če si želimo zapomniti določeno okno za kombinacijo tipk, moramo to kombinacijo pritisniti, ko je želeno okno v fokusu. V prihodnje, ko pritisnete to kombinacijo, bo fokus postavljen na to okno. Dokler se okno ne zapre ali dokler ne izvedemo ponastavitve za to kombinacijo skriptov showwinDetach.

Algoritem skripte showwin nekaj podobnega:

  • Preverite, ali smo si predhodno zapomnili ID okna, na katerega naj se fokus prenese.
    Če se spomnite in takšno okno še vedno obstaja, potem fokus prenesemo nanj in zapustimo.
  • Pogledamo, katero okno je trenutno v fokusu, in če se ujema z našo zahtevo, si zapomnimo njegov ID, da ga v prihodnosti obiščemo in zapustimo.
  • Gremo na vsaj kakšno primerno okno, če obstaja ali odpremo želeno aplikacijo.

S pomočjo konzolnega pripomočka xdotool lahko ugotovite, katero okno je trenutno v fokusu, tako da pretvorite njegov izhod v šestnajstiško obliko:

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

Najlažji način, da si nekaj zapomnite v bashu, je ustvariti datoteke v navideznem datotečnem sistemu, ki se nahaja v pomnilniku. V Ubuntuju je to privzeto omogočeno v /dev/shm/. O drugih distribucijah ne morem reči nič, upam, da je tudi kaj podobnega. Pogledate lahko z ukazom:

$ mount -l | grep tmpfs

Skript bo v tej mapi ustvaril prazne imenike, kot je ta: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Poleg tega bo ob vsakem klicu ustvaril simbolno povezavo /dev/shm/$USER/showwin/showwin_last o /dev/shm/$USER/showwin/$SEARCH_REGEX. To bo potrebno, da po potrebi odstranimo ID okna za določeno kombinacijo s pomočjo skripta showwinDetach.

Kaj je mogoče izboljšati

Najprej je treba skripte konfigurirati ročno. Zagotovo mnogi od vas zaradi potrebe po poglobitvi in ​​​​velikem delu z rokami ne bodo niti poskušali konfigurirati sistema. Če bi bilo možno preprosto namestiti paket in vse lažje konfigurirati, bi morda pridobil nekaj popularnosti. In potem poglej, aplikacija bi bila izdana v standardne distribucije.

In morda je to mogoče narediti lažje. Če lahko po ID-ju okna ugotovite ID procesa, ki ga je ustvaril, in po ID-ju procesa ugotovite, kateri ukaz ga je ustvaril, potem bi bilo možno avtomatizirati nastavitev. Pravzaprav nisem razumel, ali je to, kar sem napisal v tem odstavku, mogoče. Dejstvo je, da sem osebno zadovoljen s tem, kako zdaj deluje. Če pa se komu drugemu zdi celoten pristop primeren in ga kdo izboljša, potem bom z veseljem uporabil boljšo rešitev.

Druga težava je, kot sem že napisal, da v nekaterih primerih oken ni mogoče ločiti med seboj. To sem do zdaj opazil le pri inkognitu v krom/krom, morda pa je še kje kaj podobnega. V skrajnem primeru vedno obstaja možnost univerzalnih kombinacij Alt + 1...Alt + 0. Spet uporabljam Firefox in zame osebno ta težava ni pomembna.

Toda zame je pomembna težava, da uporabljam Mac OS za delo in tam nisem mogel konfigurirati ničesar takega. uporabnost wmctrl Mislim, da mi ga je uspelo namestiti, vendar v sistemu Mac OS v resnici ne deluje. Z aplikacijo se da nekaj narediti Automator, vendar je tako počasen, da ga ni priročno uporabljati, tudi ko deluje. Prav tako nisem mogel nastaviti kombinacij tipk, da bi delovale v vseh programih. Če bo kdo nenadoma našel rešitev, jo bom z veseljem uporabil.

Namesto zaključka

Izkazalo se je nepričakovano veliko besed za tako na videz preprosto funkcionalnost. Želel sem posredovati idejo in ne preobremeniti besedila, vendar še nisem ugotovil, kako bi to bolj preprosto povedal. Morda bi bilo bolje v video formatu, a ljudje pri nas tako ne marajo.

Malo sem govoril o tem, kaj je pod pokrovom skripta in kako ga konfigurirati. Nisem se spuščal v podrobnosti samega scenarija, vendar je le 50 vrstic, tako da ni težko razumeti.

Upam, da bo še kdo poskusil to idejo in jo morda celo cenil. O sebi lahko rečem, da je bil scenarij napisan pred približno 3 leti in je zame ZELO primeren. Tako priročno, da povzroča resno nelagodje pri delu z računalniki drugih ljudi. In z delujočim MacBookom.

Povezava do skript

Vir: www.habr.com

Dodaj komentar