Alternativno upravljanje oken v Linuxu

Sem jaz tisti, ki na Caps Lock nastavi preklapljanje postavitve, saj mi je leno pritisniti 2 tipki, ko lahko pritisnem le eno. Rad bi imel celo 2 nepotrebni tipki: eno bi uporabljal za vklop angleške postavitve, drugo pa za rusko. Toda druga nepotrebna tipka - to je klic kontekstnega menija, ki je tako nepotrebna, da jo mnogi proizvajalci prenosnikov odstranijo. Tako da me zanima, kaj imam na voljo.

Poleg tega nočem ob preklapljanju med okni iskati njihovih ikon na opravilni vrstici, loviti pogledom imen pri pomikanju skozi Alt+Tab, pomikanju med delovnimi namizji itd. Rad bi pritisnil kombinacijo tipk (v idealnem primeru le eno, a prostih nepotrebnih tipk ni več) in takoj prišel do okna, ki ga potrebujem. Na primer tako:

  • Alt+F: Firefox
  • Alt+D: Firefox (Bralnik v zasebnem načinu)
  • Alt+T: Terminal
  • Alt+M: Kalkulator
  • Alt+E: IntelliJ Idea
  • itd.

Pri čemer, ob pritisku na Alt+M želim videti kalkulator neodvisno od tega, ali je ta program trenutno zagnan. Če je zagnan, potem je treba prenesti fokus na njegovo okno, če pa ne - zagnati ustrezen program in prenesti fokus, ko se naloži.

Za primere, ki niso pokriti s prejšnjim scenarijem, želim imeti univerzalne kombinacije tipk, na katere lahko enostavno dodelim katerokoli odprto okno. Na primer, imam dodeljenih 10 kombinacij od Alt+1 do Alt+0, ki niso vezane na noben program. Preprosto lahko pritisnem Alt+1 in okno, ki je trenutno v fokusu, bo ponovno dobilo fokus ob pritisku na Alt+1.

Nadaljevanje vsebuje opis še dveh funkcij in odgovor na to, kako to storiti. A takoj bom opozoril, da lahko takšna prilagoditev 'po sebi' povzroči močno odvisnost in celo abstinenčne simptome, ko je treba uporabljati Windows, Mac OS ali celo tuji računalnik z Linuxom.

Če pomislimo, pa v bistvu ne uporabljamo veliko programov v vsakdanjem življenju. Brskalnik, terminal, IDE, nek messanger, upravljalnik datotek, kalkulator in morda še to. Potrebujemo le malo kombinacij tipk za pokritje 95 % vsakodnevnih nalog.

Za programe, ki imajo odprtih več oken, lahko eno od teh nastavimo za glavno. Na primer, več oken IntelliJ Idea, dodeljenih na Alt+E.V običajnih razmerah bo ob pritisku na Alt+E. odprto okno tega programa, verjetno tisto, ki je bilo odprto prvo. Vendar, če pritisnete na Alt+E. Ko je eno izmed oken te programske opreme v fokusu, bo to okno postavljeno kot glavno in prav temu bo prenesen fokus pri naslednjih pritiskih kombinacije.

Glavno okno je možno ponovno dodeliti. Za to je treba najprej ponastaviti kombinacijo, nato pa dodeliti drugo okno kot glavno. Za ponastavitev kombinacije je treba pritisniti samo kombinacijo, nato pa posebno ponastavitveno kombinacijo, ki jo imam dodeljeno na Alt+Backspace. To bo aktiviralo skript, ki bo preklical nastavitev glavnega okna za prejšnjo kombinacijo. Nato lahko dodelite novo glavno okno, kot je bilo opisano v prejšnjem odstavku. Ponastavitev povezanega okna na univerzalne kombinacije poteka na podoben način.

Uvod je bil dolg, a hotel sem najprej opisati, kaj bomo naredili, nato pa razložiti, kako to storiti.

Za tiste, ki so se naveličali branja

Na kratko, povezava do skriptov je na koncu članka.

A vseeno takoj namestiti in uporabljati ne bo mogoče. Najprej se bo treba poglobiti, kako skript najde pravo okno. Brez tega ne bo mogoče skriptu določiti, kam natančno naj prenese fokus. In treba bo razumeti, kaj storiti, če pravo okno ne bo našlo.

Prav tako ne bom pozornost usmerjal na to, kako nastaviti izvajanje skriptov ob pritisku na kombinacije tipk. Na primer, v KDE je to v Nastavitvah sistema → Bližnjice → Lastne bližnjice. V drugih upravljalnikih oken bi moralo biti podobno.

Seznam wmctrl

Wmctrl je konzolno orodje za interakcijo z X Window Managerjem. To je ključni program za skript. Oglejmo si na hitro, kako ga lahko uporabljamo.

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 Prevajalnik - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Najboljši objavi v 24 urah / Habr - Mozilla Firefox (Zasebno brskanje)
...

Možnost -l izpiše seznam vseh odprtih oken, medtem ko -h doda izhodu ime razreda (skype.Skype, Navigator.Firefox itd.). Tu bomo potrebovali id oken (1. stolpec), ime razreda (3. stolpec) in ime okna (zadnji stolpec).

Lahko poskusite aktivirati neko okno z uporabo možnosti -a:

$ wmctrl -a skype.Skype -x

Če vse teče po načrtu, bi se moralo na zaslonu prikazati okno Skype. Če namesto možnosti -x uporabite možnost -i, namesto imena razreda pa lahko navedemo id okna. Problem z id je, da se id okna spremeni ob vsakem zagonu aplikacije in ga ne moremo poznati vnaprej. Po drugi strani pa ta atribut nedvoumno kaže na okno, kar je lahko pomembno, ko aplikacija odpre več kot eno okno. O tem več kasneje.

Na tej točki se moramo spomniti, da bomo iskali pravo okno s pomočjo regexa po izhodu wmctrl -lx. Toda to ne pomeni, da moramo nujno uporabljati kaj zapletenega. Običajno je dovolj ime razreda ali naziv okna.

Načeloma bi morala biti osnovna ideja že jasna. V nastavitvah globalnih bližnjic za vaš upravljalnik oken nastavimo potrebno kombinacijo za izvajanje skripte.

Kako uporabljati skripte

Na začetku je treba namestiti konzolne ukaze wmctrl in xdotool:

$ sudo apt-get install wmctrl xdotool

Nato moramo prenesti skripte in jih dodati v $PATH. Običajno jih dam v ~/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 imenika ~/bin ni bilo, ga je treba ustvariti in se ponovno prijaviti (ali se znova prijaviti), sicer ~/bin ne bo dostopno v $PATH. Če je vse narejeno pravilno, bi morali biti skripti dostopni iz konzole in samodejno dopolnjevanje bi moralo delovati s tipko Tab.

Glavna skripta showwin sprejema 2 parametra: prvi je regex, po katerem bomo iskali pravo okno, drugi parameter pa je ukaz, ki ga je treba izvesti, če pravo okno ni najdeno.

Lahko poskusite izvesti skripto, na primer:

$ showwin "Mozilla Firefox$" firefox

Če je Firefox nameščen, bi mu morala biti dodeljena pozornost. Tudi če Firefox ni bil zagnan, bi se moral zagnati.

Če je vse uspelo, lahko poskusimo nastaviti izvajanje ukazov na kombinacije. V nastavitvah globalnih bližnjic dodamo:

  • 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

itd. Kombinacije tipk in programske opreme lahko vsak nastavi po svoje.
Če je vse pravilno, lahko s prej omenjenimi kombinacijami preklapljamo med okni z enostavnim pritiskom na tipke.

Razočaral bom ljubitelje Chromea: navadno okno incognito ga ne more razlikovati po izhodu wmctrl Nekatere je treba razlikovati, ker imajo enake imenske razrede in naslove oken. V predlaganih regex znakih N* in I* so potrebni samo zato, da se te regularke razlikujejo med seboj, kar omogoča dodelitev različnih glavnih oken.

Za ponastavitev glavnega okna prejšnje kombinacije (dejansko za regex, ki showwin je bil zadnjič poklican) je treba poklicati skript showwinDetach. Ta skript imam dodeljen na kombinacijo tipk Alt+Backspace.

Skript showwin ima še eno funkcijo. Ko se pokliče z enim parametrom (v tem primeru je parameter preprosto identifikator), ne preverja regexa, ampak vse okna smatra za ustrezna. To se zdi samo po sebi brezsmiselno, vendar lahko na ta način dodelimo katero koli okno kot glavno in hitro preklapljamo prav na to okno.

Imam nastavljene naslednje kombinacije:

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

Tako lahko povežem katera koli okna s kombinacijami Alt+1…Alt+0. Preprosto z Alt+1 povežem trenutno okno s to kombinacijo. Odvezati povezavo lahko s pritiskom na Alt+1, nato pa Alt+Backspace. Ali pa zaprem okno, kar prav tako deluje.

Nato bom povedal malo tehničnih podrobnosti. Te lahko ignorirate in preprosto poskusite nastaviti in pogledati. Ampak vseeno bi priporočal, da se pred izvajanjem tujih skriptov malo spoznate z njimi :).

Kako razlikovati različna okna ene aplikacije

Načeloma je bil prvi primer «wmctrl -a skype.Skype -x» delujoč in ga lahko uporabimo. A poglejmo še enkrat primer z Firefoxom, v katerem je odprtih 2 oken:

0x04400003  0 Navigator.Firefox                   N/A Google Prevodnik - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Najboljši prispevki za dan / Habr - Mozilla Firefox (Zasebno brskanje)

Prvo okno je v običajnem načinu, drugo pa v Zasebnem brskanju. Ta okna bi želeli obravnavati kot različne aplikacije in preklapljati med njimi s pomočjo različnih kombinacij tipk.

Treba je zakomplicirati skript, ki preklaplja okna. Uporabil sem takšno rešitev: prikazati seznam vseh oken, narediti grep po regex, vzeti prvo vrstico s pomočjo head, pridobiti prvo kolono (to bo id okna) s pomočjo cut, preklopiti na okno po id.

Tuk mora biti šala o regularnih izrazih in dveh težavah, vendar v resnici ne uporabljam nič zapletenega. Regularni izrazi so mi potrebni, da lahko označim konec vrstice (znak "$") in razlikujem "Mozilla Firefox$" od "Mozilla Firefox (Private Browsing)$".

Ekipa izgleda približno tako:

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

Tukaj si že lahko domislite drugo značilnost skripta: če grep ne vrne ničesar, potem želena aplikacija ni odprta in jo je treba zagnati z ukazom iz drugega parametra. Potem pa občasno preverjati, ali se je odprlo točno to okno, da mu prenesemo fokus. Ne bom se osredotočil na to, kdo želi, naj si ogleda izvorno kodo.

Ko okna aplikacij niso razlikovalna

Torej, naučili smo se prenašati fokus na okno želene aplikacije. Ampak, kaj pa, če je odprtih več kot eno okno aplikacije? Na katero od njih prenesti fokus? Skript zgoraj bo najverjetneje prenesel fokus na prvo odprto okno. Vendar bi želeli večjo fleksibilnost. Radi bi lahko zapomnili, katero okno potrebujemo in preklapljali točno na to okno.

Ideja je bila taka: Če želimo zapomniti določeno okno za kombinacijo tipk, potem moramo pritisniti to kombinacijo, ko je željeno okno v fokusu. Nato bo ob pritisku te kombinacije fokus podeljen točno temu oknu. Dokler okno ne zapremo ali ne resetiramo te kombinacije skripta. showwinDetach.

Algoritm skripta showwin je približno takšen:

  • Preveri, ali smo prej zapomnili id okna, ki mu moramo prenesti fokus.
    Če smo zapomnili in to okno še vedno obstaja, potem mu prenesemo fokus in končamo.
  • Poglejmo, katero okno je trenutno v fokusu, in če ustreza našemu iskanju, bomo zapomnili njegov id za nadaljnje preklapljanje na to in končali.
  • Preidemo na katero koli ustrezno okno, če to obstaja, ali odpremo potrebno aplikacijo.

Kako ugotoviti, katero okno je trenutno v fokusu, lahko izvedemo s konzolno utiliteto xdotool, tako da njen izhod pretvorimo v šestnajstiški format:

$ printf "0xx" `xdotool getwindowfocus`

Nekaj zapomniti v bashu je najlažje z ustvarjanjem datotek v virtualnem datotečnem sistemu, ki se nahaja v pomnilniku. V Ubuntu je to privzeto povezano v /dev/shm/. O drugih distribucijah ne morem reči nič, upam, da je to tudi tam. Lahko preverite z ukazom:

$ mount -l | grep tmpfs

Skripta bo ustvarila prazne mape v tej mapi, takšne kot so te: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Dodatno bo pri vsakem klicu ustvaril symlink /dev/shm/$USER/showwin/showwin_last na /dev/shm/$USER/showwin/$SEARCH_REGEX. To bo potrebno, da bo mogoče po potrebi odstraniti ID okna za določeno kombinacijo s pomočjo skripte showwinDetach.

Kaj bi se dalo izboljšati

Prvič, skripte je treba nastaviti ročno. Verjetno se zaradi potrebe po razumevanju in številnih ročnih nastavitvah mnogi med vami sploh ne odločijo za nastavitev sistema. Če bi bila možnost preprosto namestiti paket in vse nastaviti enostavneje, bi to morda pridobilo nekaj priljubljenosti. Morda bi se celo znašlo v standardnih distribucijah.

In, morda, bi se lahko naredilo še enostavneje. Če lahko po ID-ju okna ugotovimo ID procesa, ki ga je ustvaril, in po ID-ju procesa ugotovimo, katera ukaz ga je ustvarila, bi lahko avtomatizirali nastavitev. V resnici se nisem spuščal v to, ali je to, kar sem napisal v tem odstavku, mogoče. Zame osebno je trenutna metoda sprejemljiva. Toda če se bo komu drugemu zdel pristop smiseln in ga bo kdo izboljšal, bom z veseljem koristil najboljše rešitev.

Druga težava, kot sem že omenil, je, da v nekaterih primerih okna ni mogoče ločiti po videzu. Zdaj sem to opazil le pri incognito načinu v chrome/chromium, vendar je mogoče, da je takšno stanje tudi drugje. V skrajni nuji je vedno na voljo možnost univerzalnih kombinacij Alt+1…Alt+0. Spet, jaz uporabljam Firefox in ta težava zame ni velika.

Bolj pomembna težava zame pa je, da na delu uporabljam Mac OS in tam takega nisem mogel nastaviti. Orodje wmctrl sem ga očitno lahko namestil, a na Mac OS res ne deluje prav. Nekaj se lahko stori z aplikacijo Automator, vendar tako zastaja, da je njena uporaba neprijetna, tudi ko deluje. Nastaviti kombinacije tipk, da delujejo v vseh programih, tudi nisem mogel. Če kdo pride do rešitve — zelo bom vesel, da jo uporabim.

Namesto zaključka

Izkazalo se je, da je veliko besed za tako, na prvi pogled, preprosto funkcionalnost. Rad bi predstavil idejo brez preobremenitve besedila, vendar trenutno ne vem, kako to povedati preprosteje. Morda bi bilo bolje v video formatu, a tukaj to ni ravno priljubljeno.

Malce sem govoril o tem, kar se skriva za skriptom in kako ga nastaviti. V podrobnosti samega skripta se nisem spuščal, vendar je dolg le 50 vrstic, zato ni težko razumeti.

Upam, da bo kdo še preizkusil to idejo in morda celo ocenil. O sebi lahko povem, da je skript napisan pred približno 3 leti in je zame ZAKON. Tako priročen je, da povzroča resno nelagodje pri delu z drugimi računalniki. In z delovnim MacBookom.

Povezava do skriptov

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster