Alternatīva logu pārvaldība operētājsistēmā Linux

Es esmu viens no tiem, kas iestata Caps Lock, lai pārslēgtu izkārtojumus, jo esmu pārāk slinks, lai nospiestu 2 taustiņus, kad varu nospiest vienu. Man pat gribētos 2 nevajadzīgas atslēgas: vienu izmantotu, lai ieslēgtu angļu izkārtojumu, bet otru – krievu valodai. Bet otrā nevajadzīgā atslēga ir konteksta izvēlnes izsaukšana, kas ir tik nevajadzīga, ka daudzi klēpjdatoru ražotāji to izgriež. Tāpēc jums ir jābūt apmierinātam ar to, kas jums ir.

Un es arī nevēlos meklēt viņu ikonas uzdevumjoslā, pārslēdzot logus, vai ķert vārdus, kad ritina. Alt + Tab, ritināt galddatorus utt.. Gribu nospiest taustiņu kombināciju (ideālā gadījumā tikai vienu, bet vairs nav nevienas brīvas nevajadzīgas atslēgas) un uzreiz tikt pie vajadzīgā loga. Piemēram, šādi:

  • Alt+F: Firefox
  • Alt+D: Firefox (privātā pārlūkošana)
  • Alt+T: terminālis
  • Alt+M: kalkulators
  • Alt+E: IntelliJ ideja
  • utt.

Turklāt, nospiežot, piemēram, uz Alt+M Es vēlos redzēt kalkulatoru neatkarīgi no tā, vai šī programma pašlaik darbojas. Ja tā darbojas, tā logam ir jākoncentrē fokuss, un, ja nē, palaidiet vajadzīgo programmu un pārsūtiet fokusu, kad tā tiek ielādēta.

Gadījumos, uz kuriem neattiecas iepriekšējais skripts, es vēlos, lai būtu universālas taustiņu kombinācijas, kuras var viegli piešķirt jebkuram atvērtajam logam. Piemēram, man ir piešķirtas 10 kombinācijas no Alt + 1 līdz Alt + 0, kas nav piesaistīti nevienai programmai. Es varu vienkārši noklikšķināt Alt + 1 un logs, kas pašlaik ir fokusā, tiks fokusēts, noklikšķinot Alt + 1.

Zem griezuma ir vēl pāris funkciju apraksts un atbilde par to, kā to izdarīt. Bet es jūs nekavējoties brīdināšu, ka šāda pielāgošana “sev” var izraisīt smagu atkarību un pat atteikšanos, ja jums ir jāizmanto Windows, Mac OS vai pat kāda cita dators ar Linux.

Patiesībā, ja tā padomā, mēs ikdienā tik daudz programmu neizmantojam. Pārlūks, terminālis, IDE, sava veida kurjers, failu pārvaldnieks, kalkulators un, iespējams, tas ir gandrīz viss. Nav nepieciešams daudz taustiņu kombināciju, lai veiktu 95% ikdienas uzdevumu.

Programmām, kurām ir atvērti vairāki logi, vienu no tiem var norādīt kā galveno. Piemēram, jums ir atvērti un piešķirti vairāki IntelliJ Idea logi Alt + E. Normālos apstākļos, nospiežot Alt + E atvērsies kāds šīs programmas logs, visticamāk tas, kurš tika atvērts pirmais. Tomēr, ja jūs noklikšķiniet uz Alt + E kad kāds no šīs programmas logiem jau ir fokusā, tad šis konkrētais logs tiks piešķirts kā galvenais un tas tiks fokusēts, nospiežot nākamās kombinācijas.

Galveno logu var piešķirt no jauna. Lai to izdarītu, vispirms ir jāatiestata kombinācija un pēc tam jāpiešķir tai kā galvenajam logam cits logs. Lai atiestatītu kombināciju, jums jānospiež pati kombinācija un pēc tam īpaša atiestatīšanas kombinācija, man tā ir piešķirta Alt+atpakaļatkāpes taustiņš. Tas izsauks skriptu, kas atcels galvenā loga piešķiršanu iepriekšējai kombinācijai. Un tad jūs varat piešķirt jaunu galveno logu, kā aprakstīts iepriekšējā punktā. Saistītā loga atiestatīšana uz universālām kombinācijām notiek tādā pašā veidā.

Ievads izrādījās garš, bet es gribēju vispirms pastāstīt, ko mēs darīsim, un tad paskaidrot, kā to izdarīt.

Tiem, kuriem ir apnicis lasīt

Īsāk sakot, saite uz skriptiem ir raksta beigās.

Bet jūs joprojām nevarēsit to instalēt un izmantot uzreiz. Vispirms jums būs jāizdomā, kā skripts atrod vajadzīgo logu. Bez tā skriptam nebūs iespējams pateikt, kur tieši fokuss ir jāpārnes. Un jums ir jāsaprot, ko darīt, ja pēkšņi netiek atrasts piemērots logs.

Un es nekoncentrēšos uz to, kā konfigurēt skriptu izpildi, nospiežot taustiņu kombinācijas. Piemēram, KDE tas atrodas sadaļā Sistēmas iestatījumi → Īsceļi → Pielāgoti saīsnes. Tam vajadzētu būt arī citos logu pārvaldniekos.

Iepazīstinām ar wmctrl

Wmctrl — konsoles utilīta mijiedarbībai ar X Window Manager. Šī ir skripta galvenā programma. Īsi apskatīsim, kā varat to izmantot.

Vispirms parādīsim atvērto logu sarakstu:

$ 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 parāda visu atvērto logu sarakstu un -x pievieno klases nosaukumu izvadei (skype.Skype, Navigators.Firefox utt). Šeit mums ir nepieciešams loga ID (1. kolonna), klases nosaukums (3. sleja) un loga nosaukums (pēdējā kolonna).

Varat mēģināt aktivizēt kādu logu, izmantojot opciju -a:

$ wmctrl -a skype.Skype -x

Ja viss noritēja saskaņā ar plānu, ekrānā jāparādās Skype logam. Ja opciju vietā -x izmantot opciju -i, tad klases nosaukuma vietā var norādīt loga ID. Problēma ar id ir tāda, ka loga ID mainās katru reizi, kad tiek palaista lietojumprogramma, un mēs to nevaram zināt iepriekš. No otras puses, šis atribūts unikāli identificē logu, kas var būt svarīgi, ja lietojumprogramma atver vairāk nekā vienu logu. Vairāk par šo nedaudz tālāk.

Šajā posmā mums jāatceras, ka mēs meklēsim vajadzīgo logu, izmantojot regex pēc izvades wmctrl -lx. Bet tas nenozīmē, ka mums ir jāizmanto kaut kas sarežģīts. Parasti pietiek ar klases vai loga nosaukumu.

Būtībā jau jābūt skaidrai galvenajai domai. Logu pārvaldnieka globālo karsto taustiņu/īsinājumtaustiņu iestatījumos konfigurējiet nepieciešamo kombināciju, lai izpildītu skriptu.

Kā lietot skriptus

Vispirms jums jāinstalē konsoles utilītas wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Tālāk jums ir jālejupielādē skripti un jāpievieno tie $ PATH. Es parasti tos ievietoju ~/bin:

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

Ja direktorijs ~/bin tur nebija, tad jums tas ir jāizveido un jāpārstartē (vai atkārtoti jāpiesakās), pretējā gadījumā ~/bin netrāpīs $ PATH. Ja viss ir izdarīts pareizi, skriptiem jābūt pieejamiem no konsoles un cilnes pabeigšanai vajadzētu darboties.

Galvenais skripts šovs aizņem 2 parametrus: pirmais ir regex, pēc kura mēs meklēsim vajadzīgo logu, un otrs parametrs ir komanda, kas jāizpilda, ja nepieciešamais logs netiek atrasts.

Varat mēģināt palaist skriptu, piemēram:

$ showwin "Mozilla Firefox$" firefox

Ja ir instalēts Firefox, tā logam ir jākoncentrējas. Pat ja Firefox nedarbojās, tai vajadzēja sākt.

Ja tas darbojas, varat mēģināt konfigurēt komandu izpildi kombinācijās. Globālo karsto taustiņu/īsinājumtaustiņu iestatījumos pievienojiet:

  • Alt+F: parādīt pārlūkprogrammu Firefox $
  • Alt+D: showwin "Mozilla Firefox (privātā pārlūkošana)$" "firefox -private-window"
  • Alt+C: parādīt Win "chromium-browser.Chromium-browser N*" chromium-browser
  • Alt+X: parādīt Win "chromium-browser.Chromium-browser I*" "chromium-browser -incognito"
  • Alt+S: Showwin “skype.Skype” skypeforlinux
  • Alt+E: showwin “jetbrains-idea” idea.sh

Utt. Ikviens var konfigurēt taustiņu kombinācijas un programmatūru pēc saviem ieskatiem.
Ja viss izdevās pareizi, tad, izmantojot iepriekš minētās kombinācijas, mēs varēsim pārslēgties starp logiem, vienkārši nospiežot taustiņus.

Es pievilšu hroma cienītājus: tas var inkognito atšķirt parasto logu pēc izejas wmctrl Jūs nevarat, viņiem ir vienādi klašu nosaukumi un logu nosaukumi. Piedāvātajā regulārajā izteiksmē rakstzīmes N* un I* ir vajadzīgas tikai tāpēc, lai šīs regulārās izteiksmes atšķirtos viena no otras un tās varētu piešķirt kā galvenos logus.

Lai atiestatītu iepriekšējās kombinācijas galveno logu (faktiski regulārajai izteiksmei, kas šovs zvanīja pēdējo reizi), jums jāizsauc skripts showwinAtdalīt. Šis skripts man ir piešķirts taustiņu kombinācijai Alt+atpakaļatkāpes taustiņš.

Pie scenārija šovs ir vēl viena funkcija. Kad tas tiek izsaukts ar vienu parametru (šajā gadījumā parametrs ir tikai identifikators), tas vispār nepārbauda regex, bet uzskata visus logus par piemērotiem. Pats par sevi tas šķiet bezjēdzīgi, taču tādā veidā mēs varam norādīt jebkuru logu kā galveno un ātri pārslēgties uz konkrēto logu.

Man ir konfigurētas šādas kombinācijas:

  • Alt+1: parādīt "CustomKey1"
  • Alt+2: parādīt "CustomKey2"
  • ...
  • Alt+0: parādīt "CustomKey0"
  • Alt+Backspace: showwinDetach

Tādā veidā es varu saistīt jebkurus logus ar kombinācijām Alt + 1...Alt + 0. Vienkārši noklikšķinot Alt + 1 Es piesaistu pašreizējo logu šai kombinācijai. Es varu atcelt iesiešanu, noklikšķinot Alt + 1un tad Alt+atpakaļatkāpes taustiņš. Vai aizveriet logu, tas arī darbojas.

Tālāk es jums pastāstīšu dažas tehniskas detaļas. Jums tie nav jālasa, bet vienkārši mēģiniet tos iestatīt un redzēt. Bet es tomēr ieteiktu saprast citu cilvēku skriptus pirms to palaišanas savā datorā :).

Kā atšķirt dažādus vienas un tās pašas lietojumprogrammas logus

Principā pats pirmais piemērs “wmctrl -a skype.Skype -x” darbojās un to var izmantot. Bet vēlreiz apskatīsim piemēru ar Firefox, kurā ir atvērti 2 logi:

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

Pirmais logs ir parastais režīms, bet otrais ir Privātā pārlūkošana. Es vēlētos šos logus uzskatīt par dažādām lietojumprogrammām un pārslēgties uz tiem, izmantojot dažādas taustiņu kombinācijas.

Ir nepieciešams sarežģīt skriptu, kas pārslēdz logus. Es izmantoju šo risinājumu: parādiet visu logu sarakstu, dariet grep izmantojot regulāro izteiksmi, pirmo rindiņu ieņem ar vadītājs, iegūstiet pirmo kolonnu (tas būs loga ID), izmantojot samazināt, pārslēdzieties uz logu pēc id.

Par regulārām izteiksmēm un divām problēmām vajadzētu pajokot, bet patiesībā es nelietoju neko sarežģītu. Man ir vajadzīgas regulārās izteiksmes, lai es varētu norādīt rindas beigas (simbols “$”) un atšķirt “Mozilla Firefox$” no “Mozilla Firefox (Private Browsing)$”.

Komanda izskatās apmēram šādi:

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

Šeit jau var nojaust par otro skripta iezīmi: ja grep neko neatgriež, tad vēlamā aplikācija nav atvērta un tā jāpalaiž, izpildot komandu no otrā parametra. Un pēc tam periodiski pārbaudiet, vai nepieciešamais logs ir atvērts, lai uz to pārvietotu fokusu. Es nekoncentrēšos uz to; ikviens, kam tas būs vajadzīgs, apskatīs avotus.

Ja lietojumprogrammu logi nav atšķirami

Tātad, mēs esam iemācījušies pārsūtīt fokusu uz vajadzīgās lietojumprogrammas logu. Bet ko darīt, ja lietojumprogrammai ir atvērts vairāk nekā viens logs? Kuram man vajadzētu pievērst uzmanību? Iepriekš minētais skripts, visticamāk, tiks pārsūtīts uz pirmo atvērto logu. Tomēr mēs vēlētos lielāku elastību. Es vēlētos atcerēties, kurš logs mums ir vajadzīgs, un pārslēgties uz konkrēto logu.

Ideja bija šāda: ja mēs vēlamies atcerēties konkrētu logu taustiņu kombinācijai, tad mums ir jānospiež šī kombinācija, kad vēlamais logs ir fokusā. Nākotnē, nospiežot šo kombināciju, fokuss tiks piešķirts šim logam. Līdz logs tiek aizvērts vai mēs veicam šīs skriptu kombinācijas atiestatīšanu showwinAtdalīt.

Skripta algoritms šovs kaut kas tamlīdzīgs:

  • Pārbaudiet, vai mēs iepriekš esam atcerējušies tā loga ID, uz kuru jāpārvieto fokuss.
    Ja atceraties un šāds logs joprojām pastāv, mēs pārceļam fokusu uz to un izejam.
  • Mēs skatāmies, kurš logs pašlaik ir fokusā, un, ja tas atbilst mūsu pieprasījumam, atcerieties tā ID, lai turpmāk dotos uz to un izietu.
  • Mēs ejam uz vismaz kādu piemērotu logu, ja tāds pastāv, vai atveram vēlamo lietojumprogrammu.

Varat uzzināt, kurš logs pašlaik ir fokusā, izmantojot xdotool konsoles utilītu, pārveidojot tā izvadi heksadecimālā formātā:

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

Vienkāršākais veids, kā kaut ko atcerēties bash, ir izveidot failus virtuālajā failu sistēmā, kas atrodas atmiņā. Ubuntu tas ir iespējots pēc noklusējuma /dev/shm/. Par citiem izplatījumiem neko nevaru teikt, ceru, ka arī ir kaut kas līdzīgs. Jūs varat apskatīties ar komandu:

$ mount -l | grep tmpfs

Skripts šajā mapē izveidos tukšus direktorijus, piemēram: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Turklāt katru reizi, kad tas tiek nosaukts, tiks izveidota simboliskā saite /dev/shm/$USER/showwin/showwin_last par /dev/shm/$USER/showwin/$SEARCH_REGEX. Tas būs nepieciešams, lai vajadzības gadījumā noņemtu loga ID noteiktai kombinācijai, izmantojot skriptu showwinAtdalīt.

Ko var uzlabot

Pirmkārt, skripti ir jākonfigurē manuāli. Protams, tāpēc, ka ir jāiedziļinās un daudz jādara ar savām rokām, daudzi no jums pat nemēģinās konfigurēt sistēmu. Ja būtu iespējams vienkārši instalēt pakotni un visu vienkāršāk konfigurēt, tad varbūt tas iegūtu zināmu popularitāti. Un tad paskaties, lietojumprogramma tiks izlaista standarta izplatījumos.

Un varbūt to var izdarīt vienkāršāk. Ja pēc loga id var uzzināt procesa id, kas to izveidoja, un pēc procesa id var uzzināt, kura komanda to izveidoja, tad iestatīšanu būtu iespējams automatizēt. Patiesībā es nesapratu, vai tas, ko rakstīju šajā rindkopā, ir iespējams. Fakts ir tāds, ka es personīgi esmu apmierināts ar to, kā tas darbojas tagad. Bet, ja kādam citam, izņemot mani, visa pieeja šķiet ērta un kāds to uzlabos, tad labprāt izmantošu labāku risinājumu.

Vēl viena problēma, kā jau rakstīju, ir tā, ka dažos gadījumos logus nevar atšķirt vienu no otra. Pagaidām to esmu novērojis tikai inkognito režīmā chrome/chromium, bet varbūt kaut kas līdzīgs ir arī citur. Kā pēdējais līdzeklis vienmēr ir universālu kombināciju iespēja Alt + 1...Alt + 0. Atkal es izmantoju Firefox, un man personīgi šī problēma nav nozīmīga.

Bet mana galvenā problēma ir tā, ka darbā izmantoju Mac OS un tur neko tādu nevarēju konfigurēt. lietderība wmctrl Es domāju, ka varēju to instalēt, taču tas īsti nedarbojas operētājsistēmā Mac OS. Ar lietojumprogrammu var kaut ko darīt Automātors, taču tas ir tik lēns, ka to nav ērti lietot pat tad, kad tas darbojas. Es arī nevarēju iestatīt taustiņu kombinācijas, lai tās darbotos visās programmās. Ja kāds pēkšņi nāks klajā ar risinājumu, es ar prieku to izmantošu.

Tā vietā, lai noslēgtu

Tas izrādījās negaidīti liels vārdu skaits šādai šķietami vienkāršai funkcionalitātei. Es gribēju nodot ideju un nepārslogot tekstu, bet es vēl neesmu izdomājis, kā to pateikt vienkāršāk. Varbūt tas būtu labāk video formātā, bet cilvēkiem tas šeit nepatīk.

Es nedaudz runāju par to, kas atrodas zem skripta pārsega un kā to konfigurēt. Es neiedziļinājos paša scenārija detaļās, taču tas ir tikai 50 rindiņas, tāpēc to nav grūti saprast.

Ceru, ka kāds cits izmēģinās šo ideju un varbūt pat novērtēs. Par sevi varu teikt, ka scenārijs tika uzrakstīts pirms kādiem 3 gadiem un tas man ir ĻOTI ērti. Tik ērti, ka rada nopietnu diskomfortu, strādājot ar citu cilvēku datoriem. Un ar strādājošu MacBook.

Saite uz skriptiem

Avots: www.habr.com

Pievieno komentāru