Alternativno upravljanje prozorima u Linuxu

Ja sam jedan od onih koji su podesili Caps Lock da mijenjaju rasporede jer sam previše lijen da pritisnem 2 tipke kad mogu pritisnuti jedan. Hteo bih čak i 2 nepotrebna tastera: koristio bih jedan da uključim engleski raspored, a drugi za ruski. Ali drugi nepotreban ključ je pozivanje kontekstnog menija, koji je toliko nepotreban da ga mnogi proizvođači laptopa izbacuju. Dakle, morate biti zadovoljni onim što imate.

I također ne želim tražiti njihove ikone na traci zadataka kada mijenjate prozore, ili uhvatiti imena kada se krećete kroz Alt + Tab, skrolovanje po radnim površinama itd. Želim da pritisnem kombinaciju tastera (idealno samo jednu, ali više nema besplatnih nepotrebnih tastera) i odmah dođem do prozora koji mi je potreban. Na primjer ovako:

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

Štaviše, pritiskom, na primjer, na Alt+M Želim vidjeti kalkulator bez obzira da li je ovaj program trenutno pokrenut. Ako je pokrenut, onda njegovom prozoru treba dati fokus, a ako ne, 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 Alt + 1 do Alt + 0, koji nisu vezani ni za jedan program. Mogu samo kliknuti Alt + 1 i prozor koji je trenutno u fokusu će dobiti fokus kada se klikne Alt + 1.

Ispod reza nalazi se opis još par karakteristika i odgovor kako se to može učiniti. Ali odmah ću vas upozoriti da takva prilagodba "za sebe" može uzrokovati ozbiljnu ovisnost, pa čak i povlačenje ako trebate koristiti Windows, Mac OS ili čak nečiji računar s Linuxom.

Zapravo, ako bolje razmislite, mi ne koristimo toliko programa na dnevnoj bazi. Preglednik, terminal, IDE, neka vrsta messengera, upravitelj datoteka, kalkulator i, možda, to je skoro sve. Nije vam potrebno mnogo prečica na tastaturi da pokrijete 95% vaših dnevnih zadataka.

Za programe koji imaju više otvorenih prozora, jedan od njih se može označiti kao glavni. Na primjer, imate više otvorenih prozora IntelliJ Idea i kojima je dodijeljeno Alt + E. U normalnim uslovima, kada pritisnete Alt + E otvoriće se neki prozor ovog programa, najverovatnije onaj koji je prvi otvoren. Međutim, ako kliknete na Alt + E kada je jedan od prozora ovog programa već u fokusu, tada će ovaj prozor biti dodijeljen kao glavni i to će biti onaj koji će dobiti fokus kada se pritisnu naredne kombinacije.

Glavni prozor se može ponovo dodijeliti. Da biste to učinili, prvo morate resetirati kombinaciju, a zatim joj dodijeliti drugi prozor kao glavni prozor. Da biste resetovali kombinaciju, potrebno je da pritisnete samu kombinaciju, a zatim posebnu kombinaciju za resetovanje, meni je dodeljena Alt+Backspace. Ovo će pozvati skriptu koja će poništiti dodjelu glavnog prozora za prethodnu kombinaciju. Zatim možete dodeliti novi glavni prozor kao što je opisano u prethodnom paragrafu. Vraćanje povezanog prozora na univerzalne kombinacije događa se na isti način.

Uvod se pokazao dugim, ali prvo sam htio reći šta ćemo raditi, a zatim objasniti kako to učiniti.

Za one koji su umorni od čitanja

Ukratko, veza sa skriptama je 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 tačno fokus treba prenijeti. I morate razumjeti šta učiniti ako se iznenada ne pronađe odgovarajući prozor.

I neću se fokusirati na to kako konfigurirati izvršavanje skripti pritiskom na kombinacije tipki. Na primjer, u KDE-u se nalazi u System Settings → Shortcuts → Custom Shortcuts. Ovo bi također trebao biti slučaj u drugim upraviteljima prozora.

Predstavljamo wmctrl

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

Prvo, prikažemo listu 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 listu svih otvorenih prozora i dodaje naziv klase na izlaz (skype.Skype, Navigator.Firefox itd). Ovdje nam je potreban id prozora (kolona 1), ime klase (kolona 3) i ime prozora (posljednja kolona).

Možete pokušati aktivirati neki prozor koristeći opciju -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 imena klase možete odrediti ID prozora. Problem sa id-om je što se ID prozora mijenja svaki put kada se aplikacija pokrene i ne možemo to znati unaprijed. S druge strane, ovaj atribut jedinstveno identificira prozor, što može biti važno kada aplikacija otvori više prozora. Više o ovome malo dalje.

U ovoj fazi moramo zapamtiti da ćemo tražiti željeni prozor koristeći regex po izlazu wmctrl -lx. Ali to ne znači da moramo koristiti nešto komplikovano. Obično je dovoljno ime klase ili ime prozora.

U osnovi, glavna ideja bi već trebala biti jasna. U globalnim postavkama interventnih tastera/prečica za vaš menadžer prozora, konfigurišite potrebnu kombinaciju za izvršavanje skripte.

Kako koristiti skripte

Prvo morate instalirati uslužne programe za konzolu wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Zatim morate preuzeti skripte i dodati ih $ PATH. 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 bilo tamo, onda ga morate kreirati i ponovo pokrenuti (ili se ponovo prijaviti), inače ~/bin neće pogoditi $ PATH. Ako je sve urađeno ispravno, skripte bi trebale biti dostupne sa konzole i dovršavanje kartice bi trebalo funkcionirati.

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

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

$ showwin "Mozilla Firefox$" firefox

Ako je Firefox instaliran, njegovom prozoru treba dati fokus. Čak i da Firefox nije bio pokrenut, trebao je pokrenuti.

Ako radi, onda možete pokušati konfigurirati izvršavanje naredbi na kombinacijama. U postavkama globalnih hotkeys/prečica 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-pretraživač
  • Alt+X: showwin "chromium-browser.Chromium-preglednik I*" "chromium-pretraživač -inkognito"
  • Alt+S: showwin “skype.Skype” skypeforlinux
  • Alt+E: showwin “jetbrains-idea” idea.sh

itd. Svako može da konfiguriše kombinacije tastera i softver kako mu odgovara.
Ako je sve ispalo kako treba, onda ćemo pomoću gornjih kombinacija moći prelaziti između prozora jednostavnim pritiskom na tipke.

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

Da biste resetirali glavni prozor prethodne kombinacije (zapravo za regex, koji showwin pozvani prošli put) morate pozvati skriptu showwinDetach. Imam ovu skriptu dodijeljenu kombinaciji tipki Alt+Backspace.

U scenariju showwin postoji još jedna funkcija. Kada se pozove s jednim parametrom (u ovom slučaju parametar je samo identifikator), on uopće ne provjerava regex, već smatra da su svi prozori prikladni. Samo po sebi, ovo izgleda beskorisno, ali na ovaj način možemo označiti bilo koji prozor kao glavni i brzo se prebaciti na taj određeni prozor.

Imam konfigurisane sledeće kombinacije:

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

Na ovaj način mogu sve prozore povezati na kombinacije Alt + 1...Alt + 0. Samo klikom Alt + 1 Vežem trenutni prozor za ovu kombinaciju. Vezivanje mogu otkazati klikom Alt + 1, i onda Alt+Backspace. Ili zatvorite prozor, i to radi.

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

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 ponovo primjer sa 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 normalan način rada, a drugi je privatno pregledanje. Želio bih ove prozore smatrati različitim aplikacijama i prebaciti se na njih koristeći različite kombinacije tipki.

Potrebno je zakomplikovati skriptu koja mijenja prozore. Koristio sam ovo rješenje: prikaži listu svih prozora, uradi grep pomoću regularnog izraza, uzmite prvi red sa glava, uzmite prvu kolonu (ovo će biti id prozora) koristeći rez, prebacite se na prozor po id.

Trebala bi biti šala o regularnim izrazima i dva problema, ali u stvari ne koristim ništa komplikovano. Potrebni su mi regularni izrazi kako bih mogao označiti kraj reda (simbol “$”) i razlikovati “Mozilla Firefox$” od “Mozilla Firefox (privatno pregledavanje)$”.

Naredba izgleda otprilike ovako:

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

Ovdje već možete nagađati o drugoj osobini skripte: ako grep ne vrati ništa, onda željena aplikacija nije otvorena i trebate je pokrenuti izvršavanjem naredbe iz drugog parametra. Zatim povremeno provjeravajte da li se potreban prozor otvorio kako biste na njega prebacili fokus. Neću se fokusirati na ovo, svako kome je to potrebno će pogledati izvore.

Kada se prozori aplikacije ne razlikuju

Dakle, naučili smo kako prebaciti fokus na prozor željene aplikacije. Ali šta ako aplikacija ima više otvorenih prozora? Kome da se fokusiram? Gornja skripta će se najvjerovatnije prebaciti u prvi otvoreni prozor. Međutim, željeli bismo više fleksibilnosti. Želio bih da mogu zapamtiti koji nam je prozor potreban i prebaciti se na taj određeni prozor.

Ideja je bila sledeća: ako želimo da zapamtimo određeni prozor za kombinaciju tastera, onda moramo da pritisnemo ovu kombinaciju kada je željeni prozor u fokusu. U budućnosti, kada pritisnete ovu kombinaciju, fokus će biti dat ovom prozoru. Dok se prozor ne zatvori ili dok ne izvršimo reset za ovu kombinaciju skripte showwinDetach.

Algoritam skripte showwin ovako nešto:

  • Provjerite da li smo prethodno zapamtili id ​​prozora na koji fokus treba prenijeti.
    Ako se sjećate i takav prozor još uvijek postoji, onda prebacimo fokus na njega i izađemo.
  • Gledamo koji je prozor trenutno u fokusu, i ako se poklapa sa našim zahtjevom, pamtimo njegov ID da bismo ubuduće otišli do njega i izašli.
  • Idemo do barem nekog odgovarajućeg prozora ako postoji ili otvaramo željenu aplikaciju.

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

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

Najlakši način da zapamtite nešto u bash-u je kreiranje datoteka u virtuelnom sistemu datoteka koji se nalazi u memoriji. U Ubuntuu je ovo omogućeno po defaultu u /dev/shm/. Za ostale distribucije ne mogu ništa reći, nadam se da i ima nešto slično. Možete pogledati komandom:

$ mount -l | grep tmpfs

Skripta će kreirati prazne direktorijume u ovoj fascikli, ovako: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Dodatno, svaki put kada se pozove kreirać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.

Šta se može poboljšati

Prvo, skripte se moraju konfigurisati ručno. Sigurno, zbog potrebe da se udubite i uradite mnogo svojim rukama, mnogi od vas neće ni pokušati da konfigurišu sistem. Kada bi bilo moguće jednostavno instalirati paket i sve lakše konfigurirati, onda bi možda stekao neku popularnost. A onda pogledajte, aplikacija bi bila puštena u standardne distribucije.

A možda se to može i lakše. Ako po ID-u prozora možete saznati ID procesa koji ga je kreirao, a po ID-u procesa saznati koja naredba ga je kreirala, tada bi bilo moguće automatizirati podešavanje. Zapravo, nisam razumeo da li je moguće ovo što sam napisao u ovom paragrafu. Činjenica je da sam lično zadovoljan kako to sada radi. Ali ako neko drugi, a ne ja, smatra da ceo pristup odgovara i neko ga unapredi, onda ću rado iskoristiti bolje rešenje.

Drugi problem, kao što sam već napisao, je to što se u nekim slučajevima prozori ne mogu razlikovati jedan od drugog. Do sada sam ovo posmatrao samo sa inkognitom u hromu/hromu, ali možda postoji nešto slično negde drugde. U krajnjem slučaju, uvijek postoji opcija univerzalnih kombinacija Alt + 1...Alt + 0. Opet, koristim Firefox i za mene lično ovaj problem nije značajan.

Ali značajan problem za mene je to što koristim Mac OS za posao i tamo nisam mogao ništa slično konfigurirati. korisnost wmctrl Mislim da sam uspeo da ga instaliram, ali ne radi baš na Mac OS-u. Nešto se može uraditi sa aplikacijom Automator, ali je toliko spor da ga nije zgodno koristiti čak ni kada radi. Također nisam mogao postaviti kombinacije tipki tako da rade u svim programima. Ako neko iznenada dođe do rješenja, rado ću ga iskoristiti.

Umjesto zaključka

Ispostavilo se da je to neočekivano veliki broj riječi za tako naizgled jednostavnu funkcionalnost. Htio sam prenijeti ideju i ne preopteretiti tekst, ali još nisam shvatio kako da to jednostavnije ispričam. Možda bi bilo bolje u video formatu, ali ljudima se to ovdje ne sviđa.

Pričao sam malo o tome šta je ispod haube skripte i kako da je konfigurišem. Nisam ulazio u detalje samog scenarija, ali ima samo 50 redova, tako da nije teško razumjeti.

Nadam se da će još neko isprobati ovu ideju i možda će je cijeniti. Za sebe mogu reći da je scenario napisan prije otprilike 3 godine i JAKO mi je zgodan. Toliko zgodno da izaziva ozbiljnu nelagodu pri radu sa tuđim računarima. I sa ispravnim MacBookom.

Link na skripte

izvor: www.habr.com

Dodajte komentar