Sunt unul dintre cei care folosesc Caps Lock pentru a schimba limba, pentru că îmi e lene să apas două taste când pot utiliza una. Aș dori chiar două taste inutile: una ar fi pentru activarea limbii engleze, iar cealaltă pentru rusa. Însă a doua tastă inutilă este activarea meniului contextual, care este atât de inutilă încât este eliminată de mulți producători de laptopuri. Așa că trebuie să mă mulțumesc cu ceea ce am.
De asemenea, nu vreau să caut icoanele ferestrelor pe bara de activități când schimb feroneriile, privesc titlurile în timp ce mă derulez prin Alt+Tab, prin birouri, etc. Vreau să apăs o combinație de taste (ideal, o singură tastă, dar deja nu mai am taste inutile libere) și să ajung imediat la fereastra dorită. De exemplu așa:
- Alt+F: Firefox
- Alt+D: Firefox (Navigare privată)
- Alt+T: Terminal
- Alt+M: Calculator
- Alt+E: IntelliJ Idea
- etc.
Astfel, la apăsarea, de exemplu, a Alt+M doresc să văd calculatorul, indiferent dacă acest program este deschis în acel moment. Dacă este deschis, fereastra sa trebuie să primească focus, iar dacă nu, să deschid programul dorit și să-i transfer focusul atunci când se încarcă.
Pentru cazurile care nu sunt acoperite de scenariul anterior, vreau să am combinații de taste universale, la care să pot atribui cu ușurință orice feronerie deschisă. De exemplu, am atribuit 10 combinații de la Alt+1 la Alt+0, care nu sunt legate de niciun program. Pot pur și simplu să apăs Alt+1 și fereastra care este acum în focus va prelua focusul la apăsarea Alt+1.
Sub acest text, descriu încă câteva funcții și răspund la întrebarea cum se poate face acest lucru. Însă, voi avertiza că o astfel de personalizare "după preferințele personale" poate provoca o dependență puternică și chiar „sevraj” în cazul în care e necesar să folosești Windows, Mac OS sau chiar un alt computer cu Linux.
De fapt, dacă ne gândim, nu folosim atât de multe programe în viața de zi cu zi. Browser, terminal, IDE, un fel de mesager, manager de fișiere, calculator și, cred că asta e tot. Nu ai nevoie de atât de multe combinații de taste pentru a acoperi 95% dintre sarcinile zilnice.
Pentru programele cu feronerie deschisă, unul dintre ele poate fi desemnat principal. De exemplu, dacă ai mai multe feronerie IntelliJ Idea deschise, atribuite la Alt+E. În condiții normale, la apăsarea Alt+E se va deschide o feronerie a acestui program, cel mai probabil cea care a fost deschisă prima. Totuși, dacă apesi pe Alt+E Când una dintre feroneriile acestui program este deja în focus, atunci aceasta va fi desemnată ca fereastra principală și anume ei îi va fi transmis focusul la următoarele apăsări ale combinației.
Fereastra principală poate fi redenumită. Pentru aceasta, combinația trebuie mai întâi resetată, iar apoi o altă fereastră trebuie desemnată drept principală. Pentru a reseta combinația, trebuie să apăsați combinația în sine, apoi o combinație specială de resetare, pe care eu am desemnat-o la Alt+Backspace. Acest lucru va apela un script care va anula desemnarea feronerie principale pentru combinația anterioară. Apoi, se poate desemna o nouă fereastră principală așa cum a fost descris în paragraful anterior. Resetarea feroneriei asociate la combinațiile universale se face în mod similar.
Introducerea a ieșit puțin mai lungă, dar am vrut mai întâi să explic ce vom face, iar apoi să explic cum să facem.
Pentru cei care s-au săturat să citească
Pe scurt, linkul către scripturi este la sfârșitul articolului.
Dar, oricum, nu se poate să instalați și să folosiți imediat. Va trebui mai întâi să înțelegeți cum găsește scriptul fereastra necesară. Fără asta, nu se poate indica scriptului unde anume trebuie să transmită focusul. Și trebuie să înțelegem ce să facem dacă, dintr-o dată, nu s-a găsit fereastra potrivită.
De asemenea, nu voi insista asupra modului de configurare al execuției scripturilor la apăsarea combinațiilor de taste. De exemplu, în KDE este în System Settings → Shortcuts → Custom Shortcuts. Este posibil să existe și așa ceva în alte gestionare de feronerie.
Introducere în wmctrl
Wmctrl — utilitar de linie de comandă pentru interacțiunea cu X Window Manager. Aceasta este programul cheie pentru script. Să ne uităm rapid la modul în care poate fi utilizat.
Mai întâi, să afișăm lista feroneriei 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 Traducer - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Cele mai bune publicații de ieri / Habr - Mozilla Firefox (Navigare privată)
...Opțiune -l afișează lista tuturor feronerii deschise, iar -h adaugă la ieșire denumirea clasei (skype.Skype, Navigator.Firefox și așa mai departe). Aici ne va fi necesar id-ul feroneriei (coloana 1), numele clasei (coloana 3) și denumirea feroneriei (ultimulă coloană).
Putem încerca să activăm o fereastră folosind opțiunea -a:
$ wmctrl -a skype.Skype -xDacă totul a mers conform planului, atunci pe ecran ar trebui să apară fereastra Skype. Dacă în loc de opțiunea -x folosiți opțiunea -i, a în locul numelui clasei, putem specifica id-ul ferestrei. Problema cu id-ul este că acesta se schimbă la fiecare pornire a aplicației și nu putem să-l știm dinainte. Pe de altă parte, acest atribut indică în mod clar fereastra, ceea ce poate fi important când aplicația deschide mai multe feronțe. Despre aceasta, mai încolo.
În acest stadiu, trebuie să ne amintim că vom căuta fereastra dorită folosind regex pe baza ieșirii wmctrl -lx. Dar acest lucru nu înseamnă că trebuie să folosim neapărat ceva complicat. De obicei, numele clasei sau titlul ferestrei sunt suficiente.
În principiu, ideea de bază ar trebui să fie deja clară. În setările de global hotkeys/shortcuts pentru managerul dumneavoastră de feronțe, configurăm combinația dorită pentru a executa scriptul.
Cum să folosești scripturile
Pentru început, trebuie să instalăm utilitarele din linia de comandă wmctrl și xdotool:
$ sudo apt-get install wmctrl xdotoolApoi, trebuie să descărcăm scripturile și să le adăugăm în $PATH. De obicei, le plasez în ~/bin:
$ cd ~/bin
$ git clone https://github.com/masyamandev/Showwin-script.git
$ ln -s ./Showwin-script/showwin showwin
$ ln -s ./Showwin-script/showwinDetach showwinDetachDacă folderul ~/bin nu a existat, trebuie să-l creăm și să ne reconectăm (sau să ne reconectăm), altfel ~/bin nu va fi disponibil în $PATH. Dacă totul a fost făcut corect, scripturile ar trebui să fie disponibile din linia de comandă și completarea automată să funcționeze cu Tab.
Scriptul principal showwin acceptă 2 parametri: primul este regex-ul pe baza căruia vom căuta fereastra dorită, iar al doilea parametru este comanda care trebuie executată dacă fereastra dorită nu a fost găsită.
Putem încerca să executăm scriptul, de exemplu:
$ showwin "Mozilla Firefox$" firefoxDacă Firefox este instalat, fereastra acestuia ar trebui să primească focus. Chiar dacă Firefox nu a fost lansat, acesta ar trebui să se deschidă.
Dacă a funcționat, putem încerca să configurăm executarea comenzilor pe combinații. În setările de global hotkeys/shortcuts, adăugăm:
- Alt+F: showwin «Mozilla Firefox$» firefox
- Alt+D: showwin «Mozilla Firefox (Private 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
Și așa mai departe. Fiecare poate configura combinațiile de taste și software-ul după bunul plac.
Dacă totul a fost configurat corect, putem comuta între feronțe prin simpla apăsare a tastelor indicate mai sus.
Îi dezamăgesc pe iubitorii Chrome: o fereastră obișnuită nu poate fi distinsă de o fereastră incognito în funcție de ieșire. wmctrl nu poți, pentru că au denumiri de clase și titluri de fereastră identice. În regex-urile propuse, simbolurile N* și I* sunt necesare doar pentru a face ca aceste expresii regulate să se diferentieze una de cealaltă, permițându-le să fie atribuite ferestrelor principale diferite.
Pentru a reseta fereastra principală a combinației anterioare (de fapt pentru regex-ul care showwin a fost apelat ultima dată) trebuie să apelăm scriptul showwinDetach. Am alocat această script pe o combinație de taste Alt+Backspace.
Scriptul showwin are o altă funcție. Când este apelat cu un singur parametru (în acest caz, parametrul este pur și simplu un identificator), atunci nu verifică deloc regex-ul, ci consideră toate ferestrelor potrivite. Acest lucru pare inutil, totuși, astfel putem aloca orice fereastră ca principală și să comutăm rapid la această fereastră.
Am configurat următoarele combinații:
- Alt+1: showwin „CustomKey1”
- Alt+2: showwin „CustomKey2”
- …
- Alt+0: showwin „CustomKey0”
- Alt+Backspace: showwinDetach
Astfel pot asocia orice fereastră cu combinațiile Alt+1…Alt+0. Pur și simplu apăsând Alt+1 asociez fereastra curentă cu această combinație. Pot anula asocierea apăsând Alt+1, apoi Alt+Backspace. Sau pot închide fereastra, asta funcționează de asemenea.
În continuare, voi relata câteva detalii tehnice. Nu trebuie să le citești, poți încerca pur și simplu să le configurezi și să vezi. Dar totuși aș recomanda să te familiarizezi cu scripturile altora înainte de a le rula pe computerul tău :。
Cum să distingi ferontele diferite ale aceleași aplicații
În principiu, primul exemplu „wmctrl -a skype.Skype -x” a fost funcțional și poate fi utilizat. Dar să ne uităm din nou la exemplul cu Firefox, în care sunt deschise 2 feronțe:
0x04400003 0 Navigator.Firefox N/A Google Traducător - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Cele mai bune postări în ultimele 24 de ore / Habr - Mozilla Firefox (Navigare Privată)Prima fereastră - modul normal, iar a doua - Navigare Privată. Aceasta ar trebui să fie considerată feronțe diferite și să putem comuta între ele cu combinații de taste diferite.
Trebuie să complicăm scriptul care comută feronțele. Am folosit următoarea soluție: să listăm toate feronțele, să facem grep prin regex, să luăm prima linie cu ajutorul head, să extrag prima coloană (acesta va fi id-ul feronței) folosind cut, să comutăm la fereastră după id.
Aici ar trebui să fie o glumă despre expresiile regulate și două probleme, dar de fapt nu folosesc nimic complex. Expresiile regulate sunt necesare pentru a putea indica sfârșitul liniei (simbolul „$”) și pentru a distinge „Mozilla Firefox$” de „Mozilla Firefox (Navigare Privată)$”.
Echipa arată cam așa:
$ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`Aici deja putem ghici a doua caracteristică a scriptului: dacă grep nu a returnat nimic, înseamnă că aplicația dorită nu este deschisă și trebuie să o lansăm, executând comanda din al doilea parametru. Apoi, verificăm periodic dacă fereastra dorită s-a deschis, pentru a-i transfera focalizarea. Nu voi insista pe acest subiect, cine are nevoie, va verifica sursele.
Când feronțele aplicației nu sunt distinse
Așadar, am învățat să transferăm focalizarea pe fereastra aplicației dorite. Dar ce facem dacă sunt deschise mai multe feronțe ale aplicației? La care dintre ele ar trebui să transferăm focalizarea? Scriptul de mai sus va transfera cel mai probabil focalizarea primei feronțe deschise. Totuși, am dori mai multă flexibilitate. Ne-ar plăcea să putem reține exact care fereastră ne trebuie și să ne comutăm exact la acea fereastră.
Ideea era aceasta: Dacă dorim să reținem pentru o combinație de taste o fereastră specifică, trebuie să apăsăm această combinație atunci când fereastra dorită este în focalizare. Ulterior, când apăsăm această combinație, focalizarea va fi transferată exact acestei feronțe. Până când fereastra nu se va închide sau nu vom reseta pentru această combinație a scriptului. showwinDetach.
Algoritmul scriptului showwin este cam așa:
- Verificăm dacă nu am reținut anterior id-ul feronței la care trebuie să transferăm focalizarea.
Dacă am reținut și acea fereastră încă există, atunci transferăm focalizarea către ea și ieșim. - Vedem ce fereastră este acum în focalizare și, dacă se potrivește cererii noastre, îi reținem id-ul pentru a reveni la ea mai târziu și ieșim.
- Trebuie să ne mutăm la orice fel de fereastră potrivită, dacă există, sau să deschidem aplicația necesară.
Putem afla ce fereastră este acum în focalizare cu ajutorul utilitarului de consolă xdotool, convertind ieșirea sa în format hexazecimal:
$ printf "0xx" `xdotool getwindowfocus`Este mai ușor să memorezi ceva în bash, creând fișiere în sistemul de fișiere virtual aflat în memorie. În Ubuntu, acesta este conectat în mod implicit în /dev/shm/. Nu pot spune nimic despre alte distribuții, sper că ceva similar există și acolo. Poți verifica cu comanda:
$ mount -l | grep tmpfsScriptul va crea directoare goale în această folder, precum acestea: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. În plus, la fiecare apel va crea un symlink /dev/shm/$USER/showwin/showwin_last pe /dev/shm/$USER/showwin/$SEARCH_REGEX. Acest lucru va fi necesar pentru a elimina, dacă este nevoie, id-ul feronței pentru o combinație specifică cu ajutorul scriptului. showwinDetach.
Ce ar putea fi îmbunătățit
În primul rând, scripturile trebuie configurate manual. Cu siguranță, din cauza necesității de a înțelege și de a face multe lucruri manual, mulți dintre voi nu vor încerca nici măcar să configureze sistemul. Dacă ar exista posibilitatea de a instala pur și simplu un pachet și de a configura totul mai ușor, atunci, poate, ar câștiga o oarecare popularitate. Și atunci, cine știe, poate că aplicația ar fi inclusă și în distribuțiile standard.
Și, poate, s-ar putea face mai simplu. Dacă, după ID-ul ferestrei, ai putea afla ID-ul procesului care a creat-o, iar prin ID-ul procesului, ai putea identifica ce comandă l-a generat, ai putea automatiza configurarea. De fapt, nu m-am aprofundat în această posibilitate. Ceea ce vreau să spun este că, personal, sunt mulțumit de modul în care funcționează acum. Dar dacă altcineva ar găsi abordarea utilă și ar îmbunătăți-o, aș folosi cu plăcere soluția mai bună.
O altă problemă, așa cum am menționat, este că în anumite cazuri ferontele nu pot fi distinse una de alta. Până acum am observat asta doar cu incognito în chrome/chromium, dar, poate, există și alte cazuri similare. În cel mai rău caz, există întotdeauna opțiunea combinațiilor universale. Alt+1…Alt+0. Din nou, folosesc Firefox și, personal, această problemă nu este semnificativă pentru mine.
O problemă semnificativă pentru mine este că, din punct de vedere profesional, folosesc Mac OS și nu am reușit să configurez nimic similar acolo. Utilitarul wmctrl pare să fi fost instalat, dar acesta nu funcționează corespunzător pe Mac OS. Există ceva ce pot face cu aplicația Automator, dar aceasta este atât de lentă încât nu este confortabil să o folosești chiar și când funcționează. Nu am reușit nici să configurez combinațiile de taste astfel încât să funcționeze în toate programele. Dacă cineva găsește o soluție, aș fi bucuros să o folosesc.
În concluzie
Am scris, fără să vreau, destul de multe cuvinte pentru o funcționalitate care părea atât de simplă. Am vrut să transmit ideea fără a încărca textul, dar până acum nu am găsit o modalitate de a explica mai simplu. Poate că în format video ar fi mai bine, dar aici nu este foarte apreciat.
Am împărtășit puțin despre ce se află sub capotă în script și cum se configurează acesta. Nu m-am adâncit în detalii despre script, dar are doar 50 de linii, așa că nu este greu de înțeles.
Sper că cineva va încerca această idee și, poate, o va aprecia. Pot spune că scriptul a fost scris acum vreo 3 ani și mi-e EXTREM de util. Atât de util, încât îmi provoacă un disconfort serios atunci când lucrez pe computerele altora. Și pe MacBook-ul de la muncă.
Sursa: habr.com
