Menaxhimi alternativ i dritareve në Linux

Unë jam nga ata që vendosin Caps Lock për të ndërruar layout-in sepse më bëhet dembel të shtyp dy çelësa kur mund të shtyp vetëm një. Madje do të doja 2 çelësa të padobishëm: një do ta përdorja për të aktivizuar layout-in në anglisht, dhe tjetrin për atë rus. Por çelësi i dytë të padobishëm është thirrja e menusë kontekstuale, e cila është aq e padobishme sa që hiqet nga shumë prodhues të laptopëve. Pra, duhet të kënaqem me atë që kam.

Dhe nuk dua as që në kalimin mes dritareve të kërkoj icon-et e tyre në panelin e detyrave, të kap titujt duke skroluar përmes Alt+Tab, të skrollyj desktopet etj. Dua të shtyp një kombinim çelësash (në ideal, madje vetëm një, por nuk ka më shumë çelësa të padobishëm) dhe menjëherë të shkoj në dritaren që më nevojitet. Për shembull kështu:

  • Alt+F: Firefox
  • Alt+D: Firefox (DĂ«gjim Privat)
  • Alt+T: Terminal
  • Alt+M: Kalkulator
  • Alt+E: IntelliJ Idea
  • etj.

Dhe kur tĂ« shtyp, pĂ«r shembull, nĂ« Alt+M dua tĂ« shoh kalkulatorin pavarĂ«sisht nĂ«se kjo program Ă«shtĂ« e hapur aktualisht. NĂ«se Ă«shtĂ« hapur, atĂ«herĂ« foku do tĂ« kalojĂ« nĂ« dritaren e saj, dhe nĂ«se jo — do tĂ« nis programin e nevojshĂ«m dhe do tĂ« kaloj fokusin kur ajo tĂ« ngarkohet.

Për rastet që nuk mbulohen nga skenari i mëparshëm, dua të kem kombinime universale çelësash, të cilat mund të caktohen lehtësisht për cilëndo nga dritaret e hapura. Për shembull, kam caktuar 10 kombinime nga Alt+1 në Alt+0, të cilat nuk janë të lidhura me ndonjë program. Mund të shtyp thjesht Alt+1 dhe dritarja që aktualisht ka fokus do të marrë fokusin kur të shtyp Alt+1.

Nën këtë përshkrim janë disa veçori të tjera dhe përgjigjja se si mund ta bëni këtë. Por menjëherë do të paralajmëroj se një personalizim i tillë "për veten" mund të shkaktojë varësi të fortë dhe madje të shkaktojë krizë kur bëhet e nevojshme të përdoren Windows, Mac OS ose madje një kompjuter të huaj me Linux.

Në të vërtetë, nëse mendojmë, nuk përdorim aq shumë programe në përditshmëri. Shfletuesi, terminali, IDE, ndonjë mesazher, menaxheri i skedarëve, kalkulatori dhe, ndoshta, kjo është pothuajse gjithçka. Nuk nevojiten aq shumë kombinime çelësash për të mbuluar 95% të detyrave të përditshme.

PĂ«r programet qĂ« kanĂ« hapur disa dritare, njĂ«ra prej tyre mund tĂ« caktohet si kryesore. PĂ«r shembull, janĂ« hapur disa dritare IntelliJ Idea, tĂ« caktuara nĂ« Alt+E. NĂ« kushte normale, kur tĂ« shtypni nĂ« Alt+E do tĂ« hapet ndonjĂ« dritare e kĂ«tij programi, shumĂ« tĂ« mundshme ajo qĂ« ishte hapur e para. SidoqoftĂ«, nĂ«se shtypni nĂ« Alt+E kur kur dritarja e kĂ«tij programi Ă«shtĂ« e fokusuar, kjo dritare do tĂ« emĂ«rohet si kryesore dhe pikĂ«risht asaj do t’i transferohet fokusi me shtypjet e ardhshme tĂ« kombinimeve.

Dritarja kryesore mund tĂ« riemĂ«rohet. PĂ«r kĂ«tĂ«, duhet fillimisht tĂ« resetohet kombinimi dhe pastaj t’i caktohet njĂ« dritare tjetĂ«r si kryesore. PĂ«r tĂ« resetuar kombinimin, duhet tĂ« shtypet vetĂ« kombinimi dhe pastaj njĂ« kombinim tĂ« veçantĂ« pĂ«r resetimin, qĂ« unĂ« e kam caktuar nĂ« Alt+Backspace. Kjo do tĂ« thĂ«rrasĂ« njĂ« skript qĂ« do tĂ« anulojĂ« emĂ«rimin e dritares kryesore pĂ«r kombinimin e mĂ«parshĂ«m. MĂ« pas, mund tĂ« caktohet njĂ« dritare kryesore tĂ« re ashtu siç u pĂ«rshkrua nĂ« paragrafĂ«t e mĂ«parshĂ«m. Resetimi i dritares sĂ« lidhur pĂ«r kombinimet universale ndodh nĂ« mĂ«nyrĂ« tĂ« ngjashme.

Hyrja doli e gjatë, por doja së pari të flisja për atë që do të bëjmë, dhe pastaj të shpjegoja se si ta bëjmë.

Për ata që janë lodhur nga leximi

Nëse përmbledhim, linku për skriptet është në fund të artikullit.

Por megjithatë nuk do të mund të instaloshet menjëherë dhe të përdoret. Së pari duhet të kuptohet se si skripti gjen dritaren e duhur. Pa këtë, nuk do të mund të tregoni skriptit se ku duhet të transferohet fokusi. Gjithashtu, duhet të kuptoni se çfarë të bëni nëse nuk ka gjetur një dritare të përshtatshme.

Dhe nuk do tĂ« pĂ«rqendrohem nĂ« atĂ« se si tĂ« konfiguroni ekzekutimin e skripteve pĂ«rmes shtypjes sĂ« kombinimeve tĂ« çelĂ«sve. PĂ«r shembull, nĂ« KDE kjo ndodhet nĂ« Parametrat e Sistemit → Shkurtore → Shkurtore tĂ« Personalizuara. NĂ« menaxherĂ« tĂ« tjerĂ« dritarash duhet tĂ« jetĂ« gjithashtu e tillĂ«.

Njoftimi me wmctrl

Wmctrl — njĂ« utilitar konsolĂ« pĂ«r tĂ« ndĂ«rvepruar me X Window Manager. Kjo Ă«shtĂ« programi kyç pĂ«r skriptin. Le tĂ« shohim shpejt se si mund ta pĂ«rdorim.

Fillimisht, do të nxjerrim një listë të dritareve të hapura:

$ 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 Translate - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Postimet më të mira të ditës / Habr - Mozilla Firefox (Private Browsing)
...

Opcioni --selector nxjerr një listë të të gjitha dritareve të hapura, dhe -x shton në dalje emrin e klasës (skype.Skype, Navigator.Firefox etj). Ne këtu do të kemi nevojë për id e dritares (kolona 1), emrin e klasës (kolona 3) dhe emrin e dritares (kolona e fundit).

Mund të provoni të aktivizoni ndonjë dritare duke përdorur opsionin -a:

$ wmctrl -a skype.Skype -x

Nëse gjithçka shkoi sipas planit, dritarja Skype duhet të shfaqet në ekran. Nëse në vend të opsionit -x përdorni opsionin -i, instead of the class name, you can specify the window id. The problem with the id is that it changes every time the application is launched, and we cannot know it in advance. On the other hand, this attribute unequivocally points to the window, which can be important when the application opens more than one window. More on this later.

At this stage, we need to remember that we will search for the desired window using regex based on the output wmctrl -lx. But that doesn't mean we must use something complicated. Usually, the class name or window title is sufficient.

In principle, the main idea should already be clear. In the settings of the global hotkeys/shortcuts for your window manager, we configure the desired combination to execute the script.

How to use scripts

First, you need to install console utilities wmctrl dhe xdotool:

$ sudo apt-get install wmctrl xdotool

Next, you need to download the scripts and add them to $PATH. I usually place them in ~\/bin:

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

If the directory ~\/bin did not exist, it needs to be created and you must restart (or log back in), otherwise ~\/bin will not enter $PATH. If everything is done correctly, the scripts should be available from the console, and tab completion should work.

The main script showwin takes 2 parameters: the first is the regex based on which we will search for the desired window, and the second parameter is the command that needs to be executed if the desired window is not found.

You can try executing the script, for example:

$ showwin "Mozilla Firefox$" firefox

If Firefox is installed, focus should be sent to its window. Even if Firefox was not running, it should have started.

If it worked, you can try setting up command execution for the combinations. In the global hotkeys/shortcuts settings, add:

  • 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

And so on. Each person can set key combinations and software as convenient for them.
If everything was done correctly, we will be able to switch between windows with a simple key press using the combinations mentioned above.

I will disappoint Chrome lovers: it cannot distinguish between a normal window and an incognito one based on output. wmctrl nuk mund të jenë me të njëjtin emër për klasat dhe titujt e dritareve. Në regex-të e propozuara, simbolet N* dhe I* janë të nevojshme vetëm për të dalluar këto rregulla nga njëra-tjetra, duke u lejuar të caktohen dritare të ndryshme si kryesore.

Për të rikthyer dritaren kryesore të kombinimit të mëparshëm (në fakt për regex-in që u thirr për herë të fundit), duhet të thërrasësh skenarin showwin showwinDetach . Unë e kam caktuar këtë skenar në një kombinim çelësashSkemari Alt+Backspace.

ka një funksion tjetër. Kur thirret me një parametër (në këtë rast, parametri është thjesht identifikuesi), atëherë nuk kontrollon fare regex-in, por i konsideron të gjitha dritaret si të përshtatshme. Vetë kjo duket e panevojshme, megjithatë në këtë mënyrë mund të caktosh çfarëdo dritare si kryesore dhe të kalosh shpejt tek kjo dritare. showwin Unë kam caktuar këto kombinime:

Alt+1: showwin «CustomKey1»

  • Alt+2: showwin «CustomKey2»
  • Alt+0: showwin «CustomKey0»
  • 

  • Alt+Backspace: showwinDetach
  • KĂ«shtu unĂ« mund tĂ« lidh çdo dritare me kombinimet

. Thjesht duke shtypur Alt+1
Alt+0unë lidh dritaren aktuale me këtë kombinim. Mund ta heq lidhjen duke shtypur Alt+1 . Ose të mbyll dritaren, ashtu funksionon. Alt+1, dhe pastaj Alt+BackspaceMë pas, do t'ju flas pak për detajet teknike. Mund t'i injoroni ato dhe thjesht të provoni ta konfiguroni dhe të shihni. Por gjithsesi do t'ju rekomandoja të kuptonit skriptet e të tjerëve para se t'i nisni ato në kompjuterin tuaj :) .

Si të dallosh dritaret e ndryshme të një aplikacioni

Në parim, shembulli i parë «wmctrl -a skype.Skype -x» ishte funksional dhe mund ta përdorim. Por le të shikojmë përsëri shembulli me Firefox-in, ku janë hapur 2 dritare:

0x04400003 0 Navigator.Firefox N/A Google Përkthyes - Mozilla Firefox 0x04400218 0 Navigator.Firefox N/A Publikimet më të mira për ditën / Habr - Mozilla Firefox (Navigim Privat)

Dritarja e parĂ« — Ă«shtĂ« modaliteti i zakonshĂ«m, ndĂ«rsa dritarja e dytĂ« — Ă«shtĂ« Navigim Privat. KĂ«to dritare do tĂ« donim t'i konsideronim aplikacione tĂ« ndryshme dhe tĂ« kalonim nĂ« to me kombinime tĂ« ndryshme çelĂ«sash.

Duhet ta komplikohem skriptin që kalon dritaret. Kam përdorur këtë zgjidhje: të nxjerr një listë të të gjitha dritareve, të bëj

përmes regex-it, të marr rreshtin e parë duke përdorur grep , të nxjerr kolonën e parë (kjo do të jetë id e dritares) duke përdorur headcut , të kaloj në dritaren sipas id-së.Këtu duhet të jetë një shaka rreth shprehjeve rregullta dhe dy problemeve, por në fakt nuk përdor asgjë të komplikuar. Më duhen shprehjet rregullta që të mund të tregoj fundin e rreshtit (simboli «$») dhe të dalloj «Mozilla Firefox$» nga «Mozilla Firefox (Navigim Privat)$».

Këtu duhet të jetë një shaka për shprehjet rregulltare dhe dy probleme, por në fakt nuk përdor asgjë të komplikuar. Më duhen shprehjet për të specifikuar fundin e rreshtit (simboli «$») dhe për të dalluar «Mozilla Firefox$» nga «Mozilla Firefox (Navigimi Privat)$».

Ekipi duket afërsisht kështu:

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

Këtu mund të kuptoni lehtësisht edhe një veçori tjetër të skriptit: nëse grep nuk kthen asnjë rezultat, atëherë aplikacioni i kërkuar nuk është hapur dhe duhet ta nisni atë duke executuar komandën nga parametri i dytë. Pas kësaj, do të kontrolloni shpesh nëse është hapur dritarja e nevojshme, për t'i dhënse asaj fokusin. Nuk do të ndalem shumë këtu; ata që janë të interesuar mund të shohin burimin e kodit.

Kur dritaret e aplikacionit nuk janë të dallueshme

Pra, ne mësuam të transferojmë fokusin në dritaren e aplikacionit të nevojshëm. Por çfarë ndodh nëse janë hapur më shumë se një dritare të aplikacionit? Cilat prej tyre duhet të marrin fokus? Skripti i mësipërm do ta transferojë, me siguri, në dritaren e parë të hapur. Megjithatë, ne do të dëshironim më shumë fleksibilitet. Do të ishte e dëshirueshme të kishim mundësinë të mbanim mend qëndrimin e saktë dhe të kalonim në atë dritare.

Ideja ishte kështu: Nëse duam të mbajmë mend një dritare të caktuar për kombinimin e çelësave, duhet ta shtypim këtë kombinim kur dritarja e nevojshme është në fokus. Më pas, kur të shtypim këtë kombinim, fokusi do të jepet pikërisht kësaj dritareje. Deri sa dritarja të mbyllet ose ne të bëjmë një rivendosje për këtë kombinim në skript. . Unë e kam caktuar këtë skenar në një kombinim çelësash.

Algoritmi i skriptit showwin është më ose më pak kështu:

  • Kontrolloni nĂ«se kemi ruajtur mĂ« parĂ« id-nĂ« e dritares, tĂ« cilĂ«s duhet t'i transferojmĂ« fokusin.
    Nëse e kemi mbajtur mend dhe kjo dritare akoma ekziston, atëherë i japim fokus asaj dhe dalim.
  • ShikojmĂ« se cila dritare Ă«shtĂ« tani nĂ« fokus, dhe nĂ«se ajo pĂ«rputhet me kĂ«rkesĂ«n tonĂ«, atĂ«herĂ« do ta mbajmĂ« mend id-nĂ« e saj pĂ«r kalim nĂ« tĂ« nĂ« tĂ« ardhmen dhe dalim.
  • Shkonte nĂ« ndonjĂ« dritare tĂ« pĂ«rshtatshme nĂ«se ajo ekziston ose hapim aplikacionin e nevojshĂ«m.

Të kuptoni se cila dritare është tani në fokus mund të bëhet me ndihmën e utilitarit të konsolës xdotool, duke e transformuar daljen e saj në formatin heksadeshimal:

$ printf "0xx" `xdotool getwindowfocus`

Të mbash mend diçka në bash është më e thjeshtë duke krijuar skedarë në një sistem virtual të skedarëve që ndodhet në memorje. Në Ubuntu, kjo është e lidhur për default në /dev/shm/. Për distribuione të tjera nuk mund të them asgjë, shpresoj që diçka e ngjashme të ekzistojë. Mund ta shihni me komandën:

$ mount -l | grep tmpfs

Skripti do të krijojë drejtoritë e zbrazëta në këtë dosje, diçka të tillë: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Së dyti, me çdo thirrje do të krijojë një symlink /dev/shm/$USER/showwin/showwin_last në /dev/shm/$USER/showwin/$SEARCH_REGEX. Kjo do të nevojitet për të pasur mundësinë të fshini id-në e dritares për një kombinim të caktuar duke përdorur skriptin. . Unë e kam caktuar këtë skenar në një kombinim çelësash.

ÇfarĂ« mund tĂ« pĂ«rmirĂ«sojmĂ«

Së pari, skriptet duhet t'i konfigurosh manualisht. Me siguri, për shkak të nevojës për t'u angazhuar dhe për të bërë shumë gjëra manualisht, shumë prej jush ndoshta nuk do ta provojnë as ta konfigurojnë sistemin. Nëse do të ishte e mundur thjesht të instaloje një paketë dhe të configurarje gjithçka më lehtë, ndoshta kjo do të fitojë disa popullaritet. Dhe mund ta shohim se ndoshta do ta përfshinin aplikacionin në distribucionet standard.

Dhe, ndoshta, do të ishte e mundur ta bënim më të lehtë. Nëse përmes ID-së së dritares mund të njohim ID-në e procesit që e krijoi atë, dhe përmes ID-së së procesit mund të mësojmë se cili komandë e krijoi, atëherë do të mund ta automatizojmë konfigurimin. Në të vërtetë, nuk kam shqyrtuar nëse është e mundur ajo që kam shkruar në këtë paragraf. E vërteta është se për mua është e pranueshme si funksionon tani. Por nëse dikush përveç meje e gjen këtë qasje të dobishme dhe dikush e përmirëson, atëherë do të isha i lumtur të përdorja zgjidhjen më të mirë.

NjĂ« problem tjetĂ«r, siç kam shkruar mĂ« parĂ«, Ă«shtĂ« se nĂ« disa raste nuk mund tĂ« dallosh njĂ« dritare nga tjetra. UnĂ« deri tani e kam vĂ«zhguar kĂ«tĂ« vetĂ«m me incognito nĂ« chrome/chromium, por ndoshta ka ndonjĂ« tjetĂ«r rast. NĂ« rastin mĂ« tĂ« keq, gjithmonĂ« ka mundĂ«si e kombinimeve universale Alt+1
Alt+0. PĂ«rsĂ«ri, unĂ« pĂ«rdor Firefox dhe personalisht pĂ«r mua ky problem nuk Ă«shtĂ« i rĂ«ndĂ«sishĂ«m.

Por njĂ« problem i rĂ«ndĂ«sishĂ«m pĂ«r mua Ă«shtĂ« se pĂ«r punĂ« pĂ«rdor Mac OS dhe atje nuk kam arritur tĂ« konfiguroj asgjĂ« tĂ« tillĂ«. Utilitarin wmctrl duke u dukur se arrita ta instaloja, por ai nuk funksionon mirĂ« nĂ« Mac OS. Mund tĂ« bĂ«het diçka me aplikacionin Automator, por kaq ngadalĂ« sa nuk Ă«shtĂ« i leverdishĂ«m pĂ«r tu pĂ«rdorur, madje kur funksionon. Nuk arrita as ta konfiguroj kombinimin e tasteve qĂ« tĂ« funksionojnĂ« nĂ« tĂ« gjitha programet. NĂ«se ndonjĂ«ri mendon ndonjĂ« zgjidhje — do tĂ« jem i lumtur ta pĂ«rdor atĂ«.

Në përfundim

Më rezultoi befas shumë fjalë për një funksionalitet, që dukej më e thjeshtë. Doja të përcillja idenë dhe të mos e ngarkoja tekstin, por deri tani nuk kam arritur të mendoj një mënyrë më të thjeshtë për ta treguar. Ndoshta në formatin e videos do të ishte më mirë, por këtu nuk e preferojnë aq shumë.

Kam folur pak për atë që fshihet pas skriptit dhe si ta konfigurosh atë. Nuk kam hyrë në detaje të skriptit, por ai ka vetëm 50 rreshta, kështu që është e lehtë për t'u kuptuar.

Shpresoj që dikush tjetër do ta provojë këtë ide dhe ndoshta madje do ta vlerësojë. Nga ana ime, mund të them se skripti është shkruar rreth 3 vjet më parë dhe është shumë i përshtatshëm për mua. Aq shumë saqë shkakton një pakënaqësi të madhe kur punoj me kompjuterë të tjerë. Dhe me MacBook-un tim të punës.

Linku për skriptet

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster