Alternativno upravljanje prozorima u Linuxu

Ja sam jedan od onih koji postavlja Caps Lock za promjenu izgleda jer sam previše lijen da pritisnem 2 tipke kada mogu pritisnuti jednu. Čak bih želio 2 nepotrebne tipke: jednu bih koristio za uključivanje engleskog rasporeda, a drugu za ruski. Ali druga nepotrebna tipka je pozivanje kontekstnog izbornika, koji je toliko nepotreban da ga mnogi proizvođači prijenosnih računala izrezuju. Dakle, morate biti zadovoljni onim što imate.

Također ne želim tražiti njihove ikone na programskoj traci kada mijenjam prozore ili hvatati imena dok listam Alt + Tab, listanje po radnim površinama itd. Želim pritisnuti kombinaciju tipki (idealno samo jednu, ali više nema besplatnih nepotrebnih tipki) i odmah doći do prozora koji mi treba. Na primjer ovako:

  • Alt+F: Firefox
  • Alt+D: Firefox (Privatno pregledavanje)
  • Alt+T: terminal
  • Alt+M: Kalkulator
  • Alt+E: IntelliJ ideja
  • itd.

Štoviše, pritiskom na npr. na Alt+M Želim vidjeti kalkulator bez obzira na to je li ovaj program trenutno pokrenut. Ako je pokrenut, onda je njegovom prozoru potrebno dati fokus, a ako nije, pokrenite željeni program i prebacite fokus kada se učita.

Za slučajeve koji nisu obuhvaćeni prethodnom skriptom, želim imati univerzalne kombinacije tipki koje se lako mogu dodijeliti bilo kojem od otvorenih prozora. Na primjer, imam 10 dodijeljenih kombinacija iz Alt + 1 na Alt + 0, koji nisu vezani ni za kakve programe. Mogu samo kliknuti Alt + 1 a prozor koji je trenutno u fokusu dobit će fokus kada se klikne Alt + 1.

Ispod presjeka nalazi se opis još nekoliko značajki i odgovor kako se to može učiniti. Ali odmah ću vas upozoriti da takva prilagodba "za sebe" može izazvati tešku ovisnost, pa čak i povlačenje ako trebate koristiti Windows, Mac OS ili čak tuđe računalo s Linuxom.

Zapravo, ako bolje razmislite, ne koristimo toliko programa na dnevnoj bazi. Preglednik, terminal, IDE, neka vrsta glasnika, upravitelj datoteka, kalkulator i, možda, to je gotovo sve. Nema mnogo kombinacija tipki potrebnih za pokrivanje 95% svakodnevnih zadataka.

Za programe koji imaju više otvorenih prozora, jedan od njih može biti označen kao glavni. Na primjer, imate više prozora IntelliJ Idea otvorenih i dodijeljenih Alt + E. U normalnim uvjetima, kada pritisnete Alt + E otvorit će se neki prozor ovog programa, najvjerojatnije onaj koji je prvi otvoren. Međutim, ako kliknete na Alt + E kada je jedan od prozora ovog programa već u fokusu, tada će taj određeni prozor biti dodijeljen kao glavni i on će biti onaj koji će biti fokusiran kada se pritisnu sljedeće kombinacije.

Glavni prozor se može promijeniti. Da biste to učinili, prvo morate resetirati kombinaciju, a zatim joj dodijeliti drugi prozor kao glavni. Za poništavanje kombinacije potrebno je pritisnuti samu kombinaciju, a zatim posebnu kombinaciju za poništavanje, dodijeljena mi je Alt+Backspace. Ovo će pozvati skriptu koja će poništiti dodjelu glavnog prozora za prethodnu kombinaciju. Zatim možete dodijeliti novi glavni prozor kao što je opisano u prethodnom paragrafu. Ponovno postavljanje povezanog prozora na univerzalne kombinacije događa se na isti način.

Uvod je ispao dugačak, ali htio sam prvo reći što ćemo raditi, a zatim objasniti kako to učiniti.

Za one koji su umorni od čitanja

Ukratko, poveznica na skripte nalazi se na kraju članka.

Ali i dalje ga nećete moći odmah instalirati i koristiti. Prvo ćete morati shvatiti kako skripta pronalazi željeni prozor. Bez toga neće biti moguće reći skripti gdje točno treba prenijeti fokus. I morate razumjeti što učiniti ako se iznenada ne pronađe odgovarajući prozor.

I neću se usredotočiti na to kako konfigurirati izvršavanje skripti pritiskom na kombinacije tipki. Na primjer, u KDE-u to je u postavkama sustava → Prečaci → Prilagođeni prečaci. To bi također trebao biti slučaj u drugim upraviteljima prozora.

Predstavljamo wmctrl

Wmctrl — konzolni uslužni program za interakciju s X Window Managerom. Ovo je ključni program za skriptu. Pogledajmo na brzinu kako ga možete koristiti.

Prvo, prikažimo popis otvorenih prozora:

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

Opcija -l prikazuje popis svih otvorenih prozora i -NS dodaje ime klase izlazu (skype.Skype, Navigator.Firefox itd). Ovdje nam je potreban ID prozora (kolona 1), naziv klase (kolona 3) i naziv prozora (zadnja kolona).

Možete pokušati aktivirati neki prozor pomoću opcije -a:

$ wmctrl -a skype.Skype -x

Ako je sve išlo po planu, na ekranu bi se trebao pojaviti Skype prozor. Ako umjesto opcije -x koristiti opciju -i, tada umjesto naziva klase možete navesti ID prozora. Problem s id-om je što se id prozora mijenja svaki put kada se aplikacija pokrene i to ne možemo znati unaprijed. S druge strane, ovaj atribut jedinstveno identificira prozor, što može biti važno kada aplikacija otvara više od jednog prozora. Više o ovome malo dalje.

U ovoj fazi moramo zapamtiti da ćemo željeni prozor tražiti pomoću regularnog izraza prema izlazu wmctrl -lx. Ali to ne znači da moramo koristiti nešto komplicirano. Obično je dovoljno ime klase ili ime prozora.

Uglavnom, glavna ideja već bi trebala biti jasna. U postavkama globalnih tipki prečaca/prečaca za vaš upravitelj prozora, konfigurirajte potrebnu kombinaciju za izvršavanje skripte.

Kako koristiti skripte

Prvo morate instalirati uslužne programe konzole wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Zatim trebate preuzeti skripte i dodati ih u $ PUT. Obično ih stavljam ~/bin:

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

Ako imenik ~/bin nije bio tamo, tada ga morate stvoriti i ponovno pokrenuti (ili se ponovno prijaviti), inače ~/bin neće pogoditi $ PUT. Ako je sve učinjeno ispravno, tada bi skripte trebale biti dostupne s konzole i dovršavanje kartice trebalo bi raditi.

Glavna skripta showwin uzima 2 parametra: prvi je regex, po kojem ćemo tražiti traženi prozor, a drugi parametar je naredba koju je potrebno izvršiti ako traženi prozor nije pronađen.

Možete pokušati pokrenuti skriptu, na primjer:

$ showwin "Mozilla Firefox$" firefox

Ako je Firefox instaliran, njegov prozor treba biti fokusiran. Čak i da Firefox nije bio pokrenut, trebao se pokrenuti.

Ako radi, možete pokušati konfigurirati izvršavanje naredbi na kombinacijama. U globalnim postavkama prečaca/prečaca dodajte:

  • Alt+F: showwin “Mozilla Firefox$” firefox
  • Alt+D: showwin "Mozilla Firefox (Privatno pregledavanje)$" "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” ideja.sh

Itd. Svatko može konfigurirati kombinacije tipki i softver kako mu odgovara.
Ako je sve ispalo kako treba, pomoću gornjih kombinacija moći ćemo se prebacivati ​​između prozora jednostavnim pritiskom na tipke.

Razočarat ću ljubitelje kroma: on može inkognito razlikovati običan prozor po izlazu wmctrl Ne možete, imaju iste nazive klasa i naslove prozora. U predloženom regularnom izrazu, znakovi N* i I* su potrebni samo kako bi se ovi regularni izrazi međusobno razlikovali i kako bi se mogli dodijeliti kao glavni prozori.

Za resetiranje glavnog prozora prethodne kombinacije (u stvari za regex, koji showwin pozvan prošli put) trebate pozvati skriptu showwinDetach. Imam ovu skriptu dodijeljenu kombinaciji tipki Alt+Backspace.

Na scenariju showwin postoji još jedna funkcija. Kada se pozove s jednim parametrom (u ovom slučaju parametar je samo identifikator), uopće ne provjerava regularni izraz, već smatra da su svi prozori prikladni. Samo po sebi, ovo se čini beskorisnim, ali na ovaj način možemo odrediti bilo koji prozor kao glavni i brzo se prebaciti na taj prozor.

Imam konfigurirane sljedeće kombinacije:

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

Na ovaj način mogu vezati bilo koje prozore u kombinacije Alt + 1...Alt + 0. Samo klikom Alt + 1 Trenutačni prozor vežem za ovu kombinaciju. Vezivanje mogu poništiti klikom Alt + 1a onda Alt+Backspace. Ili zatvorite prozor, to također radi.

Zatim ću vam reći neke tehničke detalje. Ne morate ih čitati, ali samo ih pokušajte postaviti i vidjeti. Ali ipak bih preporučio razumijevanje tuđih skripti prije nego što ih pokrenete na svom računalu :).

Kako razlikovati različite prozore iste aplikacije

U principu, prvi primjer “wmctrl -a skype.Skype -x” je radio i može se koristiti. Ali pogledajmo ponovno primjer s Firefoxom, u kojem su otvorena 2 prozora:

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

Prvi prozor je normalni način rada, a drugi je privatno pregledavanje. Želio bih te prozore smatrati različitim aplikacijama i prebacivati ​​se na njih koristeći različite kombinacije tipki.

Potrebno je zakomplicirati skriptu koja mijenja prozore. Koristio sam ovo rješenje: prikaži popis svih prozora, učini grep prema regularnom izrazu, uzmite prvi redak s glava, uzmite prvi stupac (ovo će biti ID prozora) pomoću rezati, prebacite se na prozor prema id.

Trebalo bi se šaliti o regularnim izrazima i dva problema, ali zapravo ne koristim ništa komplicirano. Trebam regularne izraze kako bih mogao označiti kraj retka (simbol “$”) i razlikovati “Mozilla Firefox$” od “Mozilla Firefox (Private Browsing)$”.

Naredba izgleda otprilike ovako:

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

Ovdje već možete pogoditi o drugoj značajci skripte: ako grep ne vrati ništa, tada željena aplikacija nije otvorena i morate je pokrenuti izvršavanjem naredbe iz drugog parametra. Zatim povremeno provjerite je li se otvorio traženi prozor kako biste na njega prenijeli fokus. Neću se fokusirati na ovo; tko treba, pogledat će izvore.

Kada se prozori aplikacije ne mogu razlikovati

Dakle, naučili smo kako prenijeti fokus na prozor željene aplikacije. Ali što ako aplikacija ima više od jednog otvorenog prozora? Kome bih se trebao posvetiti? Gornja skripta će se najvjerojatnije prenijeti na prvi otvoreni prozor. Međutim, željeli bismo više fleksibilnosti. Želio bih se moći sjetiti koji prozor trebamo i prebaciti se na taj prozor.

Ideja je bila sljedeća: ako želimo zapamtiti određeni prozor za kombinaciju tipki, tada moramo pritisnuti ovu kombinaciju kada je željeni prozor u fokusu. Ubuduće, kada pritisnete ovu kombinaciju, fokus će biti stavljen na ovaj prozor. Dok se prozor ne zatvori ili ne izvršimo reset za ovu kombinaciju skripti showwinDetach.

Algoritam skripte showwin nešto kao ovo:

  • Provjerite jesmo li prethodno zapamtili id ​​prozora na koji treba prenijeti fokus.
    Ako se sjećate i takav prozor još uvijek postoji, onda prebacujemo fokus na njega i izlazimo.
  • Gledamo koji je prozor trenutno u fokusu i ako odgovara našem zahtjevu, pamtimo njegov ID da bismo u budućnosti otišli do njega i izašli.
  • Idemo na barem neki odgovarajući prozor ako postoji ili otvorimo željenu aplikaciju.

Možete saznati koji je prozor trenutno u fokusu pomoću uslužnog programa xdotool konzole pretvaranjem njegovog izlaza u heksadecimalni format:

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

Najlakši način da zapamtite nešto u bashu je stvaranje datoteka u virtualnom datotečnom sustavu koji se nalazi u memoriji. U Ubuntuu je ovo omogućeno prema zadanim postavkama /dev/shm/. O drugim distribucijama ne mogu ništa reći, nadam se da postoji nešto slično. Možete pogledati naredbom:

$ mount -l | grep tmpfs

Skripta će stvoriti prazne direktorije u ovoj mapi, ovako: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Osim toga, svaki put kad se pozove, stvorit će simboličku vezu /dev/shm/$USER/showwin/showwin_last na /dev/shm/$USER/showwin/$SEARCH_REGEX. Ovo će biti potrebno kako bi se, ako je potrebno, uklonio ID prozora za određenu kombinaciju pomoću skripte showwinDetach.

Što se može poboljšati

Prvo, skripte se moraju konfigurirati ručno. Zasigurno, zbog potrebe zadubljivanja i rada s rukama, mnogi od vas neće ni pokušati konfigurirati sustav. Kad bi bilo moguće jednostavno instalirati paket i sve lakše konfigurirati, možda bi stekao popularnost. I onda pogledajte, aplikacija bi bila puštena u standardne distribucije.

A možda se može lakše. Ako po id-u prozora možete saznati id procesa koji ga je kreirao, a po id-u procesa možete saznati koja ga je naredba kreirala, tada bi bilo moguće automatizirati postavljanje. Zapravo, nisam razumio je li moguće ono što sam napisao u ovom paragrafu. Činjenica je da sam osobno zadovoljan kako sada funkcionira. Ali ako netko drugi osim mene smatra cijeli pristup prikladnim i netko ga poboljša, tada ću rado upotrijebiti bolje rješenje.

Drugi problem, kao što sam već napisao, je da se u nekim slučajevima prozori ne mogu razlikovati jedan od drugog. Do sada sam ovo promatrao samo inkognito u krom/krom, ali možda postoji nešto slično negdje drugdje. U krajnjem slučaju uvijek postoji mogućnost univerzalnih kombinacija Alt + 1...Alt + 0. Opet, koristim Firefox i za mene osobno ovaj problem nije značajan.

Ali značajan problem za mene je to što koristim Mac OS za posao i tamo nisam mogao konfigurirati ništa slično. korisnost wmctrl Mislim da sam ga uspio instalirati, ali zapravo ne radi na Mac OS-u. S aplikacijom se može nešto učiniti automatizator, ali je toliko spor da ga nije zgodno koristiti ni kad radi. Također nisam mogao postaviti kombinacije tipki tako da rade u svim programima. Ako netko iznenada smisli rješenje, rado ću ga iskoristiti.

Umjesto zaključka

Ispostavilo se da je riječ o neočekivano velikom broju riječi za tako naizgled jednostavnu funkcionalnost. Htio sam prenijeti ideju i ne opteretiti tekst, ali još nisam smislio kako to jednostavnije ispričati. Možda bi bilo bolje u video formatu, ali ljudi kod nas ne vole tako.

Pričao sam malo o tome što se nalazi ispod haube skripte i kako je konfigurirati. Nisam ulazio u detalje samog scenarija, ali ima samo 50 redaka, pa nije teško razumjeti.

Nadam se da će još netko isprobati ovu ideju i možda je čak i cijeniti. Za sebe mogu reći da je scenarij napisan prije otprilike 3 godine i JAKO mi je zgodan. Toliko zgodan da uzrokuje ozbiljnu nelagodu pri radu s tuđim računalima. I to s ispravnim MacBookom.

Link na skripte

Izvor: www.habr.com

Dodajte komentar