Vaihtoehtoinen ikkunanhallinta Linuxissa

Olen yksi niistä, jotka asettavat Caps Lockin vaihtamaan asettelua, koska olen liian laiska painamaan kahta näppäintä, kun voin painaa yhtä. Haluaisin jopa 2 tarpeetonta näppäintä: toisella ottaisin käyttöön englanninkielisen asettelun ja toisella venäjän. Mutta toinen tarpeeton avain on kontekstivalikon avaaminen, joka on niin tarpeeton, että monet kannettavien tietokoneiden valmistajat jättävät sen pois. Joten sinun täytyy olla tyytyväinen siihen, mitä sinulla on.

En myöskään halua etsiä heidän kuvakkeitaan tehtäväpalkista, kun vaihdan ikkunoita, tai saada kiinni nimistä selattaessa Alt + Tab, selata pöytätietokoneita jne. Haluan painaa näppäinyhdistelmää (mieluiten vain yhtä, mutta vapaita tarpeettomia näppäimiä ei ole enää) ja pääsen välittömästi tarvitsemaani ikkunaan. Esimerkiksi näin:

  • Alt+F: Firefox
  • Alt+D: Firefox (yksityinen selaus)
  • Alt+T: Pääte
  • Alt+M: Laskin
  • Alt+E: IntelliJ Idea
  • jne.

Lisäksi painamalla esimerkiksi päälle Alt + M Haluan nähdä laskimen riippumatta siitä, onko tämä ohjelma tällä hetkellä käynnissä. Jos se on käynnissä, sen ikkuna on kohdistettava, ja jos ei, suorita haluttu ohjelma ja siirrä tarkennus sen latautuessa.

Tapauksiin, joita edellinen komentosarja ei kata, haluan universaaleja näppäinyhdistelmiä, jotka voidaan helposti määrittää mihin tahansa avoimiin ikkunoihin. Minulla on esimerkiksi 10 yhdistelmää Alt + 1 до Alt + 0, joita ei ole sidottu mihinkään ohjelmiin. Voin vain klikata Alt + 1 ja ikkuna, joka on tällä hetkellä tarkentunut, tarkennetaan, kun sitä napsautetaan Alt + 1.

Leikkauksen alla on kuvaus muutamasta muusta ominaisuudesta ja vastaus kuinka tämä voidaan tehdä. Mutta varoitan heti, että tällainen mukauttaminen "itsellesi" voi aiheuttaa vakavaa riippuvuutta ja jopa vetäytymistä, jos joudut käyttämään Windowsia, Mac OS:ää tai jopa jonkun muun tietokonetta Linuxin kanssa.

Itse asiassa, jos ajattelee sitä, emme käytä niin monia ohjelmia päivittäin. Selain, pääte, IDE, jonkinlainen messenger, tiedostonhallinta, laskin ja ehkä siinä melkein kaikki. Näppäinyhdistelmiä ei tarvita paljon 95 % päivittäisistä tehtävistä.

Ohjelmissa, joissa on useita ikkunoita auki, yksi niistä voidaan määrittää pääikkunaksi. Sinulla on esimerkiksi useita IntelliJ Idea -ikkunoita auki ja määritetty Alt + E. Normaaliolosuhteissa, kun painat Alt + E jokin tämän ohjelman ikkuna avautuu, todennäköisesti se, joka avattiin ensin. Jos kuitenkin napsautat Alt + E kun jokin tämän ohjelman ikkunoista on jo fokusoituna, tämä tietty ikkuna määritetään pääikkunaksi ja se on se ikkuna, joka tarkennetaan, kun seuraavia yhdistelmiä painetaan.

Pääikkuna voidaan määrittää uudelleen. Tätä varten sinun on ensin nollattava yhdistelmä ja määritettävä sitten toinen ikkuna pääikkunaksi. Voit nollata yhdistelmän painamalla itse yhdistelmää ja sitten erityistä nollausyhdistelmää, joka on määritetty Alt+askelpalautin. Tämä kutsuu komentosarjan, joka poistaa edellisen yhdistelmän pääikkunan määrityksen. Ja sitten voit määrittää uuden pääikkunan edellisessä kappaleessa kuvatulla tavalla. Linkitetyn ikkunan palauttaminen yleisiin yhdistelmiin tapahtuu samalla tavalla.

Johdatus osoittautui pitkäksi, mutta halusin ensin kertoa, mitä teemme, ja sitten selittää kuinka se tehdään.

Niille, jotka ovat kyllästyneet lukemiseen

Lyhyesti sanottuna linkki skripteihin on artikkelin lopussa.

Mutta et silti voi asentaa ja käyttää sitä heti. Sinun on ensin selvitettävä, kuinka skripti löytää halutun ikkunan. Ilman tätä ei ole mahdollista kertoa skriptille, mihin kohdistus on tarkalleen siirrettävä. Ja sinun on ymmärrettävä, mitä tehdä, jos yhtäkkiä sopivaa ikkunaa ei löydy.

Ja en keskity siihen, miten komentosarjojen suorittaminen määritetään painamalla näppäinyhdistelmiä. Esimerkiksi KDE:ssä se on kohdassa Järjestelmäasetukset → Pikanäppäimet → Mukautetut pikanäppäimet. Näin pitäisi olla myös muissa ikkunoiden hallintaohjelmissa.

Esittelyssä wmctrl

Wmctrl — konsoliapuohjelma vuorovaikutukseen X Window Managerin kanssa. Tämä on käsikirjoituksen avainohjelma. Katsotaanpa nopeasti, kuinka voit käyttää sitä.

Näytetään ensin luettelo avoimista ikkunoista:

$ 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)
...

Vaihtoehto -l näyttää luettelon kaikista avoimista ikkunoista ja -NS liittää luokan nimen tulosteeseen (skype.Skype, Navigator.Firefox jne). Tässä tarvitsemme ikkunan tunnuksen (sarake 1), luokan nimen (sarake 3) ja ikkunan nimen (viimeinen sarake).

Voit yrittää aktivoida jonkin ikkunan käyttämällä vaihtoehtoa -a:

$ wmctrl -a skype.Skype -x

Jos kaikki meni suunnitelmien mukaan, Skype-ikkunan pitäisi ilmestyä näytölle. Jos vaihtoehdon sijaan -x käytä vaihtoehtoa -i, voit määrittää luokan nimen sijaan ikkunan tunnuksen. ID:n ongelmana on, että ikkunan tunnus muuttuu aina, kun sovellus käynnistetään, emmekä voi tietää sitä etukäteen. Toisaalta tämä attribuutti yksilöi ikkunan, mikä voi olla tärkeää, kun sovellus avaa useamman kuin yhden ikkunan. Tästä lisää hieman tarkemmin.

Tässä vaiheessa meidän on muistettava, että etsimme haluttua ikkunaa käyttämällä regex-lausetta tulosten perusteella wmctrl -lx. Mutta se ei tarkoita, että meidän on käytettävä jotain monimutkaista. Yleensä luokan tai ikkunan nimi riittää.

Periaatteessa pääidean pitäisi olla jo selvä. Määritä ikkunanhallinnan yleisissä pikanäppäin-/pikakuvakeasetuksissa komentosarjan suorittamiseen tarvittava yhdistelmä.

Kuinka käyttää skriptejä

Ensin sinun on asennettava konsolin apuohjelmat wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Seuraavaksi sinun on ladattava skriptit ja lisättävä ne $ PATH. Yleensä laitan ne sisään ~/bin:

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

Jos hakemisto ~/bin ei ollut siellä, sinun on luotava se ja käynnistettävä uudelleen (tai kirjauduttava sisään uudelleen), muuten ~/bin ei osu $ PATH. Jos kaikki on tehty oikein, komentosarjojen pitäisi olla käytettävissä konsolista ja Tab-syötön pitäisi toimia.

Pääkäsikirjoitus showwin kestää 2 parametria: ensimmäinen on regex, jolla etsimme tarvittavaa ikkunaa, ja toinen parametri on komento, joka on suoritettava, jos vaadittua ikkunaa ei löydy.

Voit yrittää suorittaa skriptin, esimerkiksi:

$ showwin "Mozilla Firefox$" firefox

Jos Firefox on asennettu, sen ikkuna tulee keskittyä. Vaikka Firefox ei olisi käynnissä, sen olisi pitänyt käynnistyä.

Jos se toimii, voit yrittää määrittää komentojen suorittamisen yhdistelmille. Lisää yleisiin pikanäppäin-/pikanäppäinasetuksiin:

  • Alt+F: showwin “Mozilla Firefox$” firefox
  • Alt+D: showwin "Mozilla Firefox (yksityinen selaus)$" "firefox -private-window"
  • Alt+C: näytä "chromium-browser.Chromium-browser N*" kromi-selain
  • Alt+X: showwin "chromium-browser.Chromium-browser I*" "chromium-browser -incognito"
  • Alt+S: showwin “skype.Skype” skypeforlinux
  • Alt+E: showwin “jetbrains-idea” idea.sh

jne. Jokainen voi määrittää näppäinyhdistelmiä ja ohjelmistoja parhaaksi katsomallaan tavalla.
Jos kaikki toimi oikein, voimme yllä olevien yhdistelmien avulla vaihtaa ikkunoiden välillä yksinkertaisesti painamalla näppäimiä.

Tulen pettymään kromin ystäville: se voi incognito-tilassa erottaa tavallisen ikkunan tulostensa perusteella wmctrl Et voi, heillä on samat luokkanimet ja ikkunoiden nimet. Ehdotetussa säännöllislausekkeessa merkkejä N* ja I* tarvitaan vain siksi, että nämä säännölliset lausekkeet eroavat toisistaan ​​ja ne voidaan määrittää pääikkunoiksi.

Edellisen yhdistelmän pääikkunan nollaus (itse asiassa regexille, joka showwin soitettiin viimeksi), sinun on kutsuttava käsikirjoitus showwinDetach. Minulla on tämä komentosarja näppäinyhdistelmälle Alt+askelpalautin.

Käsikirjoituksessa showwin on vielä yksi toiminto. Kun sitä kutsutaan yhdellä parametrilla (tässä tapauksessa parametri on vain tunniste), se ei tarkista säännöllistä lauseketta ollenkaan, vaan pitää kaikkia ikkunoita sopivina. Tämä itsessään vaikuttaa turhalta, mutta tällä tavalla voimme määrittää minkä tahansa ikkunan pääikkunaksi ja vaihtaa nopeasti kyseiseen ikkunaan.

Olen määrittänyt seuraavat yhdistelmät:

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

Tällä tavalla voin sitoa minkä tahansa ikkunan yhdistelmiin Alt + 1...Alt + 0. Vain klikkaamalla Alt + 1 Yhdistän nykyisen ikkunan tähän yhdistelmään. Voin peruuttaa sitomisen napsauttamalla Alt + 1ja sitten Alt+askelpalautin. Tai sulje ikkuna, sekin toimii.

Seuraavaksi kerron sinulle joitain teknisiä yksityiskohtia. Sinun ei tarvitse lukea niitä, mutta yritä vain asettaa ne ja nähdä. Suosittelen kuitenkin ymmärtämään muiden ihmisten komentosarjoja ennen niiden suorittamista tietokoneellasi :).

Kuinka tehdä ero saman sovelluksen eri ikkunoiden välillä

Periaatteessa aivan ensimmäinen esimerkki "wmctrl -a skype.Skype -x" toimi ja sitä voidaan käyttää. Mutta katsotaanpa uudestaan ​​esimerkkiä Firefoxilla, jossa 2 ikkunaa on auki:

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

Ensimmäinen ikkuna on normaalitilassa ja toinen on yksityinen selaus. Haluaisin pitää näitä ikkunoita eri sovelluksina ja vaihtaa niihin käyttämällä erilaisia ​​näppäinyhdistelmiä.

On tarpeen monimutkaista ikkunaa vaihtavaa komentosarjaa. Käytin tätä ratkaisua: näytä luettelo kaikista ikkunoista, tee grep säännöllisellä lausekkeella, ota ensimmäinen rivi komennolla pää, hanki ensimmäinen sarake (tämä on ikkunan tunnus) käyttämällä leikata, vaihda ikkunaan tunnuksella.

Säännöllisistä lausekkeista ja kahdesta ongelmasta pitäisi olla vitsi, mutta itse asiassa en käytä mitään monimutkaista. Tarvitsen säännöllisiä lausekkeita, jotta voin osoittaa rivin lopun ("$"-symboli) ja erottaa "Mozilla Firefox$" ja "Mozilla Firefox (Private Browsing)$".

Komento näyttää suunnilleen tältä:

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

Täällä voit jo arvata skriptin toisesta ominaisuudesta: jos grep ei palauta mitään, haluttu sovellus ei ole auki ja sinun on käynnistettävä se suorittamalla komento toisesta parametrista. Tarkista sitten säännöllisesti, onko haluttu ikkuna avautunut, jotta voit siirtää tarkennusta siihen. En keskity tähän; jokainen, joka tarvitsee sitä, tarkastelee lähteitä.

Kun sovellusikkunat eivät ole erotettavissa

Olemme siis oppineet siirtämään tarkennusta halutun sovelluksen ikkunaan. Mutta entä jos sovelluksessa on useampi kuin yksi ikkuna auki? Kumpaan minun pitäisi keskittyä? Yllä oleva komentosarja todennäköisesti siirtyy ensimmäiseen avoimeen ikkunaan. Haluaisimme kuitenkin enemmän joustavuutta. Haluaisin muistaa minkä ikkunan tarvitsemme ja vaihtaa kyseiseen ikkunaan.

Ajatus oli seuraava: Jos haluamme muistaa tietyn ikkunan näppäinyhdistelmälle, meidän on painettava tätä yhdistelmää, kun haluttu ikkuna on kohdistettu. Jatkossa, kun painat tätä yhdistelmää, kohdistetaan tähän ikkunaan. Kunnes ikkuna sulkeutuu tai teemme nollauksen tälle komentosarjayhdistelmälle showwinDetach.

Käsikirjoitusalgoritmi showwin jotain tällaista:

  • Tarkista, olemmeko aiemmin muistaneet sen ikkunan id:n, johon kohdistus tulee siirtää.
    Jos muistat ja tällainen ikkuna on edelleen olemassa, siirrämme kohdistuksen siihen ja poistumme.
  • Katsomme, mikä ikkuna on tällä hetkellä fokusoituna, ja jos se vastaa pyyntöämme, muista sen tunnus, jotta voit siirtyä siihen tulevaisuudessa ja poistua.
  • Menemme ainakin johonkin sopivaan ikkunaan, jos se on olemassa, tai avaa haluamasi sovellus.

Voit selvittää, mikä ikkuna on tällä hetkellä fokusoituna käyttämällä xdotool-konsoliapuohjelmaa muuttamalla sen tulos heksadesimaalimuotoon:

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

Helpoin tapa muistaa jotain bashissa on luoda tiedostoja muistissa sijaitsevaan virtuaaliseen tiedostojärjestelmään. Ubuntussa tämä on oletuksena käytössä /dev/shm/. En osaa sanoa mitään muista jakeluista, toivon, että siellä on myös jotain vastaavaa. Voit katsoa komennolla:

$ mount -l | grep tmpfs

Skripti luo tyhjiä hakemistoja tähän kansioon, kuten tämä: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Lisäksi joka kerta, kun sitä kutsutaan, se luo symlinkin /dev/shm/$USER/showwin/showwin_last päälle /dev/shm/$USER/showwin/$SEARCH_REGEX. Tätä tarvitaan, jotta tietyn yhdistelmän ikkunatunnus voidaan tarvittaessa poistaa komentosarjan avulla showwinDetach.

Mitä voidaan parantaa

Ensinnäkin komentosarjat on määritettävä manuaalisesti. Monet teistä eivät varmasti edes yritä konfiguroida järjestelmää, koska on tarpeen syventyä ja tehdä paljon omin käsin. Jos paketti olisi mahdollista yksinkertaisesti asentaa ja konfiguroida kaikki helpommin, se ehkä saavuttaisi jonkin verran suosiota. Ja sitten katso, sovellus julkaistaan ​​vakiojakeluissa.

Ja ehkä se voidaan tehdä helpommin. Jos ikkunan id:n avulla saat selville sen luoneen prosessin id:n ja prosessin tunnuksella saat selville, mikä komento sen loi, niin asetukset olisi mahdollista automatisoida. Itse asiassa en ymmärtänyt, oliko tässä kappaleessa kirjoittamani mahdollista. Tosiasia on, että olen henkilökohtaisesti tyytyväinen tapaan, jolla se toimii nyt. Mutta jos joku muu kuin minä pitää koko lähestymistapaa kätevänä ja joku parantaa sitä, käytän mielelläni parempaa ratkaisua.

Toinen ongelma, kuten jo kirjoitin, on, että joissain tapauksissa ikkunoita ei voida erottaa toisistaan. Toistaiseksi olen havainnut tämän vain incognito-tilassa kromi/kromi, mutta ehkä jotain vastaavaa on jossain muualla. Viimeisenä keinona on aina mahdollisuus universaaleihin yhdistelmiin Alt + 1...Alt + 0. Käytän jälleen Firefoxia ja minulle henkilökohtaisesti tämä ongelma ei ole merkittävä.

Mutta minulle merkittävä ongelma on, että käytän Mac OS:ää töihin, enkä voinut määrittää siellä mitään sellaista. apuohjelma wmctrl Luulen, että pystyin asentamaan sen, mutta se ei todellakaan toimi Mac OS:ssä. Sovelluksella voi tehdä jotain automator, mutta se on niin hidas, ettei sitä ole kätevä käyttää edes toimiessaan. En myöskään voinut asettaa näppäinyhdistelmiä niin, että ne toimisivat kaikissa ohjelmissa. Jos joku yhtäkkiä keksii ratkaisun, käytän sitä mielelläni.

Sen sijaan johtopäätös

Se osoittautui odottamattoman suureksi sanamääräksi niin näennäisesti yksinkertaiselle toiminnalle. Halusin välittää idean ja olla ylikuormittamatta tekstiä, mutta en ole vielä keksinyt, kuinka kertoisin sen yksinkertaisemmin. Ehkä se olisi parempi videomuodossa, mutta ihmiset eivät pidä siitä täällä.

Puhuin hieman siitä, mitä skriptin alla on ja kuinka se määritetään. En mennyt itse käsikirjoituksen yksityiskohtiin, mutta se on vain 50 riviä, joten sitä ei ole vaikea ymmärtää.

Toivon, että joku muu kokeilee tätä ideaa ja ehkä jopa arvostaa sitä. Voin sanoa itsestäni, että käsikirjoitus on kirjoitettu noin 3 vuotta sitten ja se on minulle ERITTÄIN kätevä. Niin kätevä, että se aiheuttaa vakavaa epämukavuutta työskennellessäsi muiden ihmisten tietokoneiden kanssa. Ja toimivalla MacBookilla.

Linkki skripteihin

Lähde: will.com

Lisää kommentti