Rheolaeth ffenestr amgen yn Linux

Rwy'n un o'r rhai a osododd Caps Lock i newid gosodiadau oherwydd rwy'n rhy ddiog i wasgu 2 allwedd pan fyddaf yn gallu pwyso un. Hoffwn hyd yn oed 2 allwedd ddiangen: byddwn yn defnyddio un i droi'r gosodiad Saesneg ymlaen, a'r ail ar gyfer Rwsieg. Ond yr ail allwedd ddiangen yw galw'r ddewislen cyd-destun, sydd mor ddiangen fel ei fod yn cael ei dorri allan gan lawer o weithgynhyrchwyr gliniaduron. Felly mae'n rhaid i chi fod yn fodlon â'r hyn sydd gennych chi.

Ac nid wyf ychwaith am edrych am eu eiconau ar y bar tasgau wrth newid ffenestri, na dal yr enwau wrth sgrolio drwodd Alt + Tab, sgroliwch trwy benbyrddau, ac ati Rwyf am wasgu cyfuniad allweddol (yn ddelfrydol dim ond un, ond nid oes allweddi diangen am ddim bellach) a chyrraedd y ffenestr sydd ei hangen arnaf ar unwaith. Er enghraifft fel hyn:

  • Alt+F: Firefox
  • Alt+D: Firefox (Pori Preifat)
  • Alt+T: Terfynell
  • Alt+M: Cyfrifiannell
  • Alt+E: Syniad IntelliJ
  • etc.

Ar ben hynny, trwy wasgu, er enghraifft, ymlaen Alt+M Rwyf am weld y gyfrifiannell ni waeth a yw'r rhaglen hon yn rhedeg ar hyn o bryd. Os yw'n rhedeg, yna mae angen rhoi ffocws i'w ffenestr, ac os na, rhedeg y rhaglen a ddymunir a throsglwyddo ffocws pan fydd yn llwytho.

Ar gyfer achosion nad ydynt wedi'u cynnwys yn y sgript flaenorol, rwyf am gael cyfuniadau allweddol cyffredinol y gellir eu neilltuo'n hawdd i unrhyw un o'r ffenestri agored. Er enghraifft, mae gen i 10 cyfuniad wedi'u neilltuo o Alt + 1 i Alt + 0, nad ydynt yn gysylltiedig ag unrhyw raglenni. Gallaf clicio Alt + 1 a bydd y ffenestr sydd dan sylw ar hyn o bryd yn cael ffocws wrth glicio Alt + 1.

O dan y toriad mae disgrifiad o gwpl mwy o nodweddion ac ateb i sut y gellir gwneud hyn. Ond byddaf yn eich rhybuddio ar unwaith y gall addasu o'r fath “i chi'ch hun” achosi caethiwed difrifol a hyd yn oed tynnu'n ôl os oes angen i chi ddefnyddio Windows, Mac OS neu hyd yn oed gyfrifiadur rhywun arall gyda Linux.

Mewn gwirionedd, os meddyliwch am y peth, nid ydym yn defnyddio cymaint â hynny o raglenni bob dydd. Porwr, terfynell, IDE, rhyw fath o negesydd, rheolwr ffeiliau, cyfrifiannell ac, efallai, dyna bron i gyd. Nid oes angen llawer o gyfuniadau allweddol i gwmpasu 95% o dasgau bob dydd.

Ar gyfer rhaglenni sydd â nifer o ffenestri ar agor, gellir dynodi un ohonynt fel y prif un. Er enghraifft, mae gennych chi sawl ffenestr IntelliJ Idea ar agor ac wedi'i neilltuo iddynt Alt + E. O dan amodau arferol, pan fyddwch chi'n pwyso Alt + E bydd rhyw ffenestr o'r rhaglen hon yn agor, yn fwyaf tebygol yr un a agorwyd gyntaf. Fodd bynnag, os cliciwch ar Alt + E pan fydd un o ffenestri'r rhaglen hon eisoes dan sylw, yna bydd y ffenestr benodol hon yn cael ei neilltuo fel y prif un a dyma'r un y rhoddir ffocws iddo pan fydd cyfuniadau dilynol yn cael eu pwyso.

Gellir ailbennu'r brif ffenestr. I wneud hyn, rhaid i chi ailosod y cyfuniad yn gyntaf, ac yna aseinio ffenestr arall iddo fel y brif ffenestr. I ailosod cyfuniad, mae angen i chi wasgu'r cyfuniad ei hun, ac yna cyfuniad ailosod arbennig, mae gen i ei neilltuo i Alt + Backspace. Bydd hyn yn galw sgript a fydd yn dadneilltuo'r brif ffenestr ar gyfer y cyfuniad blaenorol. Ac yna gallwch chi neilltuo prif ffenestr newydd fel y disgrifiwyd yn y paragraff blaenorol. Mae ailosod ffenestr gysylltiedig i gyfuniadau cyffredinol yn digwydd yn yr un modd.

Trodd y cyflwyniad yn hir, ond roeddwn i eisiau dweud yn gyntaf beth fyddwn ni'n ei wneud, ac yna esbonio sut i'w wneud.

I'r rhai sydd wedi blino darllen

Yn fyr, mae'r ddolen i'r sgriptiau ar ddiwedd yr erthygl.

Ond ni fyddwch yn gallu ei osod a'i ddefnyddio ar unwaith. Yn gyntaf bydd yn rhaid i chi ddarganfod sut mae'r sgript yn dod o hyd i'r ffenestr a ddymunir. Heb hyn, ni fydd yn bosibl dweud wrth y sgript ble yn union y mae angen trosglwyddo’r ffocws. Ac mae angen i chi ddeall beth i'w wneud os na cheir ffenestr addas yn sydyn.

Ac ni fyddaf yn canolbwyntio ar sut i ffurfweddu gweithrediad sgriptiau trwy wasgu cyfuniadau allweddol. Er enghraifft, yn KDE mae yng Ngosodiadau System → Shortcuts → Custom Shortcuts. Dylai hyn fod yn wir hefyd mewn rheolwyr ffenestri eraill.

Cyflwyno wmctrl

Wmctrl - cyfleustodau consol ar gyfer rhyngweithio â X Window Manager. Dyma'r rhaglen allweddol ar gyfer y sgript. Gadewch i ni edrych yn gyflym ar sut y gallwch ei ddefnyddio.

Yn gyntaf, gadewch i ni arddangos rhestr o ffenestri agored:

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

Opsiwn -l yn dangos rhestr o'r holl ffenestri agored, a yn atodi enw'r dosbarth i'r allbwn (skype.Skype, Llywiwr.Firefox ac ati). Yma mae angen id y ffenestr (colofn 1), enw'r dosbarth (colofn 3) ac enw'r ffenestr (colofn olaf).

Gallwch geisio actifadu rhai ffenestr gan ddefnyddio'r opsiwn -a:

$ wmctrl -a skype.Skype -x

Os aeth popeth yn unol â'r cynllun, dylai ffenestr Skype ymddangos ar y sgrin. Os yn lle'r opsiwn -x defnyddio opsiwn -i, yna yn lle enw'r dosbarth gallwch nodi'r id ffenestr. Y broblem gydag id yw bod yr id ffenestr yn newid bob tro y caiff y cais ei lansio ac ni allwn ei wybod ymlaen llaw. Ar y llaw arall, mae'r nodwedd hon yn nodi ffenestr yn unigryw, a all fod yn bwysig pan fydd rhaglen yn agor mwy nag un ffenestr. Mwy am hyn ychydig ymhellach.

Ar y cam hwn mae angen i ni gofio y byddwn yn chwilio am y ffenestr a ddymunir gan ddefnyddio regex yn ôl allbwn wmctrl -lx. Ond nid yw hynny'n golygu bod yn rhaid i ni ddefnyddio rhywbeth cymhleth. Fel arfer mae enw'r dosbarth neu enw'r ffenestr yn ddigonol.

Yn y bôn, dylai'r prif syniad fod yn glir eisoes. Yn y gosodiadau hotkeys/llwybrau byr byd-eang ar gyfer eich rheolwr ffenestri, ffurfweddwch y cyfuniad gofynnol i weithredu'r sgript.

Sut i ddefnyddio sgriptiau

Yn gyntaf mae angen i chi osod cyfleustodau consol wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Nesaf mae angen i chi lawrlwytho'r sgriptiau a'u hychwanegu at $ PATH. Fel arfer dwi'n eu rhoi nhw i mewn ~/bin:

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

Os bydd y cyfeiriadur ~/bin Nid oedd yno, yna mae angen i chi ei greu ac ailgychwyn (neu ail-fewngofnodi), fel arall ~/bin ni fydd yn taro $ PATH. Os gwneir popeth yn gywir, yna dylai'r sgriptiau fod yn hygyrch o'r consol a dylai cwblhau Tab weithio.

Prif sgript showwin yn cymryd 2 baramedr: mae'r cyntaf yn regex, lle byddwn yn chwilio am y ffenestr ofynnol, ac mae'r ail baramedr yn orchymyn y mae angen ei weithredu os na chanfyddir y ffenestr ofynnol.

Gallwch geisio rhedeg sgript, er enghraifft:

$ showwin "Mozilla Firefox$" firefox

Os gosodir Firefox, dylid rhoi ffocws i'w ffenestr. Hyd yn oed os nad oedd Firefox yn rhedeg, dylai fod wedi dechrau.

Os yw'n gweithio, yna gallwch geisio ffurfweddu gweithrediad gorchmynion ar gyfuniadau. Yn y gosodiadau hotkeys/llwybrau byr byd-eang ychwanegwch:

  • Alt+F: dangos “Mozilla Firefox$” firefox
  • Alt+D: showwin "Mozilla Firefox (Pori Preifat)$" "firefox -private-window"
  • Alt+C: showwin "cromiwm-browser.Chromium-porwr N*" cromiwm-porwr
  • Alt+X: showwin "cromiwm-browser.Chromium-porwr I*" "cromiwm-porwr -incognito"
  • Alt+S: showwin “skype.Skype” skypeforlinux
  • Alt+E: showwin “jetbrains-idea” idea.sh

Etc Gall pawb ffurfweddu cyfuniadau allweddol a meddalwedd fel y gwelant yn dda.
Os gweithiodd popeth yn gywir, yna gan ddefnyddio'r cyfuniadau uchod byddwn yn gallu newid rhwng ffenestri trwy wasgu'r bysellau yn unig.

Byddaf yn siomi cariadon crôm: gall incognito wahaniaethu rhwng ffenestr reolaidd yn ôl ei hallbwn wmctrl Ni allwch, mae ganddyn nhw'r un enwau dosbarth a theitlau ffenestri. Yn y regex arfaethedig, dim ond fel bod yr ymadroddion rheolaidd hyn yn wahanol i'w gilydd y mae angen y nodau N* ac I* a gellir eu neilltuo fel y prif ffenestri.

I ailosod prif ffenestr y cyfuniad blaenorol (mewn gwirionedd ar gyfer regex, sydd showwin a elwir y tro diwethaf) mae angen i chi ffonio'r sgript showwinDetach. Mae'r sgript hon wedi'i neilltuo i gyfuniad allweddol Alt + Backspace.

Wrth y sgript showwin mae un swyddogaeth arall. Pan gaiff ei alw gydag un paramedr (yn yr achos hwn, dim ond dynodwr yw'r paramedr), nid yw'n gwirio'r regex o gwbl, ond mae'n ystyried bod pob ffenestr yn addas. Ynddo'i hun, mae hyn yn ymddangos yn ddiwerth, ond yn y modd hwn gallwn ddynodi unrhyw ffenestr fel y brif un a newid yn gyflym i'r ffenestr benodol honno.

Mae gennyf y cyfuniadau canlynol wedi'u ffurfweddu:

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

Fel hyn gallaf rwymo unrhyw ffenestri i gyfuniadau Alt + 1...Alt + 0. Dim ond trwy glicio Alt + 1 Rwy'n rhwymo'r ffenestr gyfredol i'r cyfuniad hwn. Gallaf ganslo'r rhwymiad trwy glicio Alt + 1ac yna Alt + Backspace. Neu caewch y ffenestr, mae hynny'n gweithio hefyd.

Nesaf byddaf yn dweud wrthych rai manylion technegol. Does dim rhaid i chi eu darllen, ond ceisiwch eu gosod i fyny a gweld. Ond byddwn yn dal i argymell deall sgriptiau pobl eraill cyn eu rhedeg ar eich cyfrifiadur :).

Sut i wahaniaethu rhwng gwahanol ffenestri o'r un cais

Mewn egwyddor, roedd yr enghraifft gyntaf un “wmctrl -a skype.Skype -x” yn gweithio a gellir ei ddefnyddio. Ond gadewch i ni edrych eto ar yr enghraifft gyda Firefox, lle mae 2 ffenestr ar agor:

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

Mae'r ffenestr gyntaf yn y modd arferol, a'r ail yw Pori Preifat. Hoffwn ystyried y ffenestri hyn fel gwahanol gymwysiadau a newid iddynt gan ddefnyddio gwahanol gyfuniadau allweddol.

Mae angen cymhlethu'r sgript sy'n switsio ffenestri. Defnyddiais yr ateb hwn: dangoswch restr o'r holl ffenestri, gwnewch grep gan regex, cymerwch y llinell gyntaf gyda pennaeth, cael y golofn gyntaf (dyma fydd y ffenestr id) gan ddefnyddio torri, newid i ffenestr gan id.

Dylai fod jôc am ymadroddion rheolaidd a dwy broblem, ond mewn gwirionedd nid wyf yn defnyddio unrhyw beth cymhleth. Mae angen ymadroddion rheolaidd arnaf fel y gallaf nodi diwedd y llinell (y symbol “$”) a gwahaniaethu rhwng “Mozilla Firefox$” a “Mozilla Firefox (Pori Preifat)$”.

Mae'r gorchymyn yn edrych fel hyn:

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

Yma gallwch chi ddyfalu eisoes am ail nodwedd y sgript: os nad yw grep yn dychwelyd unrhyw beth, yna nid yw'r cymhwysiad a ddymunir ar agor ac mae angen i chi ei gychwyn trwy weithredu'r gorchymyn o'r ail baramedr. Ac yna gwirio o bryd i'w gilydd a yw'r ffenestr ofynnol wedi agor er mwyn trosglwyddo ffocws iddo. Ni fyddaf yn canolbwyntio ar hyn; bydd unrhyw un sydd ei angen yn edrych ar y ffynonellau.

Pan na ellir gwahaniaethu ffenestri cais

Felly, rydym wedi dysgu sut i drosglwyddo ffocws i ffenestr y cais a ddymunir. Ond beth os oes gan gais fwy nag un ffenestr ar agor? Pa un ddylwn i ganolbwyntio arno? Mae'n debyg y bydd y sgript uchod yn trosglwyddo i'r ffenestr agored gyntaf. Fodd bynnag, hoffem gael mwy o hyblygrwydd. Hoffwn allu cofio pa ffenestr sydd ei hangen arnom a newid i'r ffenestr benodol honno.

Y syniad oedd hyn: Os ydym am gofio ffenestr benodol ar gyfer cyfuniad allweddol, yna mae angen i ni wasgu'r cyfuniad hwn pan fydd y ffenestr a ddymunir mewn ffocws. Yn y dyfodol, pan fyddwch chi'n pwyso'r cyfuniad hwn, bydd y ffocws yn cael ei roi i'r ffenestr hon. Hyd nes y bydd y ffenestr yn cau neu byddwn yn ailosod ar gyfer y cyfuniad sgript hwn showwinDetach.

Algorithm sgript showwin rhywbeth fel hyn:

  • Gwiriwch a ydym wedi cofio id y ffenestr y dylid trosglwyddo ffocws iddi o'r blaen.
    Os cofiwch a bod ffenestr o'r fath yn dal i fodoli, yna rydym yn trosglwyddo ffocws iddo ac yn gadael.
  • Edrychwn ar ba ffenestr sydd dan sylw ar hyn o bryd, ac os yw'n cyd-fynd â'n cais, yna cofiwch ei id i fynd ato yn y dyfodol a gadael.
  • Rydym yn mynd i o leiaf rhyw ffenestr addas os yw'n bodoli neu agor y cais a ddymunir.

Gallwch ddarganfod pa ffenestr sydd dan sylw ar hyn o bryd gan ddefnyddio cyfleustodau consol xdotool trwy drosi ei allbwn i fformat hecsadegol:

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

Y ffordd hawsaf o gofio rhywbeth mewn bash yw creu ffeiliau mewn system ffeiliau rhithwir sydd wedi'i lleoli yn y cof. Yn Ubuntu mae hyn wedi'i alluogi yn ddiofyn yn /dev/shm/. Ni allaf ddweud dim am ddosbarthiadau eraill, gobeithio bod rhywbeth tebyg hefyd. Gallwch edrych gyda'r gorchymyn:

$ mount -l | grep tmpfs

Bydd y sgript yn creu cyfeiriaduron gwag yn y ffolder hwn, fel hyn: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Yn ogystal, bob tro y'i gelwir bydd yn creu cyswllt syml /dev/shm/$USER/showwin/showwin_last ar /dev/shm/$USER/showwin/$SEARCH_REGEX. Bydd angen hyn er mwyn, os oes angen, tynnu'r id ffenestr ar gyfer cyfuniad penodol gan ddefnyddio sgript showwinDetach.

Beth ellir ei wella

Yn gyntaf, rhaid ffurfweddu'r sgriptiau â llaw. Yn sicr, oherwydd yr angen i ymchwilio a gwneud llawer gyda'ch dwylo, ni fydd llawer ohonoch hyd yn oed yn ceisio ffurfweddu'r system. Pe bai'n bosibl gosod y pecyn a ffurfweddu popeth yn haws, yna efallai y byddai'n ennill rhywfaint o boblogrwydd. Ac yna edrychwch, byddai'r cais yn cael ei ryddhau i ddosbarthiadau safonol.

Ac efallai y gellir ei wneud yn haws. Os gallwch chi, trwy id ffenestr, ddarganfod id y broses a'i creodd, a thrwy id y broses gallwch ddarganfod pa orchymyn a'i creodd, yna byddai'n bosibl awtomeiddio'r gosodiad. Mewn gwirionedd, nid oeddwn yn deall a oedd yr hyn a ysgrifennais yn y paragraff hwn yn bosibl. Y ffaith yw fy mod yn bersonol yn fodlon â'r ffordd y mae'n gweithio nawr. Ond os bydd rhywun heblaw fi yn gweld yr holl ddull yn gyfleus a rhywun yn ei wella, yna byddaf yn hapus i ddefnyddio datrysiad gwell.

Problem arall, fel yr ysgrifennais eisoes, yw na ellir gwahaniaethu'r ffenestri oddi wrth ei gilydd mewn rhai achosion. Hyd yn hyn, dim ond gydag incognito mewn chrome/cromiwm yr wyf wedi sylwi ar hyn, ond efallai bod rhywbeth tebyg yn rhywle arall. Fel dewis olaf, mae yna bob amser yr opsiwn o gyfuniadau cyffredinol Alt + 1...Alt + 0. Unwaith eto, rwy'n defnyddio Firefox ac i mi yn bersonol nid yw'r broblem hon yn arwyddocaol.

Ond y broblem sylweddol i mi yw fy mod yn defnyddio Mac OS ar gyfer gwaith ac ni allwn ffurfweddu unrhyw beth felly yno. cyfleustodau wmctrl Rwy'n credu fy mod wedi gallu ei osod, ond nid yw'n gweithio ar Mac OS mewn gwirionedd. Gellir gwneud rhywbeth gyda'r cais Automator, ond mae mor araf fel nad yw'n gyfleus i'w ddefnyddio hyd yn oed pan fydd yn gweithio. Hefyd, ni allwn sefydlu cyfuniadau allweddol fel eu bod yn gweithio ym mhob rhaglen. Os bydd rhywun yn dod o hyd i ateb yn sydyn, byddaf yn falch o'i ddefnyddio.

Yn hytrach na i gasgliad

Trodd allan i fod yn nifer annisgwyl o fawr o eiriau ar gyfer swyddogaeth mor syml i bob golwg. Roeddwn i eisiau cyfleu'r syniad a pheidio â gorlwytho'r testun, ond nid wyf eto wedi cyfrifo sut i'w ddweud yn symlach. Efallai y byddai'n well ar ffurf fideo, ond nid yw pobl yn ei hoffi felly yma.

Soniais ychydig am yr hyn sydd o dan gwfl y sgript a sut i'w ffurfweddu. Wnes i ddim mynd i mewn i fanylion y sgript ei hun, ond dim ond 50 llinell ydyw, felly nid yw'n anodd ei ddeall.

Rwy'n gobeithio y bydd rhywun arall yn rhoi cynnig ar y syniad hwn ac efallai hyd yn oed yn ei werthfawrogi. Gallaf ddweud amdanaf fy hun bod y sgript wedi'i ysgrifennu tua 3 blynedd yn ôl ac mae'n gyfleus IAWN i mi. Mor gyfleus ei fod yn achosi anghysur difrifol wrth weithio gyda chyfrifiaduron pobl eraill. A gyda MacBook sy'n gweithio.

Dolen i sgriptiau

Ffynhonnell: hab.com

Ychwanegu sylw