Alternatīvā logu vadība Linux

Es esmu no tiem, kas uz Caps Lock iestata valodas maiņu, jo man slinkums nospiest divas taustiņus, kad varu nospiest vienu. Es pat gribētu divus nevajadzÄ«gus taustiņus: vienu es izmantotu, lai ieslēgtu angļu valodas izkārtojumu, un otro krievu. Bet otrais nevajadzÄ«gais taustiņŔ ir konteksta izvēlnes izsaukÅ”ana, kas ir tik nevajadzÄ«ga, ka daudzi klēpjdatoru ražotāji to izslēdz. Tādēļ jāapmierinās ar to, kas ir.

Un vēl es nevēlos, lai, pārslēdzoties starp logiem, būtu jāmeklē to ikonas uz uzdevumu joslas, jānoķer to nosaukumi, slīdot cauri Alt+Tab, jāpārvieto darba virsmas utt. Es vēlos nospiest taustiņu kombināciju (ideāli vispār vienu, bet nevajadzīgo taustiņu vairs nav) un uzreiz nokļūt vajadzīgajā logā. Piemēram, tā:

  • Alt+F: Firefox
  • Alt+D: Firefox (Privātā pārlÅ«koÅ”ana)
  • Alt+T: Termināls
  • Alt+M: Kalkulators
  • Alt+E: IntelliJ Idea
  • utt.

Turklāt, nospiežot, piemēram, uz Alt+M , es vēlos redzēt kalkulatoru neatkarÄ«gi no tā, vai Ŕī programma Å”obrÄ«d ir palaista. Ja tā ir palaista, tad tās logs jānodod fokusā, bet, ja nav — jāpalaiž vajadzÄ«gā programma un jānodod fokus, kad tā ielādējas.

GadÄ«jumiem, kuri netiek segti ar iepriekŔējo scenāriju, es vēlos, lai bÅ«tu universālas taustiņu kombinācijas, kuras var viegli pieŔķirt jebkuram no atvērtiem logiem. Piemēram, man ir pieŔķirtas 10 kombinācijas no Alt+1 lÄ«dz Alt+0, kuras nav saistÄ«tas ar nevienu programmu. Es varu vienkārÅ”i nospiest Alt+1 un logs, kurÅ” Å”obrÄ«d ir fokusā, saņems fokusu, nospiežot Alt+1.

Zemāk ir apraksts vēl dažām funkcijām un atbilde uz to, kā to var izdarÄ«t. Bet tÅ«lÄ«t brÄ«dināŔu, ka Ŕāda personalizācija var radÄ«t spēcÄ«gu atkarÄ«bu un pat abstinences simptomus, ja jāizmanto Windows, Mac OS vai pat sveÅ”s dators ar Linux.

PatiesÄ«bā, ja padomā, tad mēs ikdienā izmantojam ne tik daudz programmu. PārlÅ«ks, termināls, IDE, kāds ziņojumapmaiņas rÄ«ks, failu menedžeris, kalkulators un, iespējams, tas ir gandrÄ«z viss. NepiecieÅ”amas nav tik daudz taustiņu kombināciju, lai segtu 95% ikdienas uzdevumu.

Programmu gadÄ«jumā, kurām ir atvērti vairāki logi, vienu var noteikt par galveno. Piemēram, atvērtas daudzas IntelliJ Idea logus, kuri pieŔķirti uz Alt+E. Parastajos apstākļos, nospiežot uz Alt+E , tiks atvērts kāds no Ŕīs programmas logiem, visticamāk tas, kurÅ” tika atvērts pirmais. Tomēr, ja nospiež uz Alt+E Kad viena no Ŕīs programmas logiem jau ir fokusā, Å”im logam tiks pieŔķirts galvenais status un tieÅ”i tam tiks nodots fokuss nākamajos kombināciju nospieÅ”anus.

Galveno logu var pārdefinēt. Lai to izdarÄ«tu, vispirms jānokārto kombinācija un pēc tam jāpiedēvē galvenais cits logs. Lai atjaunotu kombināciju, jānosaka pati kombinācija un pēc tam speciālā atjaunoÅ”anas kombinācija, ko man iestatÄ«jusi uz Alt+Backspace. Tas izsauks skriptu, kas atcels galvenā loga pieŔķirÅ”anu iepriekŔējai kombinācijai. Pēc tam var pieŔķirt jaunu galveno logu, kā tas tika aprakstÄ«ts iepriekŔējā odstāvā. Piesaistes atjaunoÅ”ana universālajām kombinācijām notiek lÄ«dzÄ«gi.

Ievads sanāca garÅ”, bet vispirms vēlējos pastāstÄ«t, ko darÄ«sim, un pēc tam izskaidrot, kā to darÄ«t.

Tiem, kam apnicis lasīt

Īsumā, saite uz skriptiem raksta beigās.

Bet tomēr uzreiz uzstādÄ«t un lietot neizdosies. Vispirms bÅ«s jāsaprot, kā skripts atrod nepiecieÅ”amo logu. Bez tā nevarēs parādÄ«t skriptam, kur tieÅ”i jānodod fokuss. Un ir jāsaprot, ko darÄ«t, ja pēkŔņi nav piemērota loga.

Un vēl es negribu detalizēt, kā konfigurēt skriptu izpildi, nospiežot taustiņu kombinācijas. Piemēram, KDE tas ir Sistemā iestatÄ«jumi → ÄŖsinājumtaustiņi → Pielāgotie Ä«sinājumtaustiņi. Citās logu pārvaldÄ«tāja versijās tam arÄ« jābÅ«t.

IepazīŔanās ar wmctrl

Wmctrl — konsoles rÄ«ks interakcijai ar X Window Manager. Tas ir izŔķiroÅ”s programmai skriptā. ApskatÄ«sim, kā to var lietot.

Vispirms izvadīsim atvērto logu sarakstu:

$ 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 Tulkotājs - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Labākie publikācijas par dienu / Habr - Mozilla Firefox (Privāta pārlūkoŔana)
...

Opcija -l izvada visu atvērtu logu sarakstu, un -h pievieno iznākumam klases nosaukumu (skype.Skype, Navigator.Firefox u.tml). Mums te noderēs loga ID (1. kolonna), klases nosaukums (3. kolonna) un loga nosaukums (pēdējā kolonna).

Var mēģināt aktivizēt kādu logu, izmantojot opciju -a:

$ wmctrl -a skype.Skype -x

Ja viss notiek kā plānots, tad ekrānā vajadzētu parādÄ«ties Skype logs. Ja vietā dot opciju -x izmantojiet opciju -i, tā vietā, lai norādÄ«tu klases nosaukumu, varēs norādÄ«t loga id. Problēma ar id ir tāda, ka loga id mainās katru reizi, kad tiek palaista lietotne, un mēs to nevaram paredzēt. No otras puses, Å”is atribÅ«ts nepārprotami identificē logu, kas var bÅ«t svarÄ«gi, ja lietotne atver vairākus logus. Par to nedaudz vēlāk.

Šajā posmā mums jāatceras, ka meklēsim vajadzīgo logu ar regex, izmantojot izvadi wmctrl -lx. Taču tas nenozīmē, ka mums obligāti jāizmanto kaut kas sarežģīts. Parasti pietiek ar klases nosaukumu vai loga nosaukumu.

Principā, pamatidejai jau vajadzētu būt skaidrai. Globālo karsto taustiņu / īsinājumtaustiņu iestatījumos jūsu logu pārvaldniekā iestata vajadzīgo kombināciju, lai izpildītu skriptu.

Kā lietot skriptus

Vispirms jāsagatavo konsoļu utilītas wmctrl un xdotool:

$ sudo apt-get install wmctrl xdotool

Tālāk jāpiesaka skripti un jāpievieno tie $PATH. Es parasti ievietoju tos ~/bin:

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

Ja katalogs ~/bin nebija, tad tas jāizveido un jārestartē (vai jāiziet no sistēmas), citādi ~/bin neiekļausies $PATH. Ja viss pareizi izdarÄ«ts, tad skriptiem vajadzētu bÅ«t pieejamiem no konsoles, un jādarbina automātiskā pabeigÅ”ana ar Tab.

Pamatskripts showwin pieņem 2 parametrus: pirmais ir regex, ar kuru mēs meklēsim vajadzīgo logu, bet otrs parametrs ir komanda, kuru jāizpilda, ja vajadzīgais logs netiek atrasts.

Varat izmēģināt izpildīt skriptu, piemēram:

$ showwin "Mozilla Firefox$" firefox

Ja Firefox ir uzstādīts, tad tam logam vajadzētu tikt pievērstam fokusam. Pat ja Firefox nebija palaižams, tam vajadzētu būt palaistam.

Ja viss izdevās, varat izmēģināt iestatīt komandu izpildi uz kombinācijām. Globālo karsto taustiņu / īsinājumtaustiņu iestatījumos pievienojam:

  • Alt+F: showwin Ā«Mozilla Firefox$Ā» firefox
  • Alt+D: showwin Ā«Mozilla Firefox (Privāta pārlÅ«koÅ”ana)$Ā» Ā«firefox -privāta-logsĀ»
  • 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

Un tā tālāk. Taustiņu kombinācijas un programmas katrs varēs pielāgot sev ērtāk.
Ja viss tika izdarÄ«ts pareizi, tad ar iepriekÅ” minētajām kombinācijām mēs varēsim pārslēgties starp logiem ar vienkārÅ”u taustiņu nospieÅ”anu.

Satraukumu mīļotājiem, parastais logs incognito netiek atŔķirts pēc izvades wmctrl Tas nav iespējams, jo tām ir vienādi klaÅ”u nosaukumi un logu virsraksti. Ieteiktajos regex simbolos N* un I* ir nepiecieÅ”ami tikai tam, lai Å”ie regulārie izteikumi atŔķirtos savā starpā, un tos varētu pieŔķirt par galvenajiem dažādajiem logiem.

Lai atiestatÄ«tu galveno logu iepriekŔējai kombinācijai (faktiski regex, ar kuru showwin tas tika izsaukts pēdējoreiz), ir jāizsauc skripts showwinDetach. Manam skriptam Ŕī kombinācija ir pieŔķirta taustiņu komanda Alt+Backspace.

Å im skriptam showwin ir vēl viena funkcija. Kad tas tiek izsaukts ar vienu parametru (Å”ajā gadÄ«jumā parametrs ir vienkārÅ”i identifikators), tas vispār nepārbauda regex, bet visus logus uzskata par piemērotiem. Tas Ŕķiet nevajadzÄ«gs, tomēr tādā veidā mēs varam pieŔķirt jebkuru logu par galveno un ātri pāriet tieÅ”i uz Å”o logu.

Man ir iestatītas Ŕādas kombinācijas:

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

Tādējādi es varu piesaistÄ«t jebkurus logus kombinācijām Alt+1…Alt+0. VienkārÅ”i nospiežot Alt+1 es piesaistu paÅ”reizējo logu Å”ai kombinācijai. Atcelt piesaisti var, nospiežot Alt+1, un pēc tam Alt+Backspace. Vai arÄ« slēgt logu, tas arÄ« darbojas.

Tālāk es pastāstīŔu nedaudz tehnisko sÄ«kumu. Tos var neizlasÄ«t, bet vienkārÅ”i pamēģināt uzstādÄ«t un paskatÄ«ties. Bet es tomēr ieteiktu iepazÄ«ties ar citu skriptiem pirms to palaiÅ”anas savā datorā.

Kā atŔķirt dažādus logus vienai programmai

Principā, pirmais piemērs "wmctrl -a skype.Skype -x" bija darbīgs un to var izmantot. Bet aplūkosim vēlreiz piemēru ar Firefox, kurā ir atvērti 2 logi:

0x04400003  0 Navigator.Firefox                   N/A Google Tulkotājs - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Labākie raksti dienā / Habr - Mozilla Firefox (Privātā pārlūkoŔana)

Pirmais logs ir parastajā režīmā, bet otrais - Privātā pārlÅ«koÅ”anā. Å os logus bÅ«tu vēlams uzskatÄ«t par dažādām programmām un pārslēgties uz tiem ar dažādām taustiņu kombinācijām.

Ir jāiegūst sarežģītāks skripts, kas pārslēdz logus. Es izmantoju tādu risinājumu: izvadīt visu logu sarakstu, izveidot grep pēc regex, paņemt pirmo rindu, izmantojot head, izvilkt pirmo kolonnu (tā būs loga id) ar cut, pārslēgties uz logu pēc id.

Å eit bÅ«tu joks par regulārajiem izteiksmēm un divām problēmām, bet patiesÄ«bā es neizmantoju neko sarežģītu. Regulārās izteiksmes man nepiecieÅ”amas, lai varētu norādÄ«t rindiņas beigas (simbols ā€ž$ā€) un atŔķirt ā€žMozilla Firefox$ā€ no ā€žMozilla Firefox (Private Browsing)$ā€.

Komanda izskatās apmēram tā:

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

Te var jau nojaust par otro skripta Ä«patnÄ«bu: ja grep neko nav izvadÄ«jis, tad vajadzÄ«gā lietotne nav atvērta, un to ir nepiecieÅ”ams palaist, izpildot komandu no otrā parametra. Un pēc tam periodiski pārbaudÄ«t, vai atvērts nav vajadzÄ«gais logs, lai tam nodotu fokusu. Neesmu iecerējis par to sÄ«kāk runāt, kam vajag, tas var apskatÄ«t avota kodu.

Kad lietotņu logi nav atŔķirami

Un tā, mēs esam iemācÄ«juÅ”ies nodot fokusu vajadzÄ«gās lietotnes logam. Bet ko darÄ«t, ja atvērtā ir vairāk nekā viena loga? Kādām no tām nodot fokusu? IepriekŔējais skripts, visticamāk, nodos fokusu pirmajam atvērtajam logam. Tomēr mēs vēlamies vairāk elastÄ«bas. Vēlētos atcerēties, kurÅ” tieÅ”i logs mums ir nepiecieÅ”ams, un pārslēgties tieÅ”i uz Å”o logu.

Ideja bija Ŕāda: Ja mēs vēlamies atcerēties kādu konkrētu logu taustiņu kombinācijai, tad, kad vajadzÄ«gais logs ir fokusā, ir jānospiež Ŕī kombinācija. Nākotnē, nospiežot Å”o kombināciju, fokuss tiks nodots tieÅ”i Å”im logam. Kamēr logs netiks aizvērts vai mēs nesam veikuÅ”i atsāknēŔanu Å”ai skripta kombinācijai. showwinDetach.

Skripta algoritms showwin izskatās aptuveni tāds:

  • PārbaudÄ«t, vai iepriekÅ” neesam atcerējuÅ”ies loga id, kuram jānodod fokuss.
    Ja esam atcerējuÅ”ies un Ŕāds logs joprojām pastāv, tad nododam tam fokusu un iznākam.
  • Pārbaudām, kurÅ” logs paÅ”laik ir fokusā, un, ja tas atbilst mÅ«su pieprasÄ«jumam, atceramies tā id, lai nākotnē varētu piezvanÄ«t tam un iznākam.
  • Pārslēdzamies uz jebkuru piemērotu logu, ja tas pastāv, vai atveram vajadzÄ«go lietotni.

Uzzināt, kurÅ” logs paÅ”laik ir fokusā, var ar konsoles utilÄ«tu xdotool, pārvērÅ”ot tās izvadi heksadecimālajā formātā:

$ printf "0xx" `xdotool getwindowfocus`

Kas attiecas uz kaut ko atcerēŔanos bash, tas visvieglāk izdarāms, radot failus virtuālajā failu sistēmā, kas atrodas atmiņā. Ubuntu tā ir pievienota pēc noklusējuma /dev/shm/. Par citiem izplatÄ«jumiem neko neteikÅ”u, ceru, ka lÄ«dzÄ«gs arÄ« tur ir. Var paskatÄ«ties ar komandu:

$ mount -l | grep tmpfs

Kods izveidos tukÅ”us direktorijus Å”ajā mapē, piemēram: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Turklāt katra izsaukuma laikā tiks izveidots symlink /dev/shm/$USER/showwin/showwin_last uz /dev/shm/$USER/showwin/$SEARCH_REGEX. Tas bÅ«s nepiecieÅ”ams, lai nepiecieÅ”amÄ«bas gadÄ«jumā ar skriptu dzēstu loga ID konkrētai kombinācijai showwinDetach.

Ko var uzlabot

Pirmkārt, skriptus jāiestata manuāli. Noteikti, ņemot vērā nepiecieÅ”amÄ«bu iedziļināties un darÄ«t daudz ar rokām, daudzi no jums pat neizmantos sistēmas iestatīŔanu. Ja bÅ«tu iespēja vienkārÅ”i uzstādÄ«t pakotni un visu vienkārŔāk iestatÄ«t, iespējams, tas iegÅ«tu noteiktu popularitāti. VarbÅ«t tad arÄ« standarta distributÄ«vos varētu iekļaut Å”o lietotni.

Un, iespējams, to varētu izdarÄ«t vienkārŔāk. Ja pēc loga ID iespējams noskaidrot, kurÅ” ID izveidojis procesu, un pēc procesa ID iespējams uzzināt, kura komanda to izveidojusi, varētu automatizēt iestatīŔanu. PatiesÄ«bā es neesmu pētÄ«jis, vai tas, ko esmu rakstÄ«jis Å”ajā rindkopā, ir iespējams. Man personÄ«gi apmierina tas, kā tas darbojas Å”obrÄ«d. Bet, ja kādam citam, izņemot mani, Ŕī pieeja ŔķitÄ«s ērta un kāds to uzlabos, es labprāt izmantotu labāko risinājumu.

Vēl viena problēma, kā jau iepriekÅ” minēju, ir tā, ka dažos gadÄ«jumos logus nav iespējams atŔķirt vienu no otra. Es to esmu novērojis tikai ar incognito režīmu Chrome/Chromium, bet iespējams, ka tādas situācijas ir arÄ« citur. Visos gadÄ«jumos vienmēr ir varians ar universālām kombinācijām Alt+1…Alt+0. Atkal, es izmantoju Firefox, un personÄ«gi man Ŕī problēma nav bÅ«tiska.

Taču bÅ«tiska problēma man ir tā, ka darbā es izmantoju Mac OS, un tur neko lÄ«dzÄ«gu es nevarēju iestatÄ«t. RÄ«ku wmctrl uzstādÄ«t Ŕķiet bija iespējams, bet tas Mac OS normāli nedarbojas. Dažas lietas var darÄ«t ar lietotni Automator, bet tā tik ļoti aizkavējas, ka to nav ērti izmantot pat tad, kad tā darbojas. Es arÄ« neesmu spējis iestatÄ«t taustiņu kombinācijas tā, lai tās darbotos visās programmās. Ja kāds izdomās risinājumu — būŔu priecÄ«gs to izmantot.

Noslēgumā

Sanācis negaidÄ«ti daudz vārdu, ņemot vērā tādu, Ŕķietami, vienkārÅ”u funkcionalitāti. Vēlējos nodot ideju un nepārslogot tekstu, bet pagaidām neesmu izdomājis, kā to izteikt vienkārŔāk. Iespējams, video formātā bÅ«tu labāk, bet Å”eit tā to ne pārāk mÄ«l.

Es mazliet pastāstÄ«ju par to, kas ir skripta iekÅ”pusē un kā to konfigurēt. Skriptu pats par sevi detalizēti neapskatÄ«ju, bet tas ir tikai 50 rindiņas garÅ”, tāpēc saprast nav grÅ«ti.

Ceru, ka kāds vēl Å”o ideju izmēģinās un, iespējams, pat novērtēs. Par sevi varu teikt, ka skripts tika uzrakstÄ«ts pirms apmēram 3 gadiem un man tas ir Ä»OTI ērti. Tik ērti, ka tas rada nopietnu diskomfortu, strādājot ar citu cilvēku datoriem. Un ar manu darba MacBook.

Saites uz skriptiem

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster