Alternativ vinduesstyring i Linux

Jeg er en af ​​dem, der sætter Caps Lock til at skifte layout, fordi jeg er for doven til at trykke på 2 taster, når jeg kan trykke på en. Jeg vil endda gerne have 2 unødvendige nøgler: Jeg ville bruge den ene til at slå det engelske layout til, og den anden til russisk. Men den anden unødvendige nøgle er at kalde kontekstmenuen frem, som er så unødvendig, at den bliver skåret ud af mange bærbare producenter. Så du skal være tilfreds med det, du har.

Og jeg vil heller ikke lede efter deres ikoner på proceslinjen, når jeg skifter vinduer, eller fange navnene, når jeg scroller igennem Alt + Tab, scroll gennem skriveborde osv. Jeg vil trykke på en tastekombination (ideelt set kun én, men der er ingen ledige unødvendige taster længere) og straks komme til det vindue, jeg har brug for. For eksempel sådan her:

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

Desuden ved at trykke på f.eks Alt+M Jeg vil gerne se lommeregneren, uanset om dette program kører i øjeblikket. Hvis det kører, så skal dets vindue have fokus, og hvis ikke, kør det ønskede program og overfør fokus, når det indlæses.

For sager, der ikke er dækket af det tidligere script, ønsker jeg at have universelle tastekombinationer, der nemt kan tildeles til ethvert af de åbne vinduer. For eksempel har jeg 10 kombinationer tildelt fra Alt + 1 til Alt + 0, som ikke er bundet til nogen programmer. Jeg kan bare klikke Alt + 1 og det vindue, der i øjeblikket er i fokus, vil få fokus, når der klikkes på det Alt + 1.

Under snittet er der en beskrivelse af et par funktioner mere og et svar på, hvordan dette kan gøres. Men jeg vil straks advare dig om, at en sådan tilpasning "til dig selv" kan forårsage alvorlig afhængighed og endda tilbagetrækning, hvis du skal bruge Windows, Mac OS eller endda en andens computer med Linux.

Faktisk, hvis du tænker over det, bruger vi ikke så mange programmer til daglig. En browser, en terminal, en IDE, en slags messenger, en filhåndtering, en lommeregner og måske det er næsten alt. Der er ikke mange tastekombinationer, der skal til for at dække 95 % af hverdagens opgaver.

For programmer, der har flere åbne vinduer, kan et af dem udpeges som det primære. For eksempel har du flere IntelliJ Idea-vinduer åbne og tildelt Alt + E. Under normale forhold, når du trykker Alt + E et vindue i dette program vil åbne, højst sandsynligt det, der blev åbnet først. Men hvis du klikker på Alt + E når et af vinduerne i dette program allerede er i fokus, så vil dette særlige vindue blive tildelt som det primære, og det vil være det, der vil blive givet fokus, når der trykkes på efterfølgende kombinationer.

Hovedvinduet kan omtildeles. For at gøre dette skal du først nulstille kombinationen og derefter tildele et andet vindue til det som hovedvindue. For at nulstille en kombination skal du trykke på selve kombinationen, og derefter en speciel nulstillingskombination, jeg har den tildelt Alt+Tilbage. Dette kalder et script, der fjerner tildelingen af ​​hovedvinduet for den forrige kombination. Og så kan du tildele et nyt hovedvindue som beskrevet i forrige afsnit. Nulstilling af et linket vindue til universelle kombinationer sker på samme måde.

Indledningen viste sig at være lang, men jeg ville først fortælle, hvad vi vil gøre, og derefter forklare, hvordan man gør det.

For dem, der er trætte af at læse

Kort sagt, linket til scripts er i slutningen af ​​artiklen.

Men du vil stadig ikke være i stand til at installere og bruge det med det samme. Du skal først finde ud af, hvordan scriptet finder det ønskede vindue. Uden dette vil det ikke være muligt at fortælle manuskriptet, hvor præcist fokus skal flyttes. Og du skal forstå, hvad du skal gøre, hvis der pludselig ikke findes et passende vindue.

Og jeg vil ikke fokusere på, hvordan man konfigurerer udførelsen af ​​scripts ved at trykke på tastekombinationer. For eksempel, i KDE er det i Systemindstillinger → Genveje → Brugerdefinerede genveje. Dette burde også være tilfældet i andre vinduesadministratorer.

Introduktion til wmctrl

Wmctrl — konsolværktøj til at interagere med X Window Manager. Dette er nøgleprogrammet til scriptet. Lad os tage et hurtigt kig på, hvordan du kan bruge det.

Lad os først vise en liste over åbne vinduer:

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

valgmulighed -l viser en liste over alle åbne vinduer, og -x tilføjer klassenavnet til output (skype.Skype, Navigator.Firefox etc). Her skal vi bruge vindues-id (kolonne 1), klassenavn (kolonne 3) og vinduesnavn (sidste kolonne).

Du kan prøve at aktivere et eller andet vindue ved hjælp af indstillingen -a:

$ wmctrl -a skype.Skype -x

Hvis alt gik efter planen, skulle Skype-vinduet vises på skærmen. Hvis i stedet for muligheden -x brug mulighed -i, så kan du i stedet for klassenavnet angive vindues-id'et. Problemet med id er, at vindues-id'et ændres hver gang applikationen startes, og vi kan ikke vide det på forhånd. På den anden side identificerer denne attribut entydigt et vindue, hvilket kan være vigtigt, når et program åbner mere end ét vindue. Mere om dette lidt længere.

På dette stadium skal vi huske, at vi vil søge efter det ønskede vindue ved hjælp af regex ved output wmctrl -lx. Men det betyder ikke, at vi skal bruge noget kompliceret. Normalt er klassenavnet eller vinduesnavnet tilstrækkeligt.

Grundlæggende burde hovedideen allerede være klar. I de globale genvejstaster/genvejsindstillinger for din vinduesmanager skal du konfigurere den nødvendige kombination til at udføre scriptet.

Sådan bruger du scripts

Først skal du installere konsolværktøjer wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Dernæst skal du downloade scripts og tilføje dem til $ PATH. Jeg plejer at sætte dem ind ~/bin:

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

Hvis mappen ~/bin ikke var der, så skal du oprette den og genstarte (eller logge på igen), ellers ~/bin vil ikke ramme $ PATH. Hvis alt er gjort korrekt, så skal scripts være tilgængelige fra konsollen, og Tab-fuldførelse bør fungere.

Hovedskrift showwin tager 2 parametre: den første er et regex, hvorved vi vil søge efter det krævede vindue, og den anden parameter er en kommando, der skal udføres, hvis det krævede vindue ikke findes.

Du kan prøve at køre et script, for eksempel:

$ showwin "Mozilla Firefox$" firefox

Hvis Firefox er installeret, skal dets vindue have fokus. Selvom Firefox ikke kørte, burde den være startet.

Hvis det virker, kan du prøve at konfigurere udførelsen af ​​kommandoer på kombinationer. I de globale genvejstaster/genvejsindstillinger tilføj:

  • Alt+F: showwin "Mozilla Firefox$" firefox
  • Alt+D: showwin "Mozilla Firefox (Privat browsing)$" "firefox -privat-vindue"
  • 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

Osv. Alle kan konfigurere tastekombinationer og software, som det passer dem.
Hvis alt fungerede korrekt, vil vi ved hjælp af ovenstående kombinationer være i stand til at skifte mellem vinduer ved blot at trykke på tasterne.

Jeg vil skuffe kromelskere: det kan inkognito skelne et almindeligt vindue ved dets output wmctrl Det kan du ikke, de har de samme klassenavne og vinduestitler. I det foreslåede regex er tegnene N* og I* kun nødvendige for at disse regulære udtryk adskiller sig fra hinanden, og de kan tildeles som hovedvinduer.

For at nulstille hovedvinduet for den forrige kombination (faktisk for regex, som showwin ringede sidste gang), skal du ringe til scriptet showwinDetach. Jeg har dette script tildelt en tastekombination Alt+Tilbage.

Ved manuskriptet showwin der er en funktion mere. Når den kaldes med én parameter (i dette tilfælde er parameteren kun en identifikator), tjekker den slet ikke regexet, men anser alle vinduer for at være egnede. I sig selv virker dette ubrugeligt, men på denne måde kan vi udpege et hvilket som helst vindue som det primære og hurtigt skifte til det pågældende vindue.

Jeg har konfigureret følgende kombinationer:

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

På denne måde kan jeg binde alle vinduer til kombinationer Alt + 1...Alt + 0. Bare ved at klikke Alt + 1 Jeg binder det aktuelle vindue til denne kombination. Jeg kan annullere bindingen ved at klikke Alt + 1og derefter Alt+Tilbage. Eller luk vinduet, det virker også.

Dernæst vil jeg fortælle dig nogle tekniske detaljer. Du behøver ikke at læse dem, men prøv bare at sætte dem op og se. Men jeg vil stadig anbefale at du forstår andres scripts, før du kører dem på din computer :).

Hvordan man skelner mellem forskellige vinduer i samme applikation

I princippet virkede det allerførste eksempel "wmctrl -a skype.Skype -x" og kan bruges. Men lad os se igen på eksemplet med Firefox, hvor 2 vinduer er åbne:

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

Det første vindue er i normal tilstand, og det andet er Privat browsing. Jeg vil gerne betragte disse vinduer som forskellige applikationer og skifte til dem ved hjælp af forskellige tastekombinationer.

Det er nødvendigt at komplicere scriptet, der skifter vinduer. Jeg brugte denne løsning: vis en liste over alle vinduer, gør grep ved regex, tag den første linje med hoved, få den første kolonne (dette vil være vindues-id'et) ved hjælp af skære, skift til vindue efter id.

Der burde være en joke om regulære udtryk og to problemer, men faktisk bruger jeg ikke noget kompliceret. Jeg har brug for regulære udtryk, så jeg kan angive slutningen af ​​linjen ("$"-symbolet) og skelne "Mozilla Firefox$" fra "Mozilla Firefox (Privat browsing)$".

Kommandoen ser nogenlunde sådan ud:

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

Her kan du allerede gætte om den anden funktion i scriptet: hvis grep ikke returnerer noget, er den ønskede applikation ikke åben, og du skal starte den ved at udføre kommandoen fra den anden parameter. Og kontroller derefter med jævne mellemrum, om det ønskede vindue er åbnet for at overføre fokus til det. Jeg vil ikke fokusere på dette; enhver, der har brug for det, vil se på kilderne.

Når programvinduer ikke kan skelnes

Så vi har lært, hvordan man overfører fokus til vinduet i den ønskede applikation. Men hvad hvis et program har mere end ét vindue åbent? Hvilken skal jeg fokusere på? Scriptet ovenfor vil højst sandsynligt overføres til det første åbne vindue. Vi vil dog gerne have mere fleksibilitet. Jeg vil gerne kunne huske hvilket vindue vi skal bruge og skifte til netop det vindue.

Ideen var denne: Hvis vi vil huske et bestemt vindue for en tastekombination, så skal vi trykke på denne kombination, når det ønskede vindue er i fokus. Når du i fremtiden trykker på denne kombination, vil fokus blive givet til dette vindue. Indtil vinduet lukker, eller vi nulstiller denne scriptkombination showwinDetach.

Script algoritme showwin noget som dette:

  • Tjek, om vi tidligere har husket id'et for vinduet, som fokus skal overføres til.
    Hvis du husker det, og et sådant vindue stadig eksisterer, så overfører vi fokus til det og afslutter.
  • Vi ser på hvilket vindue der er i fokus i øjeblikket, og hvis det matcher vores anmodning, så husk dets id for at gå til det i fremtiden og afslutte.
  • Vi går til i det mindste et passende vindue, hvis det findes, eller åbner det ønskede program.

Du kan finde ud af, hvilket vindue der i øjeblikket er i fokus ved at bruge xdotool-konsolværktøjet ved at konvertere dets output til hexadecimalt format:

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

Den nemmeste måde at huske noget på i bash er at oprette filer i et virtuelt filsystem placeret i hukommelsen. I Ubuntu er dette aktiveret som standard i /dev/shm/. Jeg kan ikke sige noget om andre distributioner, jeg håber, at der også er noget lignende. Du kan se med kommandoen:

$ mount -l | grep tmpfs

Scriptet vil oprette tomme mapper i denne mappe, sådan her: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Hver gang den kaldes vil den desuden skabe et symbollink /dev/shm/$USER/showwin/showwin_last/dev/shm/$USER/showwin/$SEARCH_REGEX. Dette vil være nødvendigt for om nødvendigt at fjerne vindues-id'et for en bestemt kombination ved hjælp af et script showwinDetach.

Hvad kan forbedres

For det første skal scripts konfigureres manuelt. Sikkert, på grund af behovet for at dykke ned i og gøre meget med dine hænder, vil mange af jer ikke engang forsøge at konfigurere systemet. Hvis det var muligt blot at installere pakken og konfigurere alt lettere, så ville det måske vinde en vis popularitet. Og se så, applikationen ville blive frigivet til standarddistributioner.

Og måske kan det gøres nemmere. Hvis du ved id'et af et vindue kan finde ud af id'et for den proces, der har oprettet det, og ved id'et for processen kan du finde ud af, hvilken kommando der oprettede det, så ville det være muligt at automatisere opsætningen. Faktisk forstod jeg ikke, om det, jeg skrev i dette afsnit, var muligt. Faktum er, at jeg personligt er tilfreds med den måde, det fungerer på nu. Men hvis en anden end mig finder hele tilgangen bekvem, og nogen forbedrer den, så vil jeg med glæde bruge en bedre løsning.

Et andet problem, som jeg allerede har skrevet, er, at vinduerne i nogle tilfælde ikke kan skelnes fra hinanden. Indtil videre har jeg kun observeret dette med inkognito i krom/krom, men måske er der noget lignende et andet sted. Som en sidste udvej er der altid mulighed for universelle kombinationer Alt + 1...Alt + 0. Igen bruger jeg Firefox, og for mig personligt er dette problem ikke væsentligt.

Men det væsentlige problem for mig er, at jeg bruger Mac OS til arbejde, og jeg kunne ikke konfigurere sådan noget der. nytte wmctrl Jeg tror, ​​jeg var i stand til at installere det, men det virker ikke rigtig på Mac OS. Der kan gøres noget med applikationen Automator, men den er så langsom, at den ikke er praktisk at bruge, selv når den virker. Jeg kunne heller ikke sætte tastekombinationer op, så de virkede i alle programmer. Hvis nogen pludselig kommer med en løsning, vil jeg med glæde bruge den.

I stedet for en konklusion

Det viste sig at være et uventet stort antal ord for sådan en tilsyneladende simpel funktionalitet. Jeg ønskede at formidle ideen og ikke overbelaste teksten, men jeg har endnu ikke fundet ud af, hvordan jeg skal fortælle det mere enkelt. Måske ville det være bedre i videoformat, men folk kan ikke lide det på den måde her.

Jeg talte lidt om, hvad der er under scriptet, og hvordan man konfigurerer det. Jeg gik ikke i detaljer med selve manuskriptet, men det er kun på 50 linjer, så det er ikke svært at forstå.

Jeg håber, at en anden vil prøve denne idé og måske endda sætte pris på den. Jeg kan sige om mig selv, at manuskriptet blev skrevet for omkring 3 år siden, og det er MEGET bekvemt for mig. Så praktisk, at det forårsager alvorligt ubehag, når du arbejder med andres computere. Og med en fungerende MacBook.

Link til scripts

Kilde: www.habr.com

Tilføj en kommentar