Alternatiivne aknahaldus Linuxis

Ma olen see, kes paneb Caps Lock'i keelevahetuseks, sest on liiga laisk, et vajutada kahte nuppu, kui võib vajutada ühte. Ma sooviks isegi kaht ebavajalikku nuppu: ühte kasutaksin ingliskeelse klaviatuuri jaoks ja teist venekeelse jaoks. Kuid teine ebavajalik nupp on konteksti menüü kutsumine, mis on nii vajalik, et paljusid sülearvuti tootjaid häirib see. Seega tuleb leppida sellega, mis on.

Ja ma ei taha ka akende vahetamisel nende ikoone tegumiribal otsida, üritades silmadega tabada nimesid kerimise kaudu , mis ei ole eriti mugav., kerida töölauale jne. Ma tahan vajutada klahvikombinatsiooni (ideaalis ühe, kuid vabu ebavajalikke klahve enam pole) ja kohe siseneda vajaliku aknaga. Näiteks nii:

  • Alt+F: Firefox
  • Alt+D: Firefox (Privaatsusrežiim)
  • Alt+T: Terminal
  • Alt+M: Kalkulaator
  • Alt+E: IntelliJ Idea
  • jne.

Ja vajutades näiteks Alt+M , tahan näha kalkulaatorit sõltumata sellest, kas see programm on hetkel avatud. Kui see on avatud, siis tuleb sellele aknale anda fookus, ja kui ei ole, siis avada vajalik programm ja anda fookus, kui see on laaditud.

Juhtudel, mida eelnev stsenaarium ei kata, tahan, et mul oleks universaalsed klahvikombinatsioonid, millele on lihtne määrata mis tahes avatud aknad. Näiteks olen määranud 10 kombinatsiooni alates Alt+1 kuni Alt+0, mis ei ole seotud ühegi programmiga. Ma võin lihtsalt vajutada Alt+1 , ja aknal, mis praegu on fookuses, hakkab fookus toimuma, kui vajutada Alt+1.

Allpool on kirjeldatud veel paar funktsiooni ja vastus küsimusele, kuidas seda teha. Kuid kohe täpsustan, et selline kohandamine "enda jaoks" võib tekitada tugevat sõltuvust ja isegi võõrutussümptomeid, kui tuleb kasutada Windowsi, Mac OS-i või isegi kellegi teise Linuxi arvutit.

Tegelikult, kui mõelda, siis me ei kasuta igapäevaselt nii palju programme. Brauser, terminal, IDE, mõni sõnumside rakendus, failihaldur, kalkulaator ja ilmselt ongi kõik. Vajalik on vaid vähe klahvikombinatsioone, et katta 95% igapäevastest ülesannetest.

Programmide puhul, millel on avatud mitu akent, võib üks neist määrata peamiseks. Näiteks, kui on avatud mitu IntelliJ Idea akent, mis on määratud Alt+E. Tavalistes tingimustes, kui vajutada Alt+E , avatakse mingi selle programmi aken, mis tõenäoliselt oli avatud esimesena. Kuid kui vajutada Alt+E kui üks selle programmi akendest on juba fookuses, siis määratakse see aken peamiseks ja just sellele antakse fookus järgmiste kombinatsioonide vajutamisel.

Peaaken saab ümber määrata. Selleks tuleb esmalt kombinatsioon nullida ja seejärel määrata sellele peamiseks teine aken. Kombinatsiooni nullimiseks tuleb vajutada ise kombinatsiooni ja seejärel spetsiaalset nullimise kombinatsiooni, mis mul on määratud Alt+Backspace. See kutsub esile skripti, mis tühistab eelneva kombinatsiooni peamise akna määramise. Edasi saab määrata uue peamise akna nagu eelnevas lõigus kirjeldatud. Seotud akna lähtestamine universaalsete kombinatsioonide jaoks toimub samamoodi.

Sissejuhatus tuli pikk, kuid tahtsin kõigepealt rääkida, mida me teeme, ja siis seletada, kuidas seda teha.

Neile, kellele lugemine juba igav on

Lühidalt öeldes on skriptide link artikli lõpus.

Kuid kohe installida ja kasutada ei õnnestu. Peab esmalt aru saama, kuidas skript leiab vajaliku akna. Ilma selleta ei saa skripti suunata fookuse edastamise kohta. Ja tuleb aru saada, mida teha, kui sobivat akent ei leita.

Ja ma ei kavatse keskenduda sellele, kuidas seadistada skriptide käivitamist klahvikombinatsioonide vajutamisel. Näiteks KDE-s on see System Settings → Shortcuts → Custom Shortcuts. Teistes aknahaldurites peaks ka seda olema.

Tutvumine wmctrl-iga

Wmctrl — käsklustööriist X Window Manageriga suhtlemiseks. See on skripti jaoks võtmeprogramm. Vaatame kiirutades, kuidas seda kasutada.

Esmalt tõstame esile avatud akende nimekirja:

$ 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 Tõlkija - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Parimad postitused päeva jooksul / Habr - Mozilla Firefox (Privaatses sirvimises)
...

Valik õpivad toob esile kõigi avatud akende nimekirja, ja -x lisab väljundisse klassi nime (skype.Skype, Navigator.Firefox jne). Meile on vajalik akna id (1. veerg), klassi nimi (3. veerg) ja akna nimi (viimane veerg).

Saame proovida aktiveerida mõnda akent valiku abil -a:

$ wmctrl -a skype.Skype -x

Kui kõik läks plaanipäraselt, siis peaks ekraanile ilmuma Skype'i aken. Kui valiku asemel -x kasutada valikut -i, siis klassi nime asemel saab kasutada akna id. Id probleemiks on, et akna id muutub iga rakenduse käivitamise ajal ja me ei saa seda ette teada. Teisalt osutab see atribuut ühemõtteliselt aknale, mis võib olla oluline, kui rakendus avab rohkem kui ühe akna. Selle kohta räägime veidi hiljem.

Selles etapis peame meeles pidama, et otsime vajalikke aknaid regexi abil väljundist wmctrl -lx. Kuid see ei tähenda, et peame alati midagi keerulist kasutama. Tavaline on piisav klassi nimi või akna pealkiri.

Põhimõtteliselt peaks peamine idee olema juba selge. Teie aknahalduri globaalsete hotkeyde/lühikeste võtmete seadetes seadistame vajaliku kombinatsiooni skripti käivitamiseks.

Kuidas skripte kasutada

Kõigepealt peate installima konsooliharjutused wmctrl ja xdotool:

$ sudo apt-get install wmctrl xdotool

Seejärel peate skriptid alla laadima ja need lisama $PATH. Ma tavaliselt panen need ~/bin:

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

Kui katalooge ~/bin ei olnud, siis tuleb see luua ja uuesti sisse logida (või uuesti siseneda), vastasel juhul ~/bin ei jõua $PATH. Kui kõik on tehtud õigesti, peaksid skriptid olema konsoolist kättesaadavad ja Tab-klahvil peaks olema täiendamine.

Põhiskript showwin võtab vastu 2 parameetrit: esimene on regex, mille põhjal otsime vajalikke aknaid, ja teine parameeter on käsk, mida tuleks täita, kui vajalikke aknaid ei leita.

Võite proovida skripti käivitada, näiteks:

$ showwin "Mozilla Firefox$" firefox

Kui Firefox on installitud, peaks aknale olema antud fookus. Ieven, kui Firefox ei olnud käivitatud, peaks see käivituma.

Kui see õnnestus, siis võite proovida seadistada käskude täitmist kombinatsioonidele. Globaalsete hotkeyde/lühikeste võtmete seadetes lisame:

  • Alt+F: showwin «Mozilla Firefox$» firefox
  • Alt+D: showwin «Mozilla Firefox (Privaatne sirvimine)$» «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

jne. Klaviatuuri ja tarkvara kombinatsioone saab igaüks seadistada endale sobivaks.
Kui kõik õnnestus õigesti, saame eespool nimetatud kombinatsioonide abil akende vahel lihtsalt klahvide vajutusega vahetada.

Pettun Chrome'i fännide lootuseid: tavalist akent ei suuda ta inkognito režiimis eristada. wmctrl ei saa, neil on samad klassinimed ja akna pealkirjad. Pakutud regex'i N* ja I* sümbolid on vajalikud ainult selleks, et need regulaaravaldised üksteisest eristuksid ja nendele saaks määrata erinevad peakingimused.

Eelmise kombinatsiooni peakingimuse lähtestamiseks (tegelikult regexi, mida showwin kasutati viimati) tuleb käivitada skript showwinDetach. Mul on see skript määratud klaviatuurikombinatsioonile Alt+Backspace.

Skriptil showwin on veel üks funktsioon. Kui seda kutsutakse ühe parameetriga (antud juhul on parameeter lihtsalt ID), siis ei kontrollita regex'i üldse, vaid kõik aknad peetakse sobivaks. See tundub iseenesest kasutamata, kuid sel viisil saame määrata mistahes akna peamiseks ja kiiresti sellele aknale üle minna.

Mul on seadistatud sellised kombinatsioonid:

  • Alt+1: showwin «CustomKey1»
  • Alt+2: showwin «CustomKey2»
  • Alt+0: showwin «CustomKey0»
  • Alt+Backspace: showwinDetach

Nii et ma saan siduda igasuguseid aknaid kombinatsioonidega Alt+1Alt+0. Lihtsalt vajutades Alt+1 sidun ma aktiivse akna selle kombinatsiooniga. Tühistada sidumise võin vajutades Alt+1, ja seejärel Alt+Backspace. Või sulgedes akna, see samuti töötab.

Edasi räägin natuke tehnilistest detailidest. Neid ei ole kohustuslik lugeda, lihtsalt proovi seadistada ja vaata. Kuid ma soovitaksin ikkagi mõista teiste skripte enne, kui neid oma arvutis käivitada :).

Kuidas eristada erinevaid aknaid ühest rakendusest

Praktiliselt oli esimene näide «wmctrl -a skype.Skype -x» töötav ja seda võib kasutada. Aga vaatame veel kord näidet Firefoxist, kus on avatud 2 akent:

0x04400003  0 Navigator.Firefox                   N/A Google Tõlkija - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Parimad avaldused ööpäeva jooksul / Habr - Mozilla Firefox (Privaatne Sirvimine)

Esimene aken on tavarežiimis, teine on Privaatne Sirvimine. Need aknad tahaksime arvestada erinevate rakendustena ja neisse üle minna erinevate klaviatuurikombinatsioonidega.

Skripti, mis aknaid vahetab, tuleb keerulisemaks muuta. Olen kasutanud sellist lahendust: kuvada kõigi akende nimekiri, teha grep regex'i, võtta esimene rida head, saada esimene veerg (see on akna id) kasutades cut, vahetada aken id järgi.

Siin peaks olema nali regulaaravaldistest ja kahest probleemist, kuid tegelikult ma ei kasuta midagi keerulist. Regulaaravaldised on vajalikud selleks, et oleks võimalik näidata stringi lõppu (sümbol «$») ja eristada «Mozilla Firefox$» ja «Mozilla Firefox (Privaatne Sirvimine)$».

Ekip yaklaşık şöyle görünüyor:

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

Siin on juba lihtne arvata skripti teise omaduse üle: kui grep ei tagasta midagi, tähendab see, et vajalik rakendus ei ole avatud ja see tuleb käivitada, täites teise parameetri käsu. Ja siis kontrollime regulaarselt, kas vajalik aken on avanud, et sellele fookust anda. Ei hakka sellele liiga palju tähelepanu juhtima, kes vajab, see vaatab lähtekoodid üle.

Kui rakenduse aknad ei ole eristatavad

Nii et oleme õppinud fookust andma soovitud rakenduse aknale. Aga mis siis, kui rakendusel on avatud rohkem kui ühe akna? Kellele neist fookust anda? Ülaltoodud skript annab tõenäoliselt fookuse esimesena avatud aknale. Siiski sooviksime suuremat paindlikkust. Tahaksime võimalust meeles pidada, milline aken on vajalik, ja lülituda just sellele aknale.

Idee oli selline: Kui tahame klahvikombinatsiooni jaoks meeles pidada mingit kindlat akent, siis peame vajutama seda kombinatsiooni siis, kui vajalik aken on fookuses. Hiljem, kui seda kombinatsiooni vajutame, saadakse fookus just sellele aknale. Kuni aken ei suletakse või me ei tee selle kombinatsiooni jaoks skripti lähtestamist showwinDetach.

Skripti algoritm showwin on umbes järgmine:

  • Kontrolli, kas oleme juba varem meeles pidanud aken id, millele fookust anda.
    Kui oleme meeles pidanud ja selline aken on endiselt olemas, siis anname fookuse sellele ja lahkume.
  • Vaata, milline aken on praegu fookuses, ja kui see sobib meie sooviga, siis salvestame selle id tulevaseks üleminekuks ning lahkume.
  • Liigume mõne sobiva akna juurde, kui see olemas on, või avame vajaliku rakenduse.

Praegu fookuses oleva akna tuvastamiseks võime kasutada konsooli utiliiti xdotool, muutes selle väljundi kuuekümnendlikku vormi:

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

Bashis midagi mäletamine on kõige lihtsam, luues faile virtuaalses mälusüsteemis. Ubuntu-s on see vaikimisi aktiveeritud /dev/shm/. Muude jaotuste kohta ei oska midagi öelda, loodan, et sarnane asi on ka seal. Saame vaadata käsuga:

$ mount -l | grep tmpfs

Skript loob selles kaustas tühje kaustu, selliseid: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Täiendavalt igal korral, kui seda kutsutakse, loob see symlink /dev/shm/$USER/showwin/showwin_last . Tundub, et /dev/shm/$USER/showwin/$SEARCH_REGEX. See on vajalik, et vajadusel kustutada akna id konkreetse kombinatsiooni jaoks skripti abil showwinDetach.

Mida saaks parandada

Esiteks tuleb skripte käsitsi seadistada. Kindlasti huvitatakse paljusid teist, et vajadus süveneda ja kõike käsitsi teha võivad teha teid isegi kahtlema süsteemi seadistamises. Kui saaks lihtsalt paketi paigaldada ja kõik seada kiiremini, siis võib-olla oleks see mõne populaarsuse saavutanud. Ja võib-olla hakkaks see lõpuks ka standardsetesse distributsioonidesse rakendusi lisama.

Ja võib-olla saaks asju lihtsamaks teha. Kui akna ID järgi saaks teada protsessi ID, mis selle loonud on, ja protsessi ID järgi juurutada, milline käsk selle loonud on, siis saaks seadistamise automatiseerida. Tegelikult ma ei ole uurinud, kas see, mida ma selles lõigus kirjutasin, on võimalik. Asi on selles, et mulle endale sobib see, kuidas see praegu töötab. Kuid kui kellelegi muule tundub see lähenemine mugav ja keegi seda parandab, siis oleksin rõõmus, kui saaksin kasutada paremat lahendust.

Teine probleem, millest ma olen kirjutanud, on see, et mõnel juhul ei saa aknaid üksteisest eristada. Olen seda seni täheldanud ainult Chrome'i / Chromiumi inkognito režiimis, kuid võib-olla on kuskil mujal selline probleem. Äärmuslikul juhul on alati universaalsete kombinatsioonide võimalus. Alt+1Alt+0. Taaskord, ma kasutan Firefoxi ja see probleem ei ole mulle isiklikult oluline.

Ent minu jaoks on tõsine probleem see, et kasutan tööl Mac OS-i ja seal ei ole ma suutelised midagi sarnast seadistama. Utiliidi wmctrl paigaldamine näis olevat võimalik, kuid see ei tööta Mac OS-is adekvaatselt. Mingit võib rakendusega teha, Automatoraga see on nii aeglane, et seda on ebamugav kasutada, isegi kui see töötab. Ma ei suutnud ka klahvikombinatsioone seadistada nii, et need töötaksid kõigis programmides. Kui keegi peaks lahenduse välja mõtlema — oleksin rõõmus, kui saaksin seda kasutada.

Lõpetuseks

Tuli ootamatult palju sõnu sellise, näiliselt lihtsa funktsionaalsuse kohta. Tahtsin edastada idee ja mitte teksti üle koormata, kuid ma ei ole veel välja mõelnud, kuidas seda lihtsamalt rääkida. Võib-olla videos oleks see parem, aga siin ei meeldi seda väga.

Rääkisin natuke, mis toimub skripti taga ja kuidas seda seadistada. Skripti enda detailidesse ma ei laskunud, aga see on vaid 50 rida, sealt saada ei ole keeruline.

Loodan, et keegi proovib seda ideed ja võib-olla isegi hindab seda. Võin öelda, et skript kirjutati umbes kolm aastat tagasi ja see on mulle ÜLIKENDAJALIK. Nii mugav, et tekitab tõsist ebamugavust töötades teiste arvutitega. Ja oma töö MacBookiga.

Link skriptidele

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster