Alternatyf finsterbehear yn Linux

Ik bin ien fan dyjingen dy't ynsteld Caps Lock te wikseljen layouts omdat ik bin te lui om te drukken op 2 kaaien as ik kin drukke ien. Ik soe sels graach 2 ûnnedige kaaien: ik soe ien brûke om de Ingelske yndieling yn te skeakeljen, en de twadde foar Russysk. Mar de twadde ûnnedige kaai is om it kontekstmenu op te roppen, dat is sa net nedich dat it troch in protte laptopfabrikanten ôfsnien wurdt. Sa moatte jo tefreden wêze mei wat jo hawwe.

En ik wol ek net sykje nei har ikoanen op 'e taakbalke by it wikseljen fan finsters, of de nammen fange as jo troch rôlje Alt + Tab, rôlje troch buroblêden, ensfh. Ik wol op in toetskombinaasje drukke (ideaal mar ien, mar d'r binne gjin frije ûnnedige kaaien mear) en daliks nei it finster komme dat ik nedich haw. Bygelyks as dit:

  • Alt+F: Firefox
  • Alt+D: Firefox (privee blêdzjen)
  • Alt+T: Terminal
  • Alt+M: rekkenmasine
  • Alt+E: IntelliJ Idea
  • ensfh.

Boppedat troch te drukken op bygelyks op Alt+M Ik wol de rekkenmasine sjen, nettsjinsteande oft dit programma op it stuit rint. As it rint, dan moat syn finster fokus wurde jûn, en as net, rinne it winske programma en oerdrage fokus as it laden.

Foar gefallen dy't net wurde behannele troch it foarige skript, wol ik universele toetskombinaasjes hawwe dy't maklik kinne wurde tawiisd oan ien fan 'e iepen finsters. Bygelyks, ik haw 10 kombinaasjes tawiisd út Alt + 1 до Alt + 0, dy't net bûn binne oan programma's. Ik kin gewoan klikke Alt + 1 en it finster dat op it stuit yn fokus is sil fokus krije as jo klikke Alt + 1.

Under de besuniging is d'r in beskriuwing fan in pear mear funksjes en in antwurd op hoe't dit kin wurde dien. Mar ik sil jo daliks warskôgje dat sa'n oanpassing "foar josels" serieuze ferslaving en sels weromlûken kin feroarsaakje as jo Windows, Mac OS of sels in oar syn kompjûter brûke moatte mei Linux.

Eins, as jo der oer tinke, brûke wy net safolle programma's op deistige basis. In browser, in terminal, in IDE, in soarte fan boadskipper, in triembehearder, in rekkenmasine en, miskien, dat is hast alles. Jo hawwe net in protte fluchtoetsen nedich om 95% fan jo deistige taken te dekken.

Foar programma's dy't ferskate finsters iepen hawwe, kin ien fan har wurde oanwiisd as de wichtichste. Jo hawwe bygelyks meardere IntelliJ Idea-finsters iepen en tawiisd oan Alt + E. Under normale omstannichheden, as jo drukke Alt + E in finster fan dit programma sil iepenje, wierskynlik dejinge dy't earst iepene waard. Lykwols, as jo klikke op Alt + E as ien fan 'e finsters fan dit programma al yn fokus is, dan sil dit bepaalde finster wurde tawiisd as it haadfinster en it sil dejinge wêze dy't fokus sil wurde jûn as folgjende kombinaasjes yndrukt wurde.

It haadfinster kin opnij wurde tawiisd. Om dit te dwaan, moatte jo earst de kombinaasje weromsette, en dan in oar finster tawize as it haadfinster. Om in kombinaasje te resetten, moatte jo op de kombinaasje sels drukke, en dan in spesjale resetkombinaasje, ik haw it tawiisd oan Alt+Backspace. Dit sil in skript neame dat it haadfinster foar de foarige kombinaasje ûntslacht. En dan kinne jo in nij haadfinster tawize lykas beskreaun yn 'e foarige paragraaf. It weromsette fan in keppele finster nei universele kombinaasjes bart op deselde wize.

De ynlieding waard lang, mar ik woe earst fertelle wat wy sille dwaan, en dan útlizze hoe't it moat.

Foar dyjingen dy't wurch binne fan it lêzen

Koartsein, de keppeling nei de skripts is oan 'e ein fan it artikel.

Mar jo sille it noch net direkt kinne ynstallearje en brûke. Jo moatte earst útfine hoe't it skript it winske finster fynt. Sûnder dit sil it net mooglik wêze om it skript te fertellen wêr't krekt de fokus oerbrocht wurde moat. En jo moatte begripe wat te dwaan as ynienen gjin gaadlik finster wurdt fûn.

En ik sil net rjochtsje op hoe't jo de útfiering fan skripts konfigurearje troch op toetskombinaasjes te drukken. Bygelyks, yn KDE is it yn Systeemynstellingen → Fluchtoetsen → Oanpaste fluchtoetsen. Dit soe ek it gefal wêze moatte yn oare finsterbehearders.

Yntroduksje fan wmctrl

Wmctrl - konsole-hulpprogramma foar ynteraksje mei X Window Manager. Dit is it kaaiprogramma foar it skript. Litte wy efkes sjen hoe't jo it kinne brûke.

Litte wy earst in list mei iepen finsters sjen litte:

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

Opsje -l toant in list fan alle iepen finsters, en foeget de klassenamme ta oan de útfier (skype.Skype, Navigator.Firefox ensfh). Hjir moatte wy it finster id (kolom 1), klasse namme (kolom 3) en finster namme (lêste kolom).

Jo kinne besykje wat finster te aktivearjen mei de opsje -a:

$ wmctrl -a skype.Skype -x

As alles neffens plan gie, soe it Skype-finster op it skerm moatte ferskine. As ynstee fan de opsje -x gebrûk opsje -i, dan kinne jo ynstee fan de klassenamme de finster-id opjaan. It probleem mei id is dat de finster-id feroaret elke kear as de applikaasje wurdt lansearre en wy kinne it net fan tefoaren witte. Oan 'e oare kant identifisearret dit attribút unyk in finster, wat wichtich kin wêze as in applikaasje mear as ien finster iepenet. Mear oer dit in bytsje fierder.

Op dit stadium moatte wy betinke dat wy sille sykje nei it winske finster mei help fan regex troch útfier wmctrl -lx. Mar dat betsjut net dat wy wat komplisearre moatte brûke. Gewoanlik is de klassenamme of finsternamme genôch.

Yn prinsipe moat it haadgedachte al dúdlik wêze. Yn 'e globale fluchtoetsen / fluchtoetsen ynstellings foar jo finsterbehearder, konfigurearje de fereaske kombinaasje om it skript út te fieren.

Hoe kinne jo skripts brûke

Earst moatte jo konsole-hulpprogramma's ynstallearje wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Folgjende moatte jo de skripts downloade en tafoegje oan $ PATH. Ik set se meastentiids yn ~/bin:

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

As de triemtafel ~/bin wie der net, dan moatte jo it oanmeitsje en opnij opstarte (of opnij oanmelde), oars ~/bin sil net slaan $ PATH. As alles goed is dien, dan moatte de skripts tagonklik wêze fanút de konsole en it foltôgjen fan de ljepper moat wurkje.

Main skript showwin nimt 2 parameters: de earste is in regex, wêrmei wy sille sykje nei it fereaske finster, en de twadde parameter is in kommando dat moat wurde útfierd as it fereaske finster net fûn wurdt.

Jo kinne besykje in skript út te fieren, bygelyks:

$ showwin "Mozilla Firefox$" firefox

As Firefox ynstalleare is, moat it finster fokus wurde jûn. Sels as Firefox net draaide, soe it moatte begjinne.

As it wurket, dan kinne jo besykje de útfiering fan kommando's op kombinaasjes te konfigurearjen. Yn 'e globale fluchtoetsen / fluchtoetsen ynstellings tafoegje:

  • Alt+F: showwin "Mozilla Firefox$" firefox
  • Alt+D: showwin "Mozilla Firefox (Private Browsing)$" "firefox -privee-finster"
  • 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

Ensafuorthinne Eltsenien kin konfigurearje kaai kombinaasjes en software as se fine.
As alles goed wurke, dan kinne wy ​​​​mei de boppesteande kombinaasjes wikselje tusken finsters troch gewoan op toetsen te drukken.

Ik sil chrome-leafhawwers teloarstelle: it kin in gewoane finster incognito ûnderskiede troch syn útfier wmctrl Jo kinne net, se hawwe deselde klasse nammen en finster titels. Yn 'e foarstelde regex binne de tekens N * en I * allinich nedich sadat dizze reguliere útdrukkingen fan elkoar ferskille en se kinne wurde tawiisd as de haadfinsters.

Om it haadfinster fan 'e foarige kombinaasje werom te setten (yn feite foar regex, hokker showwin de lêste kear neamd) moatte jo it skript skilje showwinDetach. Ik haw dit skript tawiisd oan in kaai kombinaasje Alt+Backspace.

By it skript showwin der is noch ien funksje. As it wurdt neamd mei ien parameter (yn dit gefal is de parameter gewoan in identifier), kontrolearret it de regex hielendal net, mar beskôget alle finsters as geskikt. Op himsels liket dit nutteloos, mar op dizze manier kinne wy ​​elk finster oanwize as it haad en fluch oerskeakelje nei dat bepaalde finster.

Ik haw de folgjende kombinaasjes ynsteld:

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

Op dizze manier kin ik alle finsters oan kombinaasjes bine Alt + 1...Alt + 0. Gewoan troch te klikken Alt + 1 Ik bine it hjoeddeiske finster oan dizze kombinaasje. Ik kin de bining annulearje troch te klikken Alt + 1, en doe Alt+Backspace. Of it rút ticht, dat wurket ek.

Folgjende sil ik jo wat technyske details fertelle. Jo hoege se net te lêzen, mar besykje se gewoan op te setten en te sjen. Mar ik soe dochs oanrikkemandearje om de skripts fan oaren te begripen foardat se op jo kompjûter útfiere :).

Hoe kinne jo ûnderskiede tusken ferskate finsters fan deselde applikaasje

Yn prinsipe wurke it earste foarbyld "wmctrl -a skype.Skype -x" en kin brûkt wurde. Mar lit ús nochris sjen nei it foarbyld mei Firefox, wêryn 2 finsters iepen binne:

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

It earste finster is normale modus, en it twadde is Private Browsing. Ik soe dizze finsters wolle beskôgje as ferskate applikaasjes en oerskeakelje nei har mei ferskate toetskombinaasjes.

It is nedich om it skript te komplisearjen dat finsters skeakelt. Ik brûkte dizze oplossing: werjaan in list fan alle finsters, do grep troch regex, nim de earste line mei holle, krije de earste kolom (dit sil de finster-id wêze) mei help fan snije, wikselje nei finster troch id.

Der soe in grap wêze moatte oer reguliere útdrukkingen en twa problemen, mar eins brûk ik neat yngewikkeld. Ik haw reguliere útdrukkingen nedich, sadat ik it ein fan 'e rigel oanjaan kin (it "$"-symboal) en "Mozilla Firefox$" fan "Mozilla Firefox (Private Browsing)$" ûnderskiede kin.

It kommando sjocht der sa út:

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

Hjir kinne jo al riede oer de twadde funksje fan it skript: as grep neat werombringt, dan is de winske applikaasje net iepen en jo moatte it begjinne troch it kommando út te fieren fan 'e twadde parameter. En kontrolearje dan periodyk oft it fereaske finster is iepene om de fokus derop oer te bringen. Ik sil my hjir net op rjochtsje; elkenien dy't it nedich hat, sil nei de boarnen sjen.

As applikaasjefinsters net te ûnderskieden binne

Dat, wy hawwe leard hoe't jo fokus oerdrage nei it finster fan 'e winske applikaasje. Mar wat as in applikaasje mear dan ien finster iepen hat? Hokker moat ik fokus jaan? It skript hjirboppe sil nei alle gedachten oerjaan nei it earste iepen finster. Wy wolle lykwols mear fleksibiliteit. Ik soe graach kinne ûnthâlde hokker finster wy nedich hawwe en oerskeakelje nei dat bepaalde finster.

It idee wie dit: As wy in spesifyk finster foar in toetskombinaasje ûnthâlde wolle, dan moatte wy dizze kombinaasje drukke as it winske finster yn fokus is. Yn 'e takomst, as jo op dizze kombinaasje drukke, sil de fokus wurde jûn oan dit finster. Oant it finster slút of wy meitsje in reset foar dizze skriptkombinaasje showwinDetach.

Skript algoritme showwin soksawat:

  • Kontrolearje as wy earder de id fan it finster ûnthâlden hawwe wêrnei't fokus moat wurde oerdroegen.
    As jo ​​it ûnthâlde en sa'n finster bestiet noch, dan drage wy it fokus oer en geane út.
  • Wy sjogge op hokker finster op it stuit yn fokus is, en as it oerienkomt mei ús fersyk, tink dan oan syn id om der yn 'e takomst nei te gean en út te gean.
  • Wy geane nei op syn minst in geskikt finster as it bestiet of iepenje de winske applikaasje.

Jo kinne útfine hokker finster op it stuit yn fokus is mei it xdotool-konsole-hulpprogramma troch de útfier te konvertearjen nei hexadesimale formaat:

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

De maklikste manier om wat yn bash te ûnthâlden is om bestannen te meitsjen yn in firtueel bestânsysteem dat yn it ûnthâld leit. Yn Ubuntu is dit standert ynskeakele yn /dev/shm/. Ik kin neat sizze oer oare distribúsjes, ik hoopje dat der ek wat ferlykber is. Jo kinne sjen mei it kommando:

$ mount -l | grep tmpfs

It skript sil lege mappen meitsje yn dizze map, lykas dit: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Derneist sil it elke kear as it wurdt neamd in symlink meitsje /dev/shm/$USER/showwin/showwin_last op /dev/shm/$USER/showwin/$SEARCH_REGEX. Dit sil nedich wêze om, as it nedich is, de finster-id foar in bepaalde kombinaasje te ferwiderjen mei in skript showwinDetach.

Wat kin ferbettere wurde

Earst moatte de skripts mei de hân konfigureare wurde. Wiswier, fanwegen de needsaak om te ferdjipjen en in protte mei jo hannen te dwaan, sille in protte fan jo net iens besykje it systeem te konfigurearjen. As it mooglik wie om it pakket gewoan te ynstallearjen en alles makliker te konfigurearjen, dan soe it miskien wat populariteit winne. En sjoch dan, de applikaasje soe wurde frijlitten yn standert distribúsjes.

En miskien kin it makliker wurde. As jo ​​troch de id fan in finster kinne fine út de id fan it proses dat makke it, en troch de id fan it proses kinne jo fine út hokker kommando makke it, dan soe it mooglik wêze om te automatisearjen de opset. Yn feite, ik begriep net oft wat ik skreau yn dizze paragraaf wie mooglik. It feit is dat ik persoanlik tefreden bin mei de manier wêrop it no wurket. Mar as immen oars as ik de hiele oanpak handich fynt en immen ferbetteret, dan sil ik graach in bettere oplossing brûke.

In oar probleem, lykas ik al skreau, is dat yn guon gefallen de finsters net fan inoar te ûnderskieden binne. Oant no haw ik dit allinich observearre mei incognito yn chrome / chromium, mar miskien is der earne oars wat ferlykber. As lêste ynstânsje is d'r altyd de opsje fan universele kombinaasjes Alt + 1...Alt + 0. Nochris, ik brûk Firefox en foar my persoanlik is dit probleem net wichtich.

Mar it wichtige probleem foar my is dat ik Mac OS brûke foar wurk en ik koe dêr neat konfigurearje. nut wmctrl Ik tink dat ik koe ynstallearje it, mar it wurket net echt op Mac OS. Der kin wat dien wurde mei de applikaasje Automator, mar it is sa stadich dat it net handich is om te brûken sels as it wurket. Ik koe ek gjin toetskombinaasjes ynstelle sadat se yn alle programma's wurken. As immen ynienen mei in oplossing komt, sil ik dy graach brûke.

Yn stee fan in konklúzje

It blykte in ûnferwachts grut tal wurden te wêzen foar sa'n skynber ienfâldige funksjonaliteit. Ik woe it idee oerbringe en de tekst net oerladen, mar ik haw noch net útfûn hoe't ik it ienfâldiger fertelle kin. Miskien soe it better wêze yn fideoformat, mar minsken fine it hjir net sa leuk.

Ik praat in bytsje oer wat der ûnder de kap fan it skript leit en hoe't ik it konfigurearje. Ik gie net yn details fan it skript sels, mar it is mar 50 rigels, dus it is net dreech om te begripen.

Ik hoopje dat in oar dit idee sil besykje en it miskien sels wurdearje sil. Ik kin oer mysels sizze dat it skript sawat 3 jier lyn is skreaun en it is HJIR handich foar my. Sa handich dat it serieus ongemak feroarsaket by it wurkjen mei de kompjûters fan oare minsken. En mei in wurkjende MacBook.

Link nei skripts

Boarne: www.habr.com

Add a comment