Alternativ fönsterhantering i Linux

Jag Àr en av dem som stÀller in Caps Lock för att vÀxla layout eftersom jag Àr lat och inte vill trycka pÄ tvÄ tangenter nÀr jag kan trycka pÄ en. Jag skulle till och med vilja ha tvÄ onödiga tangenter: en för att aktivera den engelska layouten och en annan för den ryska. Men den andra onödiga tangenten Àr för att öppna kontextmenyn, en sÄ onödig funktion att mÄnga laptopstillverkare tar bort den. SÄ jag fÄr nöja mig med det jag har.

Och jag vill inte leta efter ikonerna pÄ aktivitetsfÀltet nÀr jag vÀxlar mellan fönster, jag vill bara trycka pÄ en tangentkombination (idealiskt sett en enda, men det finns inga lediga onödiga tangenter kvar) och direkt komma till det fönster jag behöver. Till exempel sÄ hÀr: Alt+Tab, blÀddra mellan skrivbord och sÄ vidare. Jag vill trycka pÄ en tangentkombination (idealiskt sett en enda, men inga lediga onödiga tangenter finns kvar) och direkt komma till det fönster jag behöver. Till exempel sÄ hÀr:

  • Alt+F: Firefox
  • Alt+D: Firefox (Privat BlĂ€ddring)
  • Alt+T: Terminal
  • Alt+M: Kalkylator
  • Alt+E: IntelliJ Idea
  • och sĂ„ vidare.

Dessutom vill jag att nĂ€r jag trycker pĂ„ Alt+M sĂ„ ska jag se kalkylatorn oavsett om programmet Ă€r igĂ„ng just nu eller inte. Om det Ă€r igĂ„ng, ska fokus skickas till det fönstret, men om det inte Ă€r igĂ„ng – starta det nödvĂ€ndiga programmet och ge fokus nĂ€r det Ă€r laddat.

För situationer som inte tÀcks av det föregÄende scenariot vill jag ha universella tangentkombinationer för att enkelt kunna tilldela dem till nÄgra av de öppna fönster. Till exempel har jag 10 kombinationer tilldelade frÄn Alt+1 till Alt+0, som inte Àr kopplade till nÄgra program. Jag kan helt enkelt trycka pÄ Alt+1 och fönstret som just nu har fokus kommer att fÄ fokus nÀr jag trycker pÄ. Alt+1.

Under tar jag upp beskrivningen av nÄgra ytterligare funktioner och svarar pÄ hur man kan göra detta. Men jag varnar pÄ förhand att en sÄdan anpassning "till sig sjÀlv" kan skapa starkt beroende och till och med abstinens om man mÄste anvÀnda Windows, Mac OS eller till och med en annan dator med Linux.

I sjÀlva verket, om man tÀnker pÄ det, anvÀnder vi inte sÄ mÄnga program i vÄr vardag. WebblÀsaren, terminalen, IDE, nÄgon meddelandeapp, filhanteraren, kalkylatorn och, kanske, det Àr i stort sett allt. Man behöver inte sÄ mÄnga tangentkombinationer för att tÀcka 95% av de dagliga uppgifterna.

För program som har flera öppna fönster kan ett av dem göras till huvudfönster. Till exempel, flera öppna fönster av IntelliJ Idea kan tilldelas till Alt+E. Under normala omstÀndigheter, nÀr man trycker pÄ Alt+E kommer ett fönster av det aktuella programmet att öppnas, troligen det som öppnades först. Men om man trycker pÄ Alt+E NÀr ett av fönstren i detta program redan Àr i fokus kommer just det fönstret att tilldelas som huvudfönster och fokus kommer att överföras dit vid efterföljande tangentkombinationer.

Det gĂ„r att omdisponera huvudfönstret. För att göra det mĂ„ste du först Ă„terstĂ€lla tangentkombinationen och sedan tilldela ett annat fönster som huvudfönster. För att Ă„terstĂ€lla tangentkombinationen, tryck först pĂ„ sjĂ€lva kombinationen och sedan pĂ„ den speciella Ă„terstĂ€llningstangentkombinationen, som för mig Ă€r tilldelad till Alt+Backspace. Det kommer att köra ett skript som tar bort tilldelningen av huvudfönstret för den tidigare kombinationen. DĂ€refter kan du tilldela ett nytt huvudfönster som beskrivits i föregĂ„ende stycke. ÅterstĂ€llningen av det kopplade fönstret till universella kombinationer sker pĂ„ samma sĂ€tt.

Introduktionen blev lÄng, men jag ville först berÀtta vad vi ska göra och sedan förklara hur man gör det.

För dem som Àr trötta pÄ att lÀsa

Kort sagt, lÀnken till skripten finns i slutet av artikeln.

Men det gÄr inte att installera och anvÀnda direkt. Du mÄste först förstÄ hur skriptet hittar det önskade fönstret. Utan detta kan du inte ange för skriptet vart fokus verkligen ska överföras. Och du mÄste förstÄ vad du ska göra om det plötsligt inte finns nÄgot lÀmpligt fönster.

Och jag kommer inte att fokusera pĂ„ hur man stĂ€ller in körningen av skript genom att trycka pĂ„ tangentkombinationer. Till exempel i KDE gĂ„r detta i SysteminstĂ€llningar → TangentbordsgenvĂ€gar → Anpassade genvĂ€gar. I andra fönsterhanterare borde det ocksĂ„ finnas nĂ„got liknande.

Introduktion till wmctrl

Wmctrl Àr ett kommandoradsverktyg för att interagera med X Window Manager. Det Àr det centrala programmet för skriptet. LÄt oss snabbt titta pÄ hur man kan anvÀnda det.

För att börja, lÄt oss visa en lista över öppna fönster:

$ wmctrl -lx
0x01e0000e -1 plasmashell.plasmashell             N/A Skrivbord — Plasma
0x01e0001e -1 plasmashell.plasmashell             N/A Plasma
0x03a00001  0 skype.Skype                         N/A Skype
0x04400003  0 Navigator.Firefox                   N/A Google ÖversĂ€tt - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A BÀsta publiceringar under dagen / Habr - Mozilla Firefox (Privat webblÀsning)
...

Alternativ -l visar en lista över alla öppna fönster, och -x lÀgger till klassnamnet till listan (skype.Skype, Navigator.Firefox osv). Vi behöver fönstrets id (kolumn 1), klassnamnet (kolumn 3) och fönstrets namn (den sista kolumnen).

Du kan prova att aktivera ett fönster med hjÀlp av alternativet -a:

$ wmctrl -a skype.Skype -x

Om allt gĂ„r enligt planen ska Skype-fönstret dyka upp pĂ„ skĂ€rmen. Om du istĂ€llet anvĂ€nder alternativet -x anvĂ€nd istĂ€llet alternativet -i, sĂ„ istĂ€llet för klassnamnet kan du ange fönstrets id. Problemet med id Ă€r att fönstrets id Ă€ndras varje gĂ„ng applikationen startas, och vi kan inte veta det i förvĂ€g. Å andra sidan identifierar denna attribut entydigt fönstret, vilket kan vara viktigt nĂ€r applikationen öppnar mer Ă€n ett fönster. Mer om detta senare.

Vid det hÀr steget mÄste vi komma ihÄg att vi ska söka efter rÀtt fönster med hjÀlp av regex i utdata wmctrl -lx. Men det betyder inte att vi nödvÀndigtvis mÄste anvÀnda nÄgot komplicerat. Oftast rÀcker det med fönstrets klassnamn eller titel.

I princip borde huvudidén redan vara klar. I instÀllningarna för globala genvÀgar för din fönsterhanterare stÀller vi in den önskade kombinationen för att köra skriptet.

Hur man anvÀnder skript

Först mÄste du installera konsolprogram wmctrl och xdotool:

$ sudo apt-get install wmctrl xdotool

DÀrefter mÄste du ladda ner skripten och lÀgga till dem i $PATH. Jag brukar lÀgga dem i ~/bin:

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

Om katalogen ~/bin inte existerade, sÄ mÄste den skapas och du mÄste starta om (eller logga ut och in igen), annars ~/bin kommer inte att hamna i $PATH. Om allt Àr gjort korrekt, bör skripten vara tillgÀngliga frÄn konsolen och autocomplete med Tab bör fungera.

Huvudskriptet showwin tar emot 2 parametrar: den första Àr regex som vi ska anvÀnda för att söka efter det önskade fönstret, och den andra parametern Àr kommandot som ska köras om det önskade fönstret inte hittades.

Du kan försöka köra skriptet, till exempel:

$ showwin "Mozilla Firefox$" firefox

Om Firefox Ă€r installerat, bör fokus ges till dess fönster. Även om Firefox inte har körts, bör det startas.

Om det lyckades, kan du försöka stÀlla in körning av kommandon för kombinationer. I instÀllningarna för globala genvÀgar lÀgger vi till:

  • 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

Och sÄ vidare. Var och en kan stÀlla in sina egna tangentkombinationer och program som de önskar.
Om allt Àr korrekt stÀllt in, bör vi enkelt kunna vÀxla mellan fönster med de angivna kombinationerna.

Jag kommer att göra besvikna Àlskare av Chrome: normala fönster kan sÀrskiljas frÄn inkognitofönster via utdata wmctrl Det gÄr inte, de har samma klassnamn och fönstertitlar. De föreslagna regex-tecknen N* och I* behövs bara för att göra dessa reguljÀra uttryck olika frÄn varandra sÄ att olika fönster kan tilldelas som primÀra.

För att ÄterstÀlla huvudfönstret frÄn den föregÄende kombinationen (i praktiken för regex, som showwin anvÀndes senast) mÄste scriptet anropas. showwinDetach. Jag har detta script tilldelat en tangentkombination. Alt+Backspace.

Scriptet showwin har en annan funktion. NÀr det anropas med ett enda parameter (i det hÀr fallet Àr parametern bara ett identifieringsnummer), kontrollerar det inte regex alls, utan anser att alla fönster Àr lÀmpliga. I sig sjÀlv verkar detta onödigt, men pÄ sÄ sÀtt kan vi tilldela vilket fönster som helst som primÀrt och snabbt vÀxla till just det fönstret.

Jag har stÀllt in följande kombinationer:

  • Alt+1: showwin «CustomKey1»
  • Alt+2: showwin «CustomKey2»
  • 

  • Alt+0: showwin «CustomKey0»
  • Alt+Backspace: showwinDetach

SĂ„ledes kan jag knyta vilka fönster som helst till kombinationerna. Alt+1
Alt+0Genom att helt enkelt trycka pĂ„ Alt+1 binder jag det aktuella fönstret till denna kombination. Jag kan avbinda genom att trycka pĂ„ Alt+1, och klicka sedan Alt+Backspace. Eller stĂ€nga fönstret, det fungerar ocksĂ„.

Sedan berÀttar jag lite tekniska detaljer. De behöver inte lÀsas, bara prova att stÀlla in och se. Men jag skulle ÀndÄ rekommendera att förstÄ andras skript innan man kör dem pÄ sin dator :).

Hur man sÀrskiljer olika fönster av samma applikation

I princip var det allra första exemplet «wmctrl -a skype.Skype -x» fungerande och kan anvÀndas. Men lÄt oss ta en titt pÄ exemplet med Firefox, dÀr tvÄ fönster Àr öppna:

0x04400003  0 Navigator.Firefox                   N/A Google Translate - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A BÀsta inlÀgg pÄ ett dygn / Habr - Mozilla Firefox (Privat surfning)

Det första fönstret Àr vanligt lÀge, och det andra Àr Privat surfning. Dessa fönster skulle vilja betraktas som olika applikationer och vÀxla mellan dem med olika tangentkombinationer.

Det behövs en mer avancerad script för att vÀxla mellan fönster. Jag anvÀnde en sÄdan lösning: skriv ut listan över alla fönster, gör grep med regex, ta den första raden med hjÀlp av head, hÀmta den första kolumnen (detta blir fönstrets id) med hjÀlp av cut, vÀxla till fönstret efter id.

Det borde finnas ett skÀmt om reguljÀra uttryck och tvÄ problem, men i praktiken anvÀnder jag inget komplicerat. Jag behöver regex för att kunna ange slutet av raden (tecknet «$») och sÀrskilja «Mozilla Firefox$» frÄn «Mozilla Firefox (Privat surfning)$».

Teamet ser ungefÀr ut sÄ hÀr:

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

HÀr kan man redan gissa den andra egenskapen hos skriptet: om grep inte ger nÄgot resultat, betyder det att det önskade programmet inte Àr öppet och att man mÄste starta det genom att utföra kommandot frÄn den andra parametern. Och sedan kontrollera regelbundet om det önskade fönstret har öppnat sig, sÄ att man kan ge det fokus. Jag ska inte gÄ in pÄ detaljer kring detta, de som behöver kan titta pÄ kÀllkoden.

NÀr applikationens fönster Àr oskiljaktiga

SÄ, vi har lÀrt oss att ge fokus till det önskade applikationsfönstret. Men vad hÀnder om mer Àn ett fönster för applikationen Àr öppet? Vilket av dem ska fÄ fokus? Skriptet ovan kommer förmodligen att ge fokus till det första öppna fönstret. Men vi skulle vilja ha mer flexibilitet. Vi vill kunna komma ihÄg vilket fönster vi egentligen behöver och vÀxla till just det fönstret.

Idén var följande: Om vi vill komma ihÄg ett visst fönster för en tangentkombination, mÄste vi trycka pÄ denna kombination nÀr det önskade fönstret Àr i fokus. Vid framtida tryckningar pÄ denna kombination kommer fokus att ges just till det fönstret. SÄ lÀnge fönstret inte stÀngs eller vi inte gör en ÄterstÀllning för denna tangentkombination av skriptet. showwinDetach.

Skriptets algoritm showwin ser ungefÀr ut sÄ hÀr:

  • Kontrollera om vi tidigare har kommit ihĂ„g id:t för fönstret som vi behöver ge fokus.
    Om vi har kommit ihÄg och sÄdant fönster fortfarande existerar, ger vi fokus till det och avslutar.
  • Vi kollar vilket fönster som just nu har fokus, och om det passar vĂ„r förfrĂ„gan, kommer vi att komma ihĂ„g dess id för att gĂ„ till det senare och avsluta.
  • Vi gĂ„r över till nĂ„got lĂ€mpligt fönster om det existerar eller öppnar det nödvĂ€ndiga programmet.

För att ta reda pÄ vilket fönster som just nu har fokus kan man anvÀnda konsolverktyget xdotool, genom att omvandla dess utdata till hexadecimalt format:

$ printf "0xx" `xdotool getwindowfocus`

Att komma ihÄg nÄgot i bash Àr enklast genom att skapa filer i ett virtuellt filsystem som finns i minnet. I Ubuntu Àr detta standardkopplat i /dev/shm/. Jag kan inte sÀga nÄgot om andra distributioner, men jag hoppas att nÄgot liknande ocksÄ finns. Man kan titta med kommandot:

$ mount -l | grep tmpfs

Skriptet kommer att skapa tomma kataloger i denna mapp, sÄdana hÀr: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Dessutom kommer det vid varje anrop att skapa en symlink /dev/shm/$USER/showwin/showwin_last till /dev/shm/$USER/showwin/$SEARCH_REGEX. Detta kommer att behövas för att vid behov ta bort id:t för fönstret för en viss tangentkombination med hjÀlp av skriptet. showwinDetach.

Vad som kan förbÀttras

För det första mÄste skripten stÀllas in manuellt. Sannolikt, pÄ grund av behovet att sÀtta sig in i och göra mycket för hand, sÄ mÄnga av er kanske inte ens provar att stÀlla in systemet. Om det fanns en möjlighet att bara installera ett paket och enkelt konfigurera allt, sÄ skulle det kanske fÄ viss popularitet. DÄ kanske det Àven skulle inkluderas i standarddistributioner.

Och, kanske kan det göras enklare. Om man kan ta reda pÄ processens ID genom fönstrets ID, och frÄn processens ID ta reda pÄ vilket kommando som skapade det, sÄ skulle man kunna automatisera instÀllningarna. Egentligen har jag inte undersökt om det jag skrev i detta stycke Àr möjligt. Det handlar om att jag personligen Àr nöjd med hur det fungerar just nu. Men om nÄgon annan Àn jag skulle tycka att tillvÀgagÄngssÀttet Àr bekvÀmt och nÄgra förbÀttrar det, sÄ skulle jag gÀrna anvÀnda den bÀsta lösningen.

Ett annat problem, som jag redan har nĂ€mnt, Ă€r att i vissa fall gĂ„r det inte att sĂ€rskilja fönster frĂ„n varandra. Jag har hittills sett detta endast med inkognito-lĂ€get i chrome/chromium, men kanske finns det liknande nĂ„gon annanstans. I vĂ€rsta fall finns alltid alternativet med universella kortkommandon. Alt+1
Alt+0. Återigen, jag anvĂ€nder Firefox och för mig Ă€r detta problem inte av stor betydelse.

Men ett betydande problem för mig Ă€r att jag arbetar med Mac OS och dĂ€r kunde jag inte stĂ€lla in nĂ„got liknande. Jag lyckades tydligen installera verktyget, men det fungerar knappt pĂ„ Mac OS. Man kan göra nĂ„got med applikationen wmctrl , men det laggar sĂ„ mycket att det Ă€r obekvĂ€mt att anvĂ€nda, Ă€ven nĂ€r det fungerar. Jag har inte heller lyckats stĂ€lla in kortkommandon sĂ„ att de fungerar i alla program. Om nĂ„gon kommer pĂ„ en lösning — skulle jag vara glad att anvĂ€nda den. AutomatorDet blev ovĂ€ntat mĂ„nga ord för en sĂ„, till synes, enkel funktionalitet. Jag ville förmedla idĂ©n utan att överbelasta texten, men jag har fortfarande inte kommit pĂ„ hur jag ska berĂ€tta enklare. Kanske skulle det vara bĂ€ttre i videoformat, men det Ă€r inte sĂ„ populĂ€rt hĂ€r.

Avslutande

Jag har berÀttat lite om vad som finns under huven pÄ skriptet och hur man stÀller in det. Jag har inte gÄtt in i detaljer kring sjÀlva skriptet, men det Àr bara 50 rader, sÄ det Àr inte svÄrt att förstÄ.

Jag berÀttade lite om vad som finns under huven pÄ skriptet och hur man stÀller in det. Jag gick inte in pÄ detaljer om sjÀlva skriptet, men det Àr bara 50 rader, sÄ det Àr inte svÄrt att förstÄ.

Jag hoppas att nÄgon annan testar den hÀr idén och kanske till och med uppskattar den. Personligen kan jag sÀga att skriptet skrevs för cirka 3 Är sedan och det Àr MYCKET praktiskt för mig. SÄ praktiskt att det skapar en allvarlig obehagskÀnsla nÀr jag arbetar pÄ andras datorer. Och med min arbets-MacBook.

LĂ€nk till skripten

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster