Eg er av dei som set Caps Lock for Ă„ skifte mellom tastaturoppsett fordi eg er lat og ikkje orkar Ă„ trykke to knappar nĂ„r eg kan trykke ein. Eg ville til og med Ăžnske at eg hadde to unĂždvendige knappar: ein for Ă„ aktivere det engelske oppsettet, og den andre for det russiske. Men den andre unĂždvendige knappen â det er Ă„ kalle opp kontekstmenyen, som er sĂ„ unĂždvendig at mange bĂŠrbare datamaskinprodusenter tar bort den. SĂ„ eg fĂ„r nĂžye meg med det eg har.
Og eg vil heller ikkje leita etter ikonene til vindauga pÄ oppgavelinja nÄr eg bytter vindaugsfokus, eg vil sjÄ namna nÄr eg bla gjennom Alt+Tab, bla gjennom skrivebord og sÄ vidare. Eg vil trykke ein tastekombinasjon (ideelt sett berre ein, men det finst ikkje fleire unÞdvendige knappar) og straks komma til det vindauget eg treng. For eksempel slik:
- Alt+F: Firefox
- Alt+D: Firefox (Privat nettlesing)
- Alt+T: Terminal
- Alt+M: Kalkulator
- Alt+E: IntelliJ Idea
- og sÄ videre.
Dessutan, nĂ„r eg trykker pĂ„ Alt+M , vil eg sjĂ„ kalkulatoren uavhengig av om dette programmet er open for Ăžyeblikket. Om det er open, mĂ„ fokuset sendast til det vindauget, og om det ikkje er open â starte det aktuelle programmet og sende fokuset nĂ„r det er lasta inn.
For tilfelle som ikkje dekkast av det fÞregÄande scenariet, vil eg ha universelle tastekombinasjonar som lett kan tildelast til kva som helst av dei opne vindauga. For eksempel har eg tildelt 10 kombinasjonar frÄ Alt+1 til Alt+0, som ikkje er knytt til nokre program. Eg kan berre trykke Alt+1 og vindauget som er i fokus no, vil fÄ fokus nÄr eg trykker Alt+1.
Under er det ei beskrivelse av eit par andre funksjonar og svaret pÄ korleis ein kan gjere dette. Men eg vil straks advare om at slik tilpassing kan skape sterk avhengighet og til og med abstinenser nÄr ein mÄ bruke Windows, Mac OS eller til og med ei framand datamaskin med Linux.
Faktisk, nÄr ein tenkjer pÄ det, bruker vi ikkje sÄ mange program dagleg. Nettlesar, terminal, IDE, ein type meldingstenester, filbehandlar, kalkulator, og kanskje det er nesten alt. Ein treng ikkje sÄ mange tastatursnarvegar for Ä dekke 95% av daglege oppgÄver.
For program som har fleire vindauga opne, kan ein av dei bli sett som hovudvindu. For eksempel, har eg fleire vindauga opne i IntelliJ Idea, tildelt til Alt+E. Under vanlege tilhÞve vil trykking pÄ Alt+E opne eit av vindauga til dette programmet, mest sannsynleg det vindauget som vart opna fÞrst. Men om ein trykker pÄ Alt+E NÄr ett av vinduene i dette programmet allerede er i fokus, vil dette vinduet bli satt som hovedvinduet, og det vil motta fokus ved pÄfÞlgende tastetrykk av kombinasjonen.
Hovedvinduet kan omdefineres. For dette mÄ kombinasjonen fÞrst tilbakestilles, og deretter kan et annet vindu settes som hovedvindu. For Ä tilbakestille kombinasjonen mÄ du trykke pÄ selve kombinasjonen, og deretter en spesialkombinasjon for tilbakestilling, som jeg har satt til Alt+Backspace. Dette vil kalle et skript som annullerer tildelingen av hovedvinduet for den forrige kombinasjonen. Deretter kan et nytt hovedvindu tildeles som beskrevet i forrige avsnitt. Tilbakestilling av det tilknyttede vinduet til universelle kombinasjoner skjer pÄ lignende mÄte.
Introduksjonen ble lang, men jeg ville fĂžrst fortelle hva vi skal gjĂžre, og deretter forklare hvordan vi skal gjĂžre det.
For de som er lei av Ă„ lese
Kort fortalt, linken til skriptene ligger pÄ slutten av artikkelen.
Men det vil fortsatt ikke vÊre mulig Ä installere og bruke det med en gang. Du mÄ fÞrst forstÄ hvordan skriptet finner det nÞdvendige vinduet. Uten dette kan ikke skriptet vite hvor fokus skal overfÞres. Og man mÄ vite hva man skal gjÞre hvis det ikke finnes et passende vindu.
Og jeg vil heller ikke fokusere pĂ„ hvordan man setter opp kjĂžringen av skriptene ved tastetrykk. For eksempel, i KDE er det i Systeminnstillinger â Snarveier â Egne snarveier. Dette bĂžr ogsĂ„ vĂŠre mulig i andre vindusbehandlere.
Bli kjent med wmctrl
Wmctrl â et kommandolinjeverktĂžy for Ă„ samhandle med X Window Manager. Dette er et nĂžkkelprogram for skriptet. La oss raskt se pĂ„ hvordan man kan bruke det.
For Ä begynne, la oss liste opp Äpne vinduer:
$ wmctrl -lx
0x01e0000e -1 plasmashell.plasmashell N/A Skrivebord â Plasma
0x01e0001e -1 plasmashell.plasmashell N/A Plasma
0x03a00001 0 skype.Skype N/A Skype
0x04400003 0 Navigator.Firefox N/A Google Oversetter - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Beste publikasjoner den siste dagen / Habr - Mozilla Firefox (Privat nettlesing)
...Alternativ -l viser en liste over alle Äpne vinduer, mens -x legger til klassens navn i utdataene (skype.Skype, Navigator.Firefox osv.). Vi trenger vinduets id (kolonne 1), klasse navn (kolonne 3) og vinduets tittel (siste kolonne).
Du kan prĂžve Ă„ aktivere et vindu med alternativet -a:
$ wmctrl -a skype.Skype -xHvis alt gÄr etter planen, skal Skype-vinduet vises pÄ skjermen. Hvis du velger alternativet -x bruk alternativet -i, sÄ i stedet for klassens navn kan vi angive id'et pÄ vinduet. Problemet med id'et er, at vinduets id Êndrer sig ved hver opstart af applikationen, og vi kan ikke kende det pÄ forhÄnd. PÄ den anden side angiver dette attribut klart vinduet, hvilket kan vÊre vigtigt, nÄr applikationen Äbner mere end ét vindue. Mere om dette senere.
PĂ„ dette trin skal vi huske, at vi vil sĂžge efter det Ăžnskede vindue ved hjĂŠlp af regex fra outputtet wmctrl -lx. Men det betyder ikke, at vi nĂždvendigvis skal bruge noget kompliceret. Normalt er klassens navn eller vinduets titel tilstrĂŠkkeligt.
I princippet bĂžr hovedideen allerede vĂŠre klar. I indstillingerne for globale genvejstaster indstiller vi den Ăžnskede kombination til at udfĂžre scriptet.
SÄdan bruger du scripts
FĂžrst skal du installere kommandolinjevĂŠrktĂžjer wmctrl og xdotool:
$ sudo apt-get install wmctrl xdotoolDerudover 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 du skal genstarte (eller logge ind igen), ellers ~/bin vil ikke komme ind i $PATH. Hvis alt er gjort korrekt, skal scripts vĂŠre tilgĂŠngelige fra konsollen, og autoudfyldning med Tab skal fungere.
Hovedscriptet showwin modtager 2 parametre: den fĂžrste er regex, hvormed vi vil sĂžge efter det Ăžnskede vindue, og den anden parameter er kommandoen, som skal udfĂžres, hvis det Ăžnskede vindue ikke blev fundet.
Du kan prĂžve at udfĂž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 lykkedes, kan du prĂžve at indstille udfĂžrelsen af kommandoer til kombinationer. I indstillingerne for globale genvejstaster tilfĂžjer vi:
- Alt+F: showwin «Mozilla Firefox$» firefox
- Alt+D: showwin «Mozilla Firefox (Privat 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 person kan tilpasse genvejstaster og software som det passer dem.
Hvis alt er gjort korrekt, kan vi skifte mellem vinduer med de nÊvnte kombinationer ved blot at trykke pÄ tasterne.
Jeg vil skuffe elskere af Chrome: et almindeligt vindue kan ikke skelnes fra et inkognito-vindue ud fra output. wmctrl Det er ikke mulig, de har samme klassebetegnelser og vindustitler. I de foreslÄtte regexene er symbolene N* og I* bare nÞdvendige for at disse regulÊre uttrykkene skal skille seg fra hverandre, slik at forskjellige vinduer kan tildeles som hovedvinduer.
For Ä tilbakestille hovedvinduet for den forrige kombinasjonen (faktisk for regexen som showwin ble kalt sist) mÄ du kjÞre skriptet showwinDetach. Jeg har dette skriptet tildelt til en tastaturkombinasjon Alt+Backspace.
Skriptet showwin har en annen funksjon. NÄr det kalles med ett parameter (i dette tilfellet er parameteren bare et identifikasjonsnummer), sjekker det ikke regexen i det hele tatt, men anser alle vinduene som passende. Dette kan virke unyttig, men pÄ denne mÄten kan vi tildele ethvert vindu som hovedvindu og raskt bytte til nettopp det vinduet.
Jeg har satt opp fĂžlgende kombinasjoner:
- Alt+1: showwin «CustomKey1»
- Alt+2: showwin «CustomKey2»
- âŠ
- Alt+0: showwin «CustomKey0»
- Alt+Backspace: showwinDetach
Dermed kan jeg knytte vilkĂ„rlige vinduer til kombinasjoner Alt+1âŠAlt+0. Bare ved Ă„ trykke Alt+1 binder jeg det nĂ„vĂŠrende vinduet til denne kombinasjonen. Jeg kan avbryte bindingen ved Ă„ trykke Alt+1, og deretter Alt+Backspace. Eller jeg kan bare lukke vinduet, det fungerer ogsĂ„.
Deretter vil jeg dele noen tekniske detaljer. Du trenger ikke Ä lese dem, bare prÞv Ä sette opp og se. Men jeg vil likevel anbefale Ä bli kjent med andres skript fÞr du kjÞrer dem pÄ datamaskinen din :o).
Hvordan skille forskjellige vinduer av samme applikasjon
I prinsippet var det fÞrste eksempelet «wmctrl -a skype.Skype -x» fungerende og kan brukes. Men la oss se pÄ eksempelet med Firefox igjen, der det er Äpnet to vinduer:
0x04400003 0 Navigator.Firefox N/A Google Translate - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Beste publikasjoner siste 24 timer / Habr - Mozilla Firefox (Private Browsing)Det fĂžrste vinduet er i vanlig modus, og det andre er i Privat nettlesing. Disse vinduene vil jeg gjerne anse som forskjellige applikasjoner og bytte mellom dem med ulike tastaturkombinasjoner.
Jeg mÄ komplisere skriptet som bytter vinduer. Jeg brukte fÞlgende lÞsning: skriv ut en liste over alle vinduer, gjÞr grep ved hjelp av regex, ta fÞrste linje med head, hent fÞrste kolonne (dette vil vÊre vinduets id) med cut, bytt til vinduet via id.
Her skal det vÊre en vits om regulÊre uttrykk og to problemer, men i virkeligheten bruker jeg ikke noe komplisert. Jeg trenger regex for Ä kunne indikere slutten av en linje (symbolet «$») og skille mellom «Mozilla Firefox$» og «Mozilla Firefox (Private Browsing)$».
Teamet ser omtrent slik ut:
$ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`Her kan man allerede gjette den andre sÊregenheten ved skriptet: hvis grep ikke returnerte noe, betyr det at det nÞdvendige programmet ikke er Äpnet, og det mÄ startes med kommandoen fra det andre parameteret. Deretter mÄ man periodisk sjekke om det aktuelle vinduet har Äpnet seg for Ä kunne gi det fokus. Jeg vil ikke gÄ inn pÄ dette, de som trenger det kan se pÄ kildekoden.
NÄr vinduer fra applikasjonen ikke er forskjellige
SÄ, vi har lÊrt Ä gi fokus til vinduet til den nÞdvendige applikasjonen. Men hva hvis det er Äpnet mer enn ett vindu av applikasjonen? Hvilket av dem skal vi gi fokus? Skriptet ovenfor gir mest sannsynlig fokus til det fÞrste Äpne vinduet. Men vi vil gjerne ha mer fleksibilitet. Vi Þnsker Ä kunne huske hvilket spesifikt vindu vi trenger og bytte akkurat til det vinduet.
Ideen var som fÞlger: Hvis vi vil huske et spesifikt vindu for tastekombinasjonen, mÄ vi trykke denne kombinasjonen nÄr det nÞdvendige vinduet har fokus. Senere, nÄr vi trykker pÄ denne kombinasjonen, vil fokuset gÄ til nettopp dette vinduet. Inntil vinduet lukkes eller vi nullstiller denne kombinasjonen i skriptet. showwinDetach.
Skriptets algoritme showwin er omtrent som fĂžlger:
- Sjekk om vi tidligere har husket id-en til vinduet som skal fÄ fokus.
Hvis vi har husket det, og vinduet fortsatt eksisterer, gir vi det fokus og gÄr ut. - Se hvilket vindu som nÄ har fokus, og hvis det passer med forespÞrselen vÄr, sÄ vil vi huske id-en for Ä gÄ til det senere og gÄ ut.
- GÄ til et passende vindu dersom det eksisterer, eller Äpne det nÞdvendige programmet.
For Ä finne ut hvilket vindu som nÄ har fokus, kan vi bruke konsollverktÞyet xdotool, og konvertere dets utdata til heksadesimal format:
$ printf "0xx" `xdotool getwindowfocus`Det er enklest Ä huske noe i bash ved Ä opprette filer i et virtuelt filsystem i minnet. I Ubuntu er dette som standard aktivert i /dev/shm/. Jeg kan ikke si noe om andre distribusjoner, hÄper det ogsÄ finnes noe lignende. Du kan sjekke med kommandoen:
$ mount -l | grep tmpfsSkriptet vil opprette tomme kataloger i denne mappen, slik som dette: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. I tillegg vil det ved hvert kall opprette en symlink /dev/shm/$USER/showwin/showwin_last En funksjon har blitt /dev/shm/$USER/showwin/$SEARCH_REGEX. Dette vil vĂŠre nĂždvendig for Ă„ kunne slette id for vinduet for en bestemt kombinasjon ved hjelp av skriptet showwinDetach.
Hva kan forbedres
For det fÞrste mÄ skriptene konfigureres manuelt. Sannsynligvis, pÄ grunn av nÞdvendigheten av Ä sette seg inn i dette og gjÞre mye for hÄnd, vil mange av dere ikke en gang prÞve Ä konfigurere systemet. Hvis det fantes en mulighet til bare Ä installere en pakke og gjÞre alt enklere, ville det kanskje fÄtt en viss popularitet. Og sÄ ville kanskje applikasjonen blitt inkludert i standarddistribusjonene.
Og det kan hende at det kan gjÞres enklere. Hvis man kan finne ut id for prosessen som opprettet et vindu basert pÄ vindus-id, og deretter bruke prosess-id til Ä finne ut hvilken kommando som opprettet den, kunne man automatisert konfigurasjonen. Egentlig har jeg ikke gransket dette, sÄ jeg vet ikke om det jeg skrev i dette avsnittet er mulig. Men for meg personlig fungerer det slik det er nÄ. Men hvis noen annet enn meg synes tilnÊrmingen er praktisk og forbedrer den, vil jeg med glede bruke den beste lÞsningen.
Et annet problem, som jeg allerede har skrevet, er at i noen tilfeller kan vinduer ikke skilles fra hverandre. SĂ„ langt har jeg bare sett dette med inkognito i chrome/chromium, men det kan vĂŠre liknende andre steder. I verste fall finnes alltid universelle kombinasjoner Alt+1âŠAlt+0. Igjen, jeg bruker Firefox, og for meg er ikke dette problemet betydelig.
Men et betydelig problem for meg er at i jobben bruker jeg Mac OS, og der har jeg ikke fĂ„tt til noe lignende. VerktĂžyet wmctrl virker jeg fikk installert, men det fungerer ikke skikkelig pĂ„ Mac OS. Man kan gjĂžre noe med applikasjonen Automator, men det er sĂ„ tregt at det ikke er praktisk Ă„ bruke selv nĂ„r det fungerer. Jeg har heller ikke fĂ„tt til Ă„ konfigurere hurtigtaster som fungerer i alle programmer. Hvis noen finner en lĂžsning â ville jeg gjerne brukt det.
In conclusion
Det ble overraskende mange ord for en sÄ tilsynelatende enkel funksjonalitet. Jeg Þnsket Ä formidle ideen uten Ä overbelaste teksten, men jeg har ennÄ ikke funnet ut hvordan jeg kan fortelle det enklere. Kanskje i videoformat ville vÊrt bedre, men det er ikke sÄ populÊrt her.
Eg har litt fortalt om kva som ligg under panseret pÄ skriptet og korleis du kan setje det opp. Eg har ikkje gÄtt inn i detaljane om skriptet, men det er berre 50 linjer langt, sÄ det er ikkje vanskeleg Ä forstÄ.
Eg hÄpar at nokon fleire prÞver ut denne ideen og kanskje til og med set pris pÄ den. Eg kan seie at skriptet blei skrive for 3 Är sidan, og det er SUUUPER praktisk for meg. SÄ praktisk at det gir meg stor ubehag nÄr eg jobbar pÄ andre sine datamaskiner. Og med arbeids-MacBooken min.
Kilde: habr.com
