Jeg er en af dem, der sĂŠtter Caps Lock til skift af layout, fordi jeg er for doven til at trykke pĂ„ 2 taster, nĂ„r jeg kan klare mig med Ă©n. Jeg ville endda Ăžnske, at der var 2 unĂždvendige taster: en til at aktivere det engelske layout og den anden til det russiske. Men den anden unĂždvendige tast â det er genvejen til kontekstmenuen, som er sĂ„ unĂždvendig, at mange bĂŠrbare producenter fjerner den. SĂ„ jeg mĂ„ nĂžjes med det, jeg har.
Og jeg Þnsker heller ikke at lede efter ikonerne for vinduerne i proceslinjen, nÄr jeg skifter mellem dem, forsÞge at fange navne ved at scrolle gennem Alt+Tab, bladre igennem skrivebordene osv. Jeg vil gerne trykke pÄ en kombination af taster (ideelt set en enkelt, men der er ikke flere ledige unÞdvendige taster tilbage) og straks komme ind i 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 Idea
- osv.
Desuden, nÄr jeg for eksempel trykker pÄ Alt+M , vil jeg gerne se lommeregneren, uanset om programmet er Äbent eller ej. Hvis det er Äbent, skal vinduet have fokus, og hvis ikke, skal programmet startes og fokusoverfÞres, nÄr det er indlÊst.
Til de situationer, der ikke dÊkkes af det tidligere scenarie, vil jeg have universelle tastaturkombinationer, som let kan tildeles til ethvert Äbent vindue. For eksempel har jeg tildelt 10 kombinationer fra Alt+1 op til Alt+0, som ikke er bundet til nogen programmer. Jeg kan bare trykke pÄ Alt+1 og vinduet, der er i fokus, vil fÄ fokus, nÄr jeg trykker pÄ Alt+1.
Under artiklen er der en beskrivelse af et par flere funktioner og et svar pÄ, hvordan man kan gÞre det. Men jeg advarer straks om, at en sÄdan tilpasning 'til sig selv' kan skabe en stÊrk afhÊngighed og endda afvÊnning, nÄr man skal bruge Windows, Mac OS eller endda en fremmed computer med Linux.
Hvis man tÊnker over det, bruger vi ikke sÄ mange programmer i hverdagen. Browser, terminal, IDE, en eller anden messenger, filhÄndterer, lommeregner, og det er nÊsten det hele. Det krÊver ikke sÄ mange tastaturkombinationer for at dÊkke 95 % af de daglige opgaver.
For programmer med flere Äbne vinduer kan et af dem tildeles som primÊrt. For eksempel, hvis flere vinduer af IntelliJ Idea er Äbne, tildeles de til Alt+E. Under normale forhold, nÄr man trykker pÄ Alt+E der vil Äbnes et vindue fra det pÄgÊldende program, sandsynligvis det, der var Äbent fÞrst. Men hvis du klikker pÄ Alt+E nÄr et af vinduerne i det pÄgÊldende program allerede er i fokus, sÄ vil dette vindue blive tildelt som hovedvindue, og det vil modtage fokus ved de efterfÞlgende tryk pÄ kombinationen.
Hovedvinduet kan omassigneres. For at gÞre dette skal du fÞrst nulstille kombinationen og sÄ tildele et andet vindue som hovedvindue. For at nulstille kombinationen skal du trykke pÄ kombinationen selv og derefter pÄ en speciel nulstillingskombination, som jeg har tildelt til Alt+Backspace. Dette vil kalde et script, som annullerer tildelingen af hovedvinduet til den forrige kombination. Derefter kan du tildele et nyt hovedvindue, som beskrevet i det foregÄende afsnit. Nulstillingen af det knyttede vindue til universelle kombinationer foregÄr pÄ samme mÄde.
Indledningen blev lang, men jeg ville fĂžrst forklare, hvad vi vil gĂžre, og derefter hvordan man gĂžr det.
For dem, der er trĂŠtte af at lĂŠse
Kort sagt er linket til scripts nederst i artiklen.
Men selvom, vil du ikke kunne installere og bruge det straks. Du skal fÞrst forstÄ, hvordan scriptet finder det nÞdvendige vindue. Uden dette vil du ikke kunne angive, hvor fokus skal rettes hen. Og du skal forstÄ, hvad du skal gÞre, hvis det passende vindue ikke findes.
Og jeg vil ikke fokusere pĂ„, hvordan man indstiller udfĂžrelsen af scripts ved at trykke pĂ„ tastkombinationer. For eksempel i KDE er det i Systemindstillinger â Genveje â Brugerdefinerede genveje. Andre vinduesledere burde ogsĂ„ have noget lignende.
Introduktion til wmctrl
Wmctrl er et kommandolinjevÊrktÞj til interaktion med X Window Manager. Dette er det centrale program for scriptet. Lad os hurtigt se pÄ, hvordan man kan bruge det.
FÞrst skal vi 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 OversĂŠtter - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Bedste offentliggĂžrelser for dagen / Habr - Mozilla Firefox (Privat browsing)
...Mulighed -l viser en liste over alle Äbne vinduer, og -x tilfÞjer klassens navn til output (skype.Skype, Navigator.Firefox osv.). Vi har brug for vinduets id (kolonne 1), klassens navn (kolonne 3) og vinduets navn (den sidste kolonne).
Du kan prĂžve at aktivere et vindue ved hjĂŠlp af muligheden -a:
$ wmctrl -a skype.Skype -xHvis alt gik efter planen, skal Skype-vinduet vises pÄ skÊrmen. Hvis i stedet for muligheden -x bruge muligheden -i, kan du i stedet for klassens navn angive vinduets id. Problemet med id er, at vinduets id Êndrer sig ved hvert programstart, og vi kan ikke vide det pÄ forhÄnd. PÄ den anden side, angiver denne attribut entydigt vinduet, hvilket kan vÊre vigtigt, nÄr applikationen Äbner mere end ét vindue. Mere om dette senere.
PĂ„ dette tidspunkt skal vi huske, at vi vil sĂžge efter det Ăžnskede vindue ved hjĂŠlp af regex i outputtet wmctrl -lx. Men det betyder ikke, at vi nĂždvendigvis skal bruge noget kompliceret. Ofte er klassens navn eller vinduets titel tilstrĂŠkkeligt.
I princippet skal den grundlÊggende idé allerede vÊre klar. I indstillingerne for globale genvejstaster/shortcuts til din vinduesbehandler konfigurerer vi den Þnskede kombination til at kÞre scriptet.
SÄdan bruger du scripts
FĂžrst skal du installere kommandolinjevĂŠrktĂžjerne wmctrl og xdotool:
$ sudo apt-get install wmctrl xdotoolDernĂŠst skal du downloade scripts og tilfĂžje dem til $PATH. Jeg lĂŠgger dem normalt i ~\/bin:
$ cd ~\/bin
$ git clone https:\/\/github.com\/masyamandev\/Showwin-script.git
$ ln -s .\/Showwin-script\/showwin showwin
$ ln -s .\/Showwin-script\/showwinDetach showwinDetachHvis kataloget ~\/bin ikke eksisterede, skal det oprettes og genstartes (eller logges ind igen), ellers ~\/bin vil det ikke blive registreret i $PATH. Hvis alt er gjort korrekt, skal scriptsne vÊre tilgÊngelige fra konsollen og autoslutte ved at trykke pÄ Tab.
Hovedscriptet showwin modtager 2 parametre: den fĂžrste er regex, som vi vil bruge til at finde det Ăžnskede vindue, og den anden parameter er kommandoen, der skal udfĂžres, hvis det Ăžnskede vindue ikke blev fundet.
Du kan prĂžve at kĂžre scriptet for eksempel:
$ showwin "Mozilla Firefox$" firefoxHvis Firefox er installeret, skal fokus overfĂžres til dets vindue. Selv hvis Firefox ikke var startet, skal det starte.
Hvis det lykkes, kan du prÞve at konfigurere udfÞrelsen af kommandoer pÄ kombinationer. I indstillingerne for globale genvejstaster/shortcuts tilfÞjer vi:
- 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
Og sÄ videre. Hver kan konfigurere genvejstastkombinationer og software, som det passer dem.
Hvis alt er gjort korrekt, kan vi skifte mellem vinduer med de angivne kombinationer ved blot at trykke pÄ tasterne.
Jeg vil skuffe elskere af Chrome: et almindeligt vindue kan ikke skelnes fra inkognito-vinduet ud fra output. wmctrl Det er ikke muligt, da de har samme klasse navne og vinduestitler. I de foreslÄede regex er symbolerne N* og I* kun nÞdvendige for at adskille de forskellige regex'er fra hinanden, sÄ de kan tildeles forskellige hovedvinduer.
For at nulstille det primĂŠre vindue fra den tidligere kombination (faktisk for regex'en, som showwin blev kaldt sidst) skal du kalde scriptet showwinDetach. Jeg har dette script tildelt en tastekombination. Alt+Backspace.
Scriptet showwin har en funktion mere. NÄr det kaldes med et enkelt parameter (i dette tilfÊlde er parameteren blot et id), tjekker det slet ikke regex'en, men anser alle vinduer som passende. Dette virker mÄske uvÊsentligt, men pÄ denne mÄde kan vi tildele ethvert vindue som hovedvindue og hurtigt skifte til prÊcis dette vindue.
Jeg har indstillet sÄdanne kombinationer:
- Alt+1: showwin «CustomKey1»
- Alt+2: showwin «CustomKey2»
- âŠ
- Alt+0: showwin «CustomKey0»
- Alt+Backspace: showwinDetach
SĂ„ledes kan jeg knytte ethvert vindue til kombinationerne. Alt+1âŠAlt+0Ved blot at trykke Alt+1 binder jeg det aktuelle vindue til denne kombination. Jeg kan annullere bindingen ved at trykke Alt+1, og derefter Alt+Backspace. Eller lukke vinduet, det fungerer ogsĂ„.
Derudover vil jeg fortÊlle lidt om tekniske detaljer. De kan ignoreres, og man kan bare prÞve at indstille det og se. Men jeg vil alligevel anbefale at sÊtte sig ind i andres scripts, fÞr man kÞrer dem pÄ sin egen computer :).
Hvordan skelner man mellem forskellige vinduer af samme applikation
Som udgangspunkt var det fÞrste eksempel "wmctrl -a skype.Skype -x" funktionelt og kan anvendes. Men lad os kigge pÄ eksemplet med Firefox, hvor 2 vinduer er Äbne:
0x04400003 0 Navigator.Firefox N/A Google OversĂŠtter - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Bedste indlĂŠg i dĂžgnet / Habr - Mozilla Firefox (Privat browsing)Det fĂžrste vindue â almindelig tilstand, mens det andet â Privat browsing. Disse vinduer Ăžnsker man at betragte som forskellige applikationer og skifte mellem dem med forskellige tastekombinationer.
Det er nĂždvendigt at komplicere scriptet, der skifter mellem vinduer. Jeg brugte den lĂžsning: at udskrive en liste over alle vinduer, lave grep ved hjĂŠlp af regex, tage den fĂžrste linje med head, hente den fĂžrste kolonne (det vil vĂŠre vinduets id) med cut, skifte til vinduet efter id.
Her burde vĂŠre en joke om regulĂŠre udtryk og to problemer, men i virkeligheden bruger jeg ikke noget kompliceret. Jeg har brug for regulĂŠre udtryk for at kunne angive slutningen pĂ„ en linje (symbolet â$â) og skelne mellem âMozilla Firefox$â og âMozilla Firefox (Private Browsing)$â.
Kommandoen ser sÄdan ud:
$ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`Her kan man allerede gÊtte den anden egenskab ved scriptet: hvis grep ikke returnerer noget, betyder det, at den nÞdvendige applikation ikke er Äbnet, og den skal startes ved at udfÞre kommandoen fra det andet parameter. Og derefter tjekke periodisk, om det Þnskede vindue er Äbnet, sÄ fokus kan overfÞres til det. Jeg vil ikke gÄ nÊrmere ind i det, dem der har brug for det, kan se kildekoden.
NÄr applikationsvinduer ikke kan skelnes
SÄ vi har lÊrt at overfÞre fokus til vinduet for den Þnskede applikation. Men hvad hvis der er Äbnet mere end ét vindue for applikationen? Hvilket af dem skal vi overfÞre fokus til? Scriptet ovenfor vil sandsynligvis overfÞre fokus til det fÞrste Äbne vindue. Vi ville dog gerne have mere fleksibilitet. Det ville vÊre rart at kunne huske, hvilket specifikt vindue vi har brug for, og skifte til netop det vindue.
Ideen var sÄdan: Hvis vi vil huske et bestemt vindue for tastaturkombinationen, skal vi trykke pÄ denne kombination, nÄr det Þnskede vindue er i fokus. Fremover vil fokus blive givet til netop dette vindue, indtil vinduet lukkes, eller vi nulstiller denne kombination af scriptet. showwinDetach.
Algoritmen for scriptet showwin ser cirka sÄdan ud:
- Tjek, om vi tidligere har gemt id'et for det vindue, som fokus skal overfĂžres til.
Hvis vi har gemt det, og vinduet stadig eksisterer, sÄ overfÞrer vi fokus til det og afslutter. - Vi ser, hvilket vindue der lige nu er i fokus, og hvis det passer til vores forespÞrgsel, sÄ husker vi dets id for at kunne skifte til det senere og afslutter.
- Vi gÄr over til et passende vindue, hvis det eksisterer, eller Äbner den nÞdvendige applikation.
For at finde ud af, hvilket vindue der er i fokus nu, kan vi bruge konsolvĂŠrktĂžjet xdotool og omdanne dets output til hexadecimalt format:
$ printf "0xx" `xdotool getwindowfocus`At gemme noget i bash er nemmest ved at oprette filer i et virtuelt filsystem, der ligger i hukommelsen. I Ubuntu er dette som standard tilsluttet i /dev/shm/. Jeg kan ikke sige noget om andre distributioner, men jeg hÄber, at noget lignende ogsÄ findes. Du kan tjekke med kommandoen:
$ mount -l | grep tmpfsScriptet vil oprette tomme mapper i denne mappe, som disse: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Derudover vil det ved hver opkald oprette et symlink /dev/shm/$USER/showwin/showwin_last og fÄ en fungerende kommando. /dev/shm/$USER/showwin/$SEARCH_REGEX. Dette er nÞdvendigt for at kunne slette vinduets id for en bestemt kombination ved hjÊlp af scriptet showwinDetach.
Hvad kan forbedres
For det fÞrste skal scripts konfigureres manuelt. Sikkert pÄ grund af behovet for at sÊtte sig ind i og gÞre meget med hÄnden, vil mange af jer mÄske slet ikke prÞve at konfigurere systemet. Hvis der var mulighed for blot at installere en pakke og konfigurere det hele lettere, kunne det mÄske have opnÄet en vis popularitet. Og hvem ved, mÄske ville det endda blive inkluderet i de standard distributioner.
Og mĂ„ske kan det gĂžres nemmere. Hvis man kan finde ud af proces-idâet ud fra vinduets id, og derefter finde ud af hvilken kommando der skabte det ud fra proces-idâet, kunne man automatisere konfigurationen. Jeg har faktisk ikke undersĂžgt, om det jeg skrev i dette afsnit er muligt. Det er bare sĂ„dan, at jeg personligt er tilfreds med, hvordan det fungerer nu. Men hvis nogen ud over mig finder denne tilgang nyttig og forbedrer den, vil jeg gladly bruge den bedste lĂžsning.
Et andet problem, som jeg allerede har nĂŠvnt, er, at man nogle gange ikke kan skelne mellem vinduerne. Jeg har kun observeret dette med incognito i chrome/chromium, men mĂ„ske findes der lignende situationer andre steder. I vĂŠrste fald er der altid en mulighed for universelle kombinationer Alt+1âŠAlt+0. Igen, jeg bruger Firefox, og for mig er dette problem ikke vĂŠsentligt.
Men et betydeligt problem for mig er, at jeg arbejder pĂ„ Mac OS og ikke har vĂŠret i stand til at konfigurere noget lignende der. Jeg kunne tilsyneladende installere vĂŠrktĂžjet, wmctrl men det fungerer ikke ordentligt pĂ„ Mac OS. Man kan lave noget med appen Automator, men den er sĂ„ langsom, at det ikke er behageligt at bruge den, selv nĂ„r den fungerer. Jeg kunne heller ikke konfigurere tastekombinationer, sĂ„ de fungerede i alle programmer. Hvis nogen finder en lĂžsning â vil jeg vĂŠre glad for at bruge den.
Afslutning
Det er blevet til uventet mange ord for en sÄ tilsyneladende simpel funktionalitet. Jeg Þnskede at formidle ideen og ikke overbelaste teksten, men jeg har ikke fundet ud af, hvordan man kan fortÊlle det enklere. MÄske ville det vÊre bedre i videoformat, men her er det ikke sÄ populÊrt.
Jeg har kort fortalt om, hvad der gemmer sig bag scriptet, og hvordan man konfigurerer det. Jeg gik ikke ind i detaljerne om selve scriptet, men det er kun 50 linjer langt, sÄ det er ikke svÊrt at forstÄ.
Jeg hÄber, at nogle andre ogsÄ vil prÞve denne idé og mÄske endda sÊtte pris pÄ den. Jeg kan sige om mig selv, at scriptet blev skrevet for cirka 3 Är siden, og det har vÊrt MEGET praktisk for mig. SÄ praktisk, at det skaber alvorlig ubehag, nÄr jeg arbejder med andres computere. Og med min arbejds-MacBook.
Kilde: habr.com
