Gestionare alternativă a ferestrelor în Linux

Sunt unul dintre cei care au setat Caps Lock pentru a schimba aspectele pentru că îmi este prea lene să apăs 2 taste când pot apăsa una. Aș dori chiar și 2 chei inutile: aș folosi una pentru a activa aspectul în limba engleză, iar a doua pentru rusă. Dar a doua cheie inutilă este să apelezi meniul contextual, care este atât de inutil încât este decupat de mulți producători de laptopuri. Deci trebuie să te mulțumești cu ceea ce ai.

Și, de asemenea, nu vreau să caut pictogramele lor în bara de activități atunci când schimb ferestrele sau să prind numele când derulez Alt + Tab, parcurgeți desktop-uri etc. Vreau să apăs pe o combinație de taste (ideal, doar una, dar nu mai există taste inutile gratuite) și să ajung imediat la fereastra de care am nevoie. De exemplu astfel:

  • Alt+F: Firefox
  • Alt+D: Firefox (Navigare privată)
  • Alt+T: Terminal
  • Alt+M: Calculator
  • Alt+E: IntelliJ Idea
  • etc.

Mai mult, apăsând, de exemplu, pe Alt+M Vreau să văd calculatorul indiferent dacă acest program rulează în prezent. Dacă rulează, atunci ferestrei sale trebuie să primească focalizare, iar dacă nu, rulați programul dorit și transferați focalizarea când se încarcă.

Pentru cazurile care nu sunt acoperite de scriptul anterior, vreau să am combinații de taste universale care să poată fi atribuite cu ușurință oricăreia dintre ferestrele deschise. De exemplu, am 10 combinații atribuite de la Alt + 1 la Alt + 0, care nu sunt legate de niciun program. Pot doar să dau clic Alt + 1 iar fereastra care este în prezent focalizată va fi focalizată când se face clic Alt + 1.

Sub tăietură există o descriere a mai multor caracteristici și un răspuns la modul în care se poate face acest lucru. Dar vă voi avertiza imediat că o astfel de personalizare „pentru dumneavoastră” poate provoca dependență severă și chiar retragere dacă trebuie să utilizați Windows, Mac OS sau chiar computerul altcuiva cu Linux.

De fapt, dacă te gândești bine, nu folosim atât de multe programe în fiecare zi. Un browser, un terminal, un IDE, un fel de messenger, un manager de fișiere, un calculator și, poate, asta este aproape tot. Nu sunt multe combinații de taste necesare pentru a acoperi 95% din sarcinile de zi cu zi.

Pentru programele care au mai multe ferestre deschise, una dintre ele poate fi desemnată ca principală. De exemplu, aveți mai multe ferestre IntelliJ Idea deschise și alocate Alt + E. În condiții normale, când apăsați Alt + E se va deschide o fereastră a acestui program, cel mai probabil cea care a fost deschisă prima. Cu toate acestea, dacă faceți clic pe Alt + E când una dintre ferestrele acestui program este deja focalizată, atunci această fereastră specială va fi atribuită ca principală și va fi cea care va primi focalizarea atunci când sunt apăsate combinațiile ulterioare.

Fereastra principală poate fi reatribuită. Pentru a face acest lucru, trebuie mai întâi să resetați combinația și apoi să îi atribuiți o altă fereastră ca fereastră principală. Pentru a reseta o combinație, trebuie să apăsați combinația în sine, apoi o combinație specială de resetare, o am atribuită la Alt + Backspace. Acest lucru va apela un script care va anula atribuirea ferestrei principale pentru combinația anterioară. Și apoi puteți aloca o nouă fereastră principală așa cum este descris în paragraful anterior. Resetarea unei ferestre conectate la combinații universale are loc în același mod.

Introducerea s-a dovedit a fi lungă, dar am vrut să spun mai întâi ce vom face și apoi să explic cum să facem.

Pentru cei care s-au săturat de citit

Pe scurt, linkul către scripturi este la sfârșitul articolului.

Dar tot nu îl veți putea instala și utiliza imediat. Mai întâi va trebui să vă dați seama cum scriptul găsește fereastra dorită. Fără aceasta, nu va fi posibil să spunem scriptului unde exact trebuie transferat focalizarea. Și trebuie să înțelegeți ce să faceți dacă dintr-o dată nu este găsită o fereastră potrivită.

Și nu mă voi concentra asupra modului de configurare a execuției scripturilor apăsând combinații de taste. De exemplu, în KDE este în Setări sistem → Comenzi rapide → Comenzi rapide personalizate. Acest lucru ar trebui să fie și cazul altor manageri de ferestre.

Vă prezentăm wmctrl

Wmctrl — utilitar de consolă pentru interacțiunea cu X Window Manager. Acesta este programul cheie pentru script. Să aruncăm o privire rapidă asupra modului în care îl puteți folosi.

Mai întâi, să afișăm o listă de ferestre deschise:

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

Opțiune -l afișează o listă cu toate ferestrele deschise și -X adaugă numele clasei la ieșire (skype.Skype, Navigator.Firefox etc). Aici avem nevoie de id-ul ferestrei (coloana 1), numele clasei (coloana 3) și numele ferestrei (ultima coloană).

Puteți încerca să activați o fereastră folosind opțiunea -a:

$ wmctrl -a skype.Skype -x

Dacă totul a decurs conform planului, pe ecran ar trebui să apară fereastra Skype. Dacă în loc de opțiune -x utilizați opțiunea -i, apoi în loc de numele clasei puteți specifica id-ul ferestrei. Problema cu id-ul este că id-ul ferestrei se schimbă de fiecare dată când se lansează aplicația și nu îl putem ști dinainte. Pe de altă parte, acest atribut identifică în mod unic o fereastră, ceea ce poate fi important atunci când o aplicație deschide mai multe ferestre. Mai multe despre asta un pic mai departe.

În această etapă trebuie să ne amintim că vom căuta fereastra dorită folosind regex după ieșire wmctrl -lx. Dar asta nu înseamnă că trebuie să folosim ceva complicat. De obicei, numele clasei sau numele ferestrei este suficient.

Practic, ideea principală ar trebui să fie deja clară. În setările globale de taste rapide/comenzi rapide pentru managerul de ferestre, configurați combinația necesară pentru a executa scriptul.

Cum se utilizează scripturile

Mai întâi trebuie să instalați utilitarele consolei wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Apoi, trebuie să descărcați scripturile și să le adăugați $ PATH. De obicei le pun ~/bin:

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

Dacă directorul ~/bin nu a fost acolo, atunci trebuie să îl creați și să reporniți (sau să vă reconectați), în caz contrar ~/bin nu va lovi $ PATH. Dacă totul este făcut corect, atunci scripturile ar trebui să fie accesibile din consolă și completarea Tab ar trebui să funcționeze.

Scenariul principal showwin ia 2 parametri: primul este un regex, prin care vom căuta fereastra necesară, iar al doilea parametru este o comandă care trebuie executată dacă fereastra necesară nu este găsită.

Puteți încerca să rulați un script, de exemplu:

$ showwin "Mozilla Firefox$" firefox

Dacă Firefox este instalat, ar trebui să i se concentreze fereastra. Chiar dacă Firefox nu rula, ar fi trebuit să înceapă.

Dacă funcționează, atunci puteți încerca să configurați execuția comenzilor pe combinații. În setările globale pentru taste rapide/comenzi rapide, adăugați:

  • Alt+F: showwin „Mozilla Firefox$” firefox
  • Alt+D: showwin „Mozilla Firefox (Navigare privată)$” „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” idee.sh

etc. Toată lumea poate configura combinațiile de taste și software-ul după cum crede de cuviință.
Dacă totul a funcționat corect, atunci folosind combinațiile de mai sus vom putea comuta între ferestre prin simpla apăsare a tastelor.

Voi dezamăgi iubitorii de crom: poate distinge incognito o fereastră obișnuită după rezultatul său wmctrl Nu poți, au aceleași nume de clasă și titluri de fereastră. În regex-ul propus, caracterele N* și I* sunt necesare doar pentru ca aceste expresii regulate să difere unele de altele și să poată fi atribuite ca ferestre principale.

Pentru a reseta fereastra principală a combinației anterioare (de fapt pentru regex, care showwin numit ultima dată) trebuie să apelați scriptul showwinDetach. Am acest script alocat unei combinații de taste Alt + Backspace.

La scenariu showwin mai este o functie. Când este apelat cu un singur parametru (în acest caz, parametrul este doar un identificator), nu verifică deloc regex-ul, dar consideră că toate ferestrele sunt potrivite. În sine, acest lucru pare inutil, dar în acest fel putem desemna orice fereastră ca principală și putem trece rapid la acea fereastră.

Am configurate următoarele combinații:

  • Alt+1: afișați „CustomKey1”
  • Alt+2: afișați „CustomKey2”
  • ...
  • Alt+0: afișați „CustomKey0”
  • Alt+Backspace: showwinDetach

În acest fel pot lega orice fereastră de combinații Alt + 1...Alt + 0. Doar făcând clic Alt + 1 Leagă fereastra curentă la această combinație. Pot anula legarea făcând clic Alt + 1, și apoi Alt + Backspace. Sau închide fereastra, funcționează și asta.

În continuare vă voi spune câteva detalii tehnice. Nu trebuie să le citiți, ci doar încercați să le configurați și să vedeți. Dar tot recomand să înțelegeți scripturile altora înainte de a le rula pe computerul dvs. :).

Cum se face distincția între diferite ferestre ale aceleiași aplicații

În principiu, primul exemplu „wmctrl -a skype.Skype -x” funcționa și poate fi folosit. Dar să ne uităm din nou la exemplul cu Firefox, în care sunt deschise 2 ferestre:

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

Prima fereastră este modul normal, iar a doua este Navigare privată. Aș dori să consider aceste ferestre ca aplicații diferite și să trec la ele folosind diferite combinații de taste.

Este necesar să complicăm scriptul care comută ferestrele. Am folosit această soluție: afișați o listă cu toate ferestrele, faceți grep prin regex, luați prima linie cu cap, obțineți prima coloană (acesta va fi id-ul ferestrei) folosind tăiat, comutați la fereastră după id.

Ar trebui să existe o glumă despre expresiile regulate și două probleme, dar de fapt nu folosesc nimic complicat. Am nevoie de expresii regulate, astfel încât să pot indica sfârșitul liniei (simbolul „$”) și să pot distinge „Mozilla Firefox$” de „Mozilla Firefox (Navigare privată)$”.

Comanda arată cam așa:

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

Aici puteți deja ghici despre a doua caracteristică a scriptului: dacă grep nu returnează nimic, atunci aplicația dorită nu este deschisă și trebuie să o porniți executând comanda de la al doilea parametru. Și apoi verificați periodic dacă fereastra necesară s-a deschis pentru a transfera focalizarea asupra acesteia. Nu mă voi concentra asupra acestui lucru; oricine are nevoie de el se va uita la surse.

Când ferestrele aplicației nu se pot distinge

Deci, am învățat cum să transferăm focalizarea în fereastra aplicației dorite. Dar ce se întâmplă dacă o aplicație are mai multe ferestre deschise? Căruia ar trebui să-i concentrez? Cel mai probabil, scriptul de mai sus se va transfera în prima fereastră deschisă. Cu toate acestea, am dori mai multă flexibilitate. Aș dori să pot să-mi amintesc de ce fereastră avem nevoie și să comut la acea fereastră.

Ideea a fost următoarea: dacă vrem să ne amintim o anumită fereastră pentru o combinație de taste, atunci trebuie să apăsăm această combinație atunci când fereastra dorită este focalizată. În viitor, când apăsați această combinație, accentul va fi acordat acestei ferestre. Până când se închide fereastra sau facem o resetare pentru această combinație de script showwinDetach.

Algoritm de script showwin ceva de genul:

  • Verificați dacă ne-am amintit anterior id-ul ferestrei la care ar trebui să fie transferat focalizarea.
    Dacă vă amintiți și o astfel de fereastră încă există, atunci ne concentrăm asupra ei și ieșim.
  • Ne uităm la ce fereastră este în prezent focalizată și, dacă se potrivește cu solicitarea noastră, amintiți-vă id-ul pentru a merge la ea în viitor și a ieși.
  • Mergem la cel puțin o fereastră potrivită dacă există sau deschidem aplicația dorită.

Puteți afla ce fereastră este în prezent focalizată folosind utilitarul consolei xdotool, conversia rezultatului său în format hexazecimal:

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

Cel mai simplu mod de a vă aminti ceva în bash este să creați fișiere într-un sistem de fișiere virtual situat în memorie. În Ubuntu, aceasta este activată implicit în /dev/shm/. Nu pot spune nimic despre alte distribuții, sper să fie și ceva asemănător. Puteți căuta cu comanda:

$ mount -l | grep tmpfs

Scriptul va crea directoare goale în acest folder, astfel: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. În plus, de fiecare dată când este apelat, va crea o legătură simbolică /dev/shm/$USER/showwin/showwin_last pe /dev/shm/$USER/showwin/$SEARCH_REGEX. Acest lucru va fi necesar pentru a elimina, dacă este necesar, id-ul ferestrei pentru o anumită combinație folosind un script showwinDetach.

Ce poate fi îmbunătățit

În primul rând, scripturile trebuie configurate manual. Cu siguranță, din cauza nevoii de a aprofunda și de a face multe cu mâinile tale, mulți dintre voi nici măcar nu veți încerca să configurați sistemul. Dacă ar fi posibil să instalați pur și simplu pachetul și să configurați totul mai ușor, atunci poate că ar câștiga o oarecare popularitate. Și apoi uite, aplicația va fi lansată în distribuții standard.

Și poate că se poate face mai ușor. Dacă prin id-ul unei ferestre poți afla id-ul procesului care a creat-o, iar după id-ul procesului poți afla ce comandă a creat-o, atunci ar fi posibilă automatizarea setării. De fapt, nu am înțeles dacă ceea ce am scris în acest paragraf este posibil. Cert este că eu personal sunt mulțumit de modul în care funcționează acum. Dar dacă altcineva decât mine consideră întreaga abordare convenabilă și cineva o îmbunătățește, atunci voi fi bucuros să folosesc o soluție mai bună.

O altă problemă, așa cum am scris deja, este că, în unele cazuri, ferestrele nu pot fi distinse unele de altele. Până acum am observat asta doar cu incognito în crom/crom, dar poate că există ceva similar în altă parte. Ca ultimă soluție, există întotdeauna opțiunea de combinații universale Alt + 1...Alt + 0. Din nou, folosesc Firefox și pentru mine personal această problemă nu este semnificativă.

Dar problema semnificativă pentru mine este că folosesc Mac OS pentru muncă și nu am putut configura așa ceva acolo. utilitate wmctrl Cred că am reușit să-l instalez, dar nu funcționează cu adevărat pe Mac OS. Se poate face ceva cu aplicația Automator, dar este atât de lent încât nu este convenabil de utilizat chiar și atunci când funcționează. De asemenea, nu am putut configura combinații de taste astfel încât să funcționeze în toate programele. Dacă cineva vine brusc cu o soluție, voi fi bucuros să o folosesc.

În loc de concluzie

S-a dovedit a fi un număr neașteptat de mare de cuvinte pentru o funcționalitate atât de aparent simplă. Am vrut să transmit ideea și să nu supraîncărcăm textul, dar încă nu mi-am dat seama cum să o spun mai simplu. Poate că ar fi mai bine în format video, dar oamenilor nu le place așa aici.

Am vorbit puțin despre ce se află sub capota scriptului și cum să-l configurez. Nu am intrat în detalii despre scenariul în sine, dar are doar 50 de rânduri, așa că nu este greu de înțeles.

Sper că altcineva va încerca această idee și poate chiar o va aprecia. Pot spune despre mine că scenariul a fost scris acum vreo 3 ani și îmi este FOARTE convenabil. Atât de convenabil încât provoacă un disconfort grav atunci când lucrezi cu computerele altor persoane. Și cu un MacBook funcțional.

Link către scripturi

Sursa: www.habr.com

Adauga un comentariu