Alternatiewe vensterbestuur in Linux

Ek is een van die wat Caps Lock gestel het om uitleg te wissel omdat ek te lui is om 2 sleutels te druk wanneer ek een kan druk. Ek sal selfs 2 onnodige sleutels wil hê: ek sal een gebruik om die Engelse uitleg aan te skakel, en die tweede vir Russies. Maar die tweede onnodige sleutel is om die kontekskieslys op te roep, wat so onnodig is dat dit deur baie skootrekenaarvervaardigers uitgesny word. Jy moet dus tevrede wees met wat jy het.

En ek wil ook nie na hul ikone op die taakbalk soek wanneer daar van vensters verander word nie, of die name vang wanneer ek deur blaai nie Alt + Tab, blaai deur rekenaars, ens. Ek wil 'n sleutelkombinasie druk (ideaal net een, maar daar is geen gratis onnodige sleutels meer nie) en dadelik by die venster uitkom wat ek nodig het. Byvoorbeeld, soos volg:

  • Alt+F: Firefox
  • Alt+D: Firefox (Privaatblaai)
  • Alt+T: Terminale
  • Alt+M: Sakrekenaar
  • Alt+E: IntelliJ-idee
  • ens.

Verder, deur byvoorbeeld op te druk Alt+M Ek wil die sakrekenaar sien, ongeag of hierdie program tans loop. As dit aan die gang is, moet sy venster gefokus word, en indien nie, hardloop die gewenste program en dra fokus oor wanneer dit laai.

Vir gevalle wat nie deur die vorige skrif gedek word nie, wil ek universele sleutelkombinasies hê wat maklik aan enige van die oop vensters toegewys kan word. Ek het byvoorbeeld 10 kombinasies toegewys vanaf Alt + 1 aan Alt + 0, wat nie aan enige programme gekoppel is nie. Ek kan maar klik Alt + 1 en die venster wat tans in fokus is, sal fokus kry wanneer daarop geklik word Alt + 1.

Onder die snit is daar 'n beskrywing van nog 'n paar kenmerke en 'n antwoord oor hoe dit gedoen kan word. Maar ek sal jou dadelik waarsku dat sulke aanpassing "vir jouself" ernstige verslawing en selfs onttrekking kan veroorsaak as jy Windows, Mac OS of selfs iemand anders se rekenaar met Linux moet gebruik.

Trouens, as jy daaroor dink, gebruik ons ​​nie soveel programme op 'n daaglikse basis nie. 'n Blaaier, 'n terminaal, 'n IDE, 'n soort boodskapper, 'n lêerbestuurder, 'n sakrekenaar en miskien is dit amper al. Daar is nie baie sleutelkombinasies nodig om 95% van alledaagse take te dek nie.

Vir programme wat verskeie vensters oop het, kan een van hulle as die hoof een aangewys word. Byvoorbeeld, jy het verskeie IntelliJ Idea-vensters oop en toegewys aan Alt + E. Onder normale toestande, wanneer jy druk Alt + E 'n venster van hierdie program sal oopmaak, waarskynlik die een wat eerste oopgemaak is. As jy egter op klik Alt + E wanneer een van die vensters van hierdie program reeds in fokus is, dan sal hierdie spesifieke venster toegewys word as die hoof een en dit sal die een wees wat fokus gegee sal word wanneer daaropvolgende kombinasies gedruk word.

Die hoofvenster kan hertoegewys word. Om dit te doen, moet jy eers die kombinasie terugstel en dan 'n ander venster daaraan toewys as die hoofvenster. Om 'n kombinasie terug te stel, moet jy die kombinasie self druk, en dan 'n spesiale terugstel kombinasie, ek het dit toegewys aan Alt+terugspasie. Dit sal 'n skrip oproep wat die hoofvenster vir die vorige kombinasie sal onttrek. En dan kan jy 'n nuwe hoofvenster toewys soos beskryf in die vorige paragraaf. Die herstel van 'n gekoppelde venster na universele kombinasies vind op dieselfde manier plaas.

Die inleiding blyk lank te wees, maar ek wou eers vertel wat ons gaan doen, en dan verduidelik hoe om dit te doen.

Vir diegene wat moeg is vir lees

Kortom, die skakel na die skrifte is aan die einde van die artikel.

Maar jy sal dit steeds nie dadelik kan installeer en gebruik nie. U sal eers moet uitvind hoe die skrip die gewenste venster vind. Daarsonder sal dit nie moontlik wees om vir die draaiboek te sê waar presies die fokus oorgedra moet word nie. En jy moet verstaan ​​wat om te doen as daar skielik nie 'n geskikte venster gevind word nie.

En ek sal nie fokus op hoe om die uitvoering van skrifte op te stel deur sleutelkombinasies te druk nie. Byvoorbeeld, in KDE is dit in Stelselinstellings → Kortpaaie → Pasgemaakte kortpaaie. Dit behoort ook die geval te wees in ander vensterbestuurders.

Stel wmctrl bekend

Wmctrl - konsole nut vir interaksie met X Window Manager. Dit is die sleutelprogram vir die skrif. Kom ons kyk vinnig hoe jy dit kan gebruik.

Laat ons eers 'n lys van oop vensters vertoon:

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

opsie -l vertoon 'n lys van alle oop vensters, en voeg die klasnaam by die afvoer (skype.Skype, Navigator.Firefox ens). Hier het ons die venster-ID (kolom 1), klasnaam (kolom 3) en vensternaam (laaste kolom) nodig.

Jy kan probeer om een ​​of ander venster te aktiveer deur die opsie te gebruik -a:

$ wmctrl -a skype.Skype -x

As alles volgens plan verloop het, behoort die Skype-venster op die skerm te verskyn. As in plaas van die opsie -x gebruik opsie -i, dan kan jy in plaas van die klasnaam die venster-ID spesifiseer. Die probleem met id is dat die venster id verander elke keer as die toepassing geloods word en ons kan dit nie vooraf weet nie. Aan die ander kant identifiseer hierdie kenmerk 'n venster uniek, wat belangrik kan wees wanneer 'n toepassing meer as een venster oopmaak. Meer hieroor 'n bietjie verder.

Op hierdie stadium moet ons onthou dat ons sal soek vir die gewenste venster met behulp van regex deur uitvoer wmctrl -lx. Maar dit beteken nie dat ons iets ingewikkelds moet gebruik nie. Gewoonlik is die klasnaam of vensternaam voldoende.

Basies moet die hoofgedagte reeds duidelik wees. In die globale snelsleutels/kortpaaie-instellings vir jou vensterbestuurder, stel die vereiste kombinasie op om die skrip uit te voer.

Hoe om skrifte te gebruik

Eerstens moet u konsole-nutsprogramme installeer wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Volgende moet jy die skrifte aflaai en dit byvoeg $ PAD. Ek sit hulle gewoonlik in ~/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 die gids ~/bin was nie daar nie, dan moet jy dit skep en herlaai (of weer aanmeld), anders ~/bin sal nie tref nie $ PAD. As alles korrek gedoen is, moet die skrifte toeganklik wees vanaf die konsole en Tab-voltooiing moet werk.

Hoofskrif showwin neem 2 parameters: die eerste is 'n regex, waardeur ons na die vereiste venster sal soek, en die tweede parameter is 'n opdrag wat uitgevoer moet word as die vereiste venster nie gevind word nie.

Jy kan probeer om 'n skrip te laat loop, byvoorbeeld:

$ showwin "Mozilla Firefox$" firefox

As Firefox geïnstalleer is, moet sy venster gefokus word. Selfs as Firefox nie aan die gang was nie, moes dit begin het.

As dit werk, kan jy probeer om die uitvoering van opdragte op kombinasies op te stel. Voeg in die globale snelsleutels/kortpaaie-instellings by:

  • Alt+F: wyswin “Mozilla Firefox$” firefox
  • Alt+D: wyswin "Mozilla Firefox (Privaat blaai)$" "firefox -privaat-venster"
  • Alt+C: wyswin "chromium-blaaier.Chromium-blaaier N*" chromium-blaaier
  • Alt+X: wyswin "chromium-blaaier.Chromium-blaaier I*" "chromium-blaaier -incognito"
  • Alt+S: wyswin "skype.Skype" skypeforlinux
  • Alt+E: wyswin “jetbrains-idea” idee.sh

Ens. Almal kan sleutelkombinasies en sagteware opstel soos hulle goeddink.
As alles reg uitgewerk het, sal ons met behulp van die bogenoemde kombinasies tussen vensters kan wissel deur eenvoudig sleutels te druk.

Ek sal chroomliefhebbers teleurstel: dit kan 'n gewone venster incognito onderskei deur sy uitset wmctrl Jy kan nie, hulle het dieselfde klasname en venstertitels. In die voorgestelde regeks is die karakters N* en I* slegs nodig sodat hierdie gereelde uitdrukkings van mekaar verskil en hulle as die hoofvensters toegewys kan word.

Om die hoofvenster van die vorige kombinasie terug te stel (in werklikheid vir regex, wat showwin laas gebel) moet jy die skrif bel wyswin Losmaak. Ek het hierdie skrif aan 'n sleutelkombinasie toegewys Alt+terugspasie.

By die draaiboek showwin daar is nog een funksie. Wanneer dit met een parameter geroep word (in hierdie geval is die parameter net 'n identifiseerder), kontroleer dit glad nie die regex nie, maar beskou alle vensters as geskik. Op sigself lyk dit nutteloos, maar op hierdie manier kan ons enige venster as die hoof een aanwys en vinnig na daardie spesifieke venster oorskakel.

Ek het die volgende kombinasies opgestel:

  • Alt+1: wyswin "CustomKey1"
  • Alt+2: wyswin "CustomKey2"
  • ...
  • Alt+0: wyswin "CustomKey0"
  • Alt+terugspasie: wyswinOntmaak

Op hierdie manier kan ek enige vensters aan kombinasies bind Alt + 1...Alt + 0. Net deur te klik Alt + 1 Ek bind die huidige venster aan hierdie kombinasie. Ek kan die binding kanselleer deur te klik Alt + 1, en dan Alt+terugspasie. Of maak die venster toe, dit werk ook.

Volgende sal ek jou 'n paar tegniese besonderhede vertel. Jy hoef dit nie te lees nie, maar probeer dit net opstel en sien. Maar ek sal steeds aanbeveel dat jy ander mense se skrifte verstaan ​​voordat jy dit op jou rekenaar laat loop :).

Hoe om te onderskei tussen verskillende vensters van dieselfde toepassing

In beginsel het die heel eerste voorbeeld "wmctrl -a skype.Skype -x" gewerk en kan dit gebruik word. Maar kom ons kyk weer na die voorbeeld met Firefox, waarin 2 vensters oop is:

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

Die eerste venster is normale modus, en die tweede is Privaat blaai. Ek wil graag hierdie vensters as verskillende toepassings beskou en na hulle oorskakel deur verskillende sleutelkombinasies te gebruik.

Dit is nodig om die skrif wat vensters verander, te kompliseer. Ek het hierdie oplossing gebruik: vertoon 'n lys van alle vensters, doen grep deur regex, neem die eerste reël met kop, kry die eerste kolom (dit sal die venster-ID wees) gebruik sny, skakel oor na venster deur id.

Daar moet 'n grap wees oor gereelde uitdrukkings en twee probleme, maar eintlik gebruik ek niks ingewikkeld nie. Ek het gereelde uitdrukkings nodig sodat ek die einde van die reël (die “$”-simbool) kan aandui en “Mozilla Firefox$” van “Mozilla Firefox (Privaat Browsing)$” kan onderskei.

Die opdrag lyk so iets:

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

Hier kan jy reeds raai oor die tweede kenmerk van die skrif: as grep niks teruggee nie, is die gewenste toepassing nie oop nie en moet jy dit begin deur die opdrag vanaf die tweede parameter uit te voer. En kyk dan van tyd tot tyd of die vereiste venster oopgemaak het om die fokus daarheen oor te dra. Ek sal nie hierop fokus nie; enigiemand wat dit nodig het, sal na die bronne kyk.

Wanneer toepassingsvensters nie onderskeibaar is nie

So, ons het geleer hoe om fokus oor te dra na die venster van die gewenste toepassing. Maar wat as 'n toepassing meer as een venster oop het? Aan watter een moet ek fokus gee? Die skrif hierbo sal heel waarskynlik na die eerste oop venster oorgedra word. Ons wil egter meer buigsaamheid hê. Ek wil graag kan onthou watter venster ons benodig en oorskakel na daardie spesifieke venster.

Die idee was dit: As ons 'n spesifieke venster vir 'n sleutelkombinasie wil onthou, dan moet ons hierdie kombinasie druk wanneer die gewenste venster in fokus is. In die toekoms, wanneer jy hierdie kombinasie druk, sal die fokus aan hierdie venster gegee word. Totdat die venster toemaak of ons 'n reset vir hierdie skripkombinasie doen wyswin Losmaak.

Skrip algoritme showwin iets soos hierdie:

  • Kyk of ons voorheen die id van die venster onthou het waarna fokus oorgedra moet word.
    As jy onthou en so 'n venster bestaan ​​nog, dan dra ons fokus daarna oor en gaan uit.
  • Ons kyk na watter venster tans in fokus is, en as dit by ons versoek pas, onthou dan sy id om in die toekoms daarna te gaan en uit te gaan.
  • Ons gaan na ten minste 'n geskikte venster as dit bestaan ​​of maak die gewenste toepassing oop.

U kan uitvind watter venster tans in fokus is met behulp van die xdotool-konsole-nutsding deur die uitvoer daarvan na heksadesimale formaat om te skakel:

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

Die maklikste manier om iets in bash te onthou, is om lêers te skep in 'n virtuele lêerstelsel wat in die geheue geleë is. In Ubuntu is dit by verstek geaktiveer in /dev/shm/. Ek kan niks sê oor ander verspreidings nie, ek hoop daar is ook iets soortgelyks. Jy kan kyk met die opdrag:

$ mount -l | grep tmpfs

Die skrip sal leë gidse in hierdie gids skep, soos volg: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Daarbenewens sal dit elke keer as dit genoem word 'n simskakel skep /dev/shm/$USER/showwin/showwin_last op /dev/shm/$USER/showwin/$SEARCH_REGEX. Dit sal nodig wees om, indien nodig, die venster-ID vir 'n sekere kombinasie met 'n skrip te verwyder wyswin Losmaak.

Wat kan verbeter word

Eerstens moet die skrifte met die hand gekonfigureer word. Sekerlik, as gevolg van die behoefte om in te delf en baie met jou hande te doen, sal baie van julle nie eers probeer om die stelsel op te stel nie. As dit moontlik was om eenvoudig die pakket te installeer en alles makliker op te stel, sou dit miskien 'n mate van gewildheid verkry. En kyk dan, die toepassing sal in standaardverspreidings vrygestel word.

En miskien kan dit makliker gedoen word. As jy deur die ID van 'n venster die ID van die proses wat dit geskep het kan uitvind, en deur die ID van die proses kan jy uitvind watter opdrag dit geskep het, dan sou dit moontlik wees om die opstelling te outomatiseer. Trouens, ek het nie verstaan ​​of dit wat ek in hierdie paragraaf geskryf het moontlik was nie. Die feit is dat ek persoonlik tevrede is met die manier waarop dit nou werk. Maar as iemand anders as ek die hele benadering gerieflik vind en iemand verbeter dit, dan sal ek graag 'n beter oplossing gebruik.

Nog 'n probleem, soos ek reeds geskryf het, is dat die vensters in sommige gevalle nie van mekaar onderskei kan word nie. Tot dusver het ek dit net met incognito in chroom/chroom waargeneem, maar miskien is daar iets soortgelyks iewers anders. As 'n laaste uitweg is daar altyd die opsie van universele kombinasies Alt + 1...Alt + 0. Weereens, ek gebruik Firefox en vir my persoonlik is hierdie probleem nie beduidend nie.

Maar die groot probleem vir my is dat ek Mac OS vir werk gebruik en ek kon nie so iets daar konfigureer nie. nut wmctrl Ek dink ek kon dit installeer, maar dit werk nie regtig op Mac OS nie. Iets kan met die toepassing gedoen word Automator, maar dit is so stadig dat dit nie gerieflik is om te gebruik nie, selfs wanneer dit werk. Ek kon ook nie sleutelkombinasies opstel sodat dit in alle programme werk nie. As iemand skielik met 'n oplossing vorendag kom, sal ek dit graag gebruik.

In plaas daarvan om 'n gevolgtrekking

Dit blyk 'n onverwagse groot aantal woorde te wees vir so 'n skynbaar eenvoudige funksionaliteit. Ek wou die idee oordra en nie die teks oorlaai nie, maar ek het nog nie uitgepluis hoe om dit eenvoudiger te vertel nie. Miskien sal dit beter wees in videoformaat, maar mense hou nie daarvan hier nie.

Ek het 'n bietjie gepraat oor wat onder die enjinkap van die skrif is en hoe om dit op te stel. Ek het nie in besonderhede van die draaiboek self ingegaan nie, maar dit is net 50 reëls, so dit is nie moeilik om te verstaan ​​nie.

Ek hoop dat iemand anders hierdie idee sal probeer en dit dalk selfs sal waardeer. Ek kan van myself sê die draaiboek is so 3 jaar gelede geskryf en dit is BAIE gerieflik vir my. So gerieflik dat dit ernstige ongemak veroorsaak wanneer jy met ander mense se rekenaars werk. En met 'n werkende MacBook.

Skakel na skrifte

Bron: will.com

Voeg 'n opmerking