Alternativ fönsterhantering i Linux

Jag är en av dem som ställer in Caps Lock för att byta layout eftersom jag är för lat för att trycka på två tangenter när jag kan trycka på en. Jag skulle till och med vilja ha två onödiga nycklar: jag skulle använda en för att aktivera den engelska layouten och den andra för ryska. Men den andra onödiga nyckeln är att ta fram snabbmenyn, som är så onödig att den klipps bort av många bärbara tillverkare. Så man får nöja sig med det man har.

Och jag vill inte heller leta efter deras ikoner i aktivitetsfältet när jag byter fönster, eller fånga namnen när jag bläddrar igenom Alt + Tab, bläddra igenom skrivbord, etc. Jag vill trycka på en tangentkombination (helst bara en, men det finns inga lediga onödiga nycklar längre) och omedelbart komma till fönstret jag behöver. Till exempel så här:

  • Alt+F: Firefox
  • Alt+D: Firefox (privat surfning)
  • Alt+T: Terminal
  • Alt+M: Kalkylator
  • Alt+E: IntelliJ-idé
  • etc.

Dessutom genom att trycka på till exempel på Alt+M Jag vill se kalkylatorn oavsett om det här programmet körs för närvarande. Om det körs måste dess fönster ges fokus, och om inte, kör önskat program och överför fokus när det laddas.

För fall som inte täcks av det tidigare skriptet vill jag ha universella tangentkombinationer som enkelt kan tilldelas till vilket som helst av de öppna fönstren. Till exempel har jag 10 kombinationer tilldelade från Alt + 1 до Alt + 0, som inte är knutna till några program. Jag kan bara klicka Alt + 1 och fönstret som för närvarande är i fokus kommer att få fokus när det klickas Alt + 1.

Under snittet finns en beskrivning av ytterligare ett par funktioner och ett svar på hur detta kan göras. Men jag kommer omedelbart att varna dig för att sådan anpassning "för dig själv" kan orsaka allvarligt beroende och till och med tillbakadragande om du behöver använda Windows, Mac OS eller till och med någon annans dator med Linux.

Faktum är att om du tänker efter så använder vi inte så många program dagligen. En webbläsare, en terminal, en IDE, någon slags budbärare, en filhanterare, en kalkylator och kanske det är nästan allt. Det behövs inte många tangentkombinationer för att täcka 95 % av vardagliga uppgifter.

För program som har flera fönster öppna kan ett av dem anges som det huvudsakliga. Till exempel har du flera IntelliJ Idea-fönster öppna och tilldelade till Alt + E. Under normala förhållanden, när du trycker Alt + E något fönster i detta program kommer att öppnas, troligen det som öppnades först. Men om du klickar på Alt + E när ett av fönstren i det här programmet redan är i fokus, kommer just detta fönster att tilldelas som huvudfönstret och det kommer att ges fokus när efterföljande kombinationer trycks ned.

Huvudfönstret kan tilldelas om. För att göra detta måste du först återställa kombinationen och sedan tilldela ett annat fönster som huvudfönster. För att återställa en kombination måste du trycka på själva kombinationen och sedan en speciell återställningskombination, jag har den tilldelad Alt + Backspace. Detta kommer att anropa ett skript som tar bort tilldelningen av huvudfönstret för den tidigare kombinationen. Och sedan kan du tilldela ett nytt huvudfönster enligt beskrivningen i föregående stycke. Återställning av ett länkat fönster till universella kombinationer sker på samma sätt.

Inledningen blev lång, men jag ville först berätta vad vi ska göra och sedan förklara hur man gör.

För dig som är trött på att läsa

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

Men du kommer fortfarande inte att kunna installera och använda den direkt. Du måste först ta reda på hur skriptet hittar det önskade fönstret. Utan detta kommer det inte att vara möjligt att berätta för manuset var exakt fokus behöver flyttas. Och du måste förstå vad du ska göra om ett lämpligt fönster plötsligt inte hittas.

Och jag kommer inte att fokusera på hur man konfigurerar körningen av skript genom att trycka på tangentkombinationer. Till exempel, i KDE är det i Systeminställningar → Genvägar → Anpassade genvägar. Detta bör även vara fallet i andra fönsterhanterare.

Vi presenterar wmctrl

Wmctrl — konsolverktyg för interaktion med X Window Manager. Detta är nyckelprogrammet för skriptet. Låt oss ta en snabb titt på hur du kan använda den.

Låt oss först visa en lista över öppna fönster:

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

alternativ -l visar en lista över alla öppna fönster, och -X lägger till klassnamnet till utdata (skype.Skype, Navigator.Firefox etc). Här behöver vi fönster-id (kolumn 1), klassnamn (kolumn 3) och fönsternamn (sista kolumn).

Du kan försöka aktivera något fönster med alternativet -a:

$ wmctrl -a skype.Skype -x

Om allt gick enligt plan bör Skype-fönstret visas på skärmen. Om istället för alternativet -x använda alternativet -i, då kan du istället för klassnamnet ange fönster-id. Problemet med id är att fönster-id ändras varje gång programmet startas och vi kan inte veta det i förväg. Å andra sidan identifierar detta attribut unikt ett fönster, vilket kan vara viktigt när ett program öppnar mer än ett fönster. Mer om detta lite längre.

I detta skede måste vi komma ihåg att vi kommer att söka efter det önskade fönstret med hjälp av regex genom utdata wmctrl -lx. Men det betyder inte att vi måste använda något komplicerat. Vanligtvis är klassnamnet eller fönsternamnet tillräckligt.

I grund och botten borde huvudtanken redan vara klar. I de globala inställningarna för snabbtangenter/genvägar för din fönsterhanterare, konfigurera den nödvändiga kombinationen för att köra skriptet.

Hur man använder skript

Först måste du installera konsolverktyg wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Därefter måste du ladda ner skripten och lägga till dem $ PATH. Jag brukar lägga in dem ~/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 fanns där, då måste du skapa den och starta om (eller logga in igen), annars ~/bin kommer inte att träffa $ PATH. Om allt är gjort på rätt sätt bör skripten vara tillgängliga från konsolen och flikkomplettering ska fungera.

Huvudmanus showwin tar 2 parametrar: den första är ett regex, genom vilket vi kommer att söka efter det önskade fönstret, och den andra parametern är ett kommando som måste köras om det önskade fönstret inte hittas.

Du kan prova att köra ett skript, till exempel:

$ showwin "Mozilla Firefox$" firefox

Om Firefox är installerat bör dess fönster ges fokus. Även om Firefox inte kördes borde den ha startat.

Om det fungerar kan du försöka konfigurera exekveringen av kommandon på kombinationer. I de globala inställningarna för snabbtangenter/genvägar lägg till:

  • Alt+F: showwin "Mozilla Firefox$" firefox
  • Alt+D: showwin "Mozilla Firefox (privat surfning)$" "firefox -privat-fönster"
  • 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

Etc. Alla kan konfigurera tangentkombinationer och programvara som de vill.
Om allt fungerade korrekt, kommer vi att med ovanstående kombinationer kunna växla mellan fönster genom att helt enkelt trycka på tangenterna.

Jag kommer att göra kromälskare besvikna: det kan inkognito särskilja ett vanligt fönster genom sin produktion wmctrl Det kan du inte, de har samma klassnamn och fönstertitlar. I det föreslagna regexet behövs tecknen N* och I* endast så att dessa reguljära uttryck skiljer sig från varandra och de kan tilldelas som huvudfönster.

För att återställa huvudfönstret för den tidigare kombinationen (faktiskt för regex, som showwin ringde förra gången) måste du ringa skriptet visawinKoppla av. Jag har det här skriptet tilldelat en tangentkombination Alt + Backspace.

Vid manuset showwin det finns en funktion till. När den anropas med en parameter (i detta fall är parametern bara en identifierare) kontrollerar den inte regexet alls, utan anser att alla fönster är lämpliga. I och för sig verkar detta värdelöst, men på så sätt kan vi utse vilket fönster som helst som huvudfönster och snabbt byta till just det fönstret.

Jag har följande kombinationer konfigurerade:

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

På så sätt kan jag binda alla fönster till kombinationer Alt + 1.Alt + 0. Bara genom att klicka Alt + 1 Jag binder det aktuella fönstret till denna kombination. Jag kan avbryta bindningen genom att klicka Alt + 1och då Alt + Backspace. Eller stäng fönstret, det fungerar också.

Härnäst kommer jag att berätta några tekniska detaljer. Du behöver inte läsa dem, utan försök bara ställa in dem och se. Men jag skulle ändå rekommendera att du förstår andras skript innan du kör dem på din dator :).

Hur man skiljer mellan olika fönster i samma applikation

I princip fungerade det allra första exemplet "wmctrl -a skype.Skype -x" och kan användas. Men låt oss titta igen på exemplet med Firefox, där två fönster är öppna:

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

Det första fönstret är normalt läge och det andra är Privat surfning. Jag skulle vilja betrakta dessa fönster som olika applikationer och byta till dem med olika tangentkombinationer.

Det är nödvändigt att komplicera skriptet som byter fönster. Jag använde den här lösningen: visa en lista över alla fönster, gör grep genom regex, ta första raden med huvud, hämta den första kolumnen (detta kommer att vara fönster-id) med klippa, växla till fönster efter id.

Det borde finnas ett skämt om reguljära uttryck och två problem, men jag använder faktiskt inget komplicerat. Jag behöver reguljära uttryck så att jag kan ange slutet av raden (symbolen "$") och skilja "Mozilla Firefox$" från "Mozilla Firefox (Privat surfning)$".

Kommandot ser ut ungefär så här:

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

Här kan du redan gissa om den andra funktionen i skriptet: om grep inte returnerar något, är den önskade applikationen inte öppen och du måste starta den genom att utföra kommandot från den andra parametern. Och kontrollera sedan med jämna mellanrum om det önskade fönstret har öppnats för att överföra fokus till det. Jag kommer inte att fokusera på detta; alla som behöver det kommer att titta på källorna.

När programfönster inte går att särskilja

Så vi har lärt oss hur man överför fokus till fönstret för den önskade applikationen. Men vad händer om ett program har mer än ett fönster öppet? Vilken ska jag fokusera på? Skriptet ovan kommer med största sannolikhet att överföras till det första öppna fönstret. Men vi skulle vilja ha mer flexibilitet. Jag skulle vilja kunna komma ihåg vilket fönster vi behöver och byta till just det fönstret.

Tanken var denna: Om vi ​​vill komma ihåg ett specifikt fönster för en tangentkombination, måste vi trycka på denna kombination när det önskade fönstret är i fokus. I framtiden, när du trycker på den här kombinationen, kommer fokus att ges till detta fönster. Tills fönstret stängs eller vi gör en återställning för denna skriptkombination visawinKoppla av.

Skriptalgoritm showwin något som det här:

  • Kontrollera om vi tidigare har kommit ihåg id för fönstret som fokus ska överföras till.
    Om du kommer ihåg och ett sådant fönster fortfarande finns, så överför vi fokus till det och avslutar.
  • Vi tittar på vilket fönster som för närvarande är i fokus, och om det matchar vår begäran, kom ihåg dess ID för att gå till det i framtiden och avsluta.
  • Vi går till åtminstone något lämpligt fönster om det finns eller öppnar önskat program.

Du kan ta reda på vilket fönster som för närvarande är i fokus med hjälp av xdotool-konsolverktyget genom att konvertera dess utdata till hexadecimalt format:

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

Det enklaste sättet att komma ihåg något i bash är att skapa filer i ett virtuellt filsystem som finns i minnet. I Ubuntu är detta aktiverat som standard i /dev/shm/. Jag kan inte säga något om andra distributioner, jag hoppas att det finns något liknande också. Du kan titta med kommandot:

$ mount -l | grep tmpfs

Skriptet kommer att skapa tomma kataloger i den här mappen, så här: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Varje gång den kallas kommer den dessutom att skapa en symbollänk /dev/shm/$USER/showwin/showwin_last/dev/shm/$USER/showwin/$SEARCH_REGEX. Detta kommer att behövas för att vid behov ta bort fönster-id för en viss kombination med hjälp av ett skript visawinKoppla av.

Vad kan förbättras

För det första måste skripten konfigureras manuellt. Säkert, på grund av behovet av att fördjupa sig i och göra mycket med händerna, kommer många av er inte ens försöka konfigurera systemet. Om det var möjligt att helt enkelt installera paketet och konfigurera allt enklare, kanske det skulle vinna lite popularitet. Och titta sedan, applikationen skulle släppas i standarddistributioner.

Och kanske kan det göras lättare. Om du genom ID för ett fönster kan ta reda på ID för processen som skapade det, och genom ID för processen kan du ta reda på vilket kommando som skapade det, då skulle det vara möjligt att automatisera installationen. Jag förstod faktiskt inte om det jag skrev i det här stycket var möjligt. Faktum är att jag personligen är nöjd med hur det fungerar nu. Men om någon annan än jag tycker att hela tillvägagångssättet är bekvämt och någon förbättrar det, så använder jag gärna en bättre lösning.

Ett annat problem, som jag redan skrivit, är att fönstren i vissa fall inte kan skiljas från varandra. Hittills har jag bara observerat detta med inkognito i krom/krom, men kanske finns det något liknande någon annanstans. Som en sista utväg finns det alltid möjlighet till universella kombinationer Alt + 1.Alt + 0. Återigen använder jag Firefox och för mig personligen är detta problem inte betydande.

Men det stora problemet för mig är att jag använder Mac OS för jobbet och jag kunde inte konfigurera något sådant där. verktyg wmctrl Jag tror att jag kunde installera det, men det fungerar inte riktigt på Mac OS. Något kan göras med applikationen Automator, men den är så långsam att den inte är bekväm att använda även när den fungerar. Jag kunde inte heller ställa in tangentkombinationer så att de fungerade i alla program. Om någon plötsligt kommer på en lösning, använder jag den gärna.

I stället för en slutsats

Det visade sig vara ett oväntat stort antal ord för en så till synes enkel funktionalitet. Jag ville förmedla idén och inte överbelasta texten, men jag har ännu inte kommit på hur jag ska berätta det enklare. Kanske skulle det vara bättre i videoformat, men folk gillar det inte på det sättet här.

Jag pratade lite om vad som finns under huven på skriptet och hur man konfigurerar det. Jag gick inte in på detaljer om själva manuset, men det är bara 50 rader, så det är inte svårt att förstå.

Jag hoppas att någon annan kommer att prova denna idé och kanske till och med uppskattar den. Jag kan säga om mig själv att manuset skrevs för ca 3 år sedan och det är MYCKET bekvämt för mig. Så bekvämt att det orsakar allvarliga obehag när man arbetar med andras datorer. Och med en fungerande MacBook.

Länk till manus

Källa: will.com

Lägg en kommentar