Alternativa fenestroadministrado en Linukso

Mi estas unu el tiuj, kiuj agordis Majskulon por ŝanĝi aranĝojn ĉar mi estas tro maldiligenta por premi 2 klavojn kiam mi povas premi unu. Mi eĉ ŝatus 2 nenecesajn klavojn: mi uzus unu por ŝalti la anglan aranĝon, kaj la duan por la rusa. Sed la dua nenecesa ŝlosilo estas voki la kuntekstan menuon, kiu estas tiel nenecesa, ke ĝi estas eltranĉita de multaj tekkomputiloj. Do vi devas esti kontenta pri tio, kion vi havas.

Kaj mi ankaŭ ne volas serĉi iliajn piktogramojn sur la taskobreto kiam vi ŝanĝas fenestrojn, aŭ kapti la nomojn dum rulumado. Alt + Tab, rulumu tra labortabloj, ktp. Mi volas premi klavkombinon (idee nur unu, sed ne plu estas senpagaj nenecesaj klavoj) kaj tuj atingi la fenestron, kiun mi bezonas. Ekzemple tiel:

  • Alt+F: Firefox
  • Alt+D: Firefox (Privata Retumado)
  • Alt+T: Fina stacio
  • Alt+M: Kalkulilo
  • Alt+E: IntelliJ Ideo
  • ktp.

Cetere, premante, ekzemple, sur Alt+M Mi volas vidi la kalkulilon sendepende de ĉu ĉi tiu programo funkcias nuntempe. Se ĝi funkcias, tiam ĝia fenestro devas ricevi fokuson, kaj se ne, rulu la deziratan programon kaj transigu fokuson kiam ĝi ŝargas.

Por kazoj, kiuj ne estas kovritaj de la antaŭa skripto, mi volas havi universalajn klavkombinojn, kiuj povas esti facile asignitaj al iu ajn el la malfermitaj fenestroj. Ekzemple, mi havas 10 kombinaĵojn asignitaj de Alt + 1 por Alt + 0, kiuj ne estas ligitaj al iuj programoj. Mi povas simple klaki Alt + 1 kaj la fenestro kiu estas nuntempe enfokusigita ricevos fokuson kiam klakota Alt + 1.

Sub la tranĉo estas priskribo de kelkaj pliaj funkcioj kaj respondo al kiel tio povas esti farita. Sed mi tuj avertos vin, ke tia personigo "por vi mem" povas kaŭzi severan dependecon kaj eĉ retiriĝon, se vi bezonas uzi Vindozon, Mac OS aŭ eĉ alies komputilon kun Linukso.

Fakte, se vi pensas pri tio, ni ne uzas tiom da programoj ĉiutage. Retumilo, terminalo, IDE, ia mesaĝisto, dosieradministranto, kalkulilo kaj, eble, tio estas preskaŭ ĉio. Ne estas multaj ŝlosilaj kombinaĵoj necesaj por kovri 95% de ĉiutagaj taskoj.

Por programoj kiuj havas plurajn fenestrojn malfermitaj, unu el ili povas esti elektita kiel la ĉefa. Ekzemple, vi havas plurajn fenestrojn de IntelliJ Idea malfermitaj kaj asignitaj al Alt + E. En normalaj kondiĉoj, kiam vi premas Alt + E iu fenestro de ĉi tiu programo malfermos, plej verŝajne tiu, kiu estis malfermita unue. Tamen, se vi alklakas Alt + E kiam unu el la fenestroj de ĉi tiu programo jam estas enfokusigita, tiam ĉi tiu aparta fenestro estos asignita kiel la ĉefa kaj ĝi estos tiu, kiu ricevos fokuson kiam postaj kombinaĵoj estas premataj.

La ĉefa fenestro povas esti reasignita. Por fari tion, vi devas unue restarigi la kombinaĵon, kaj poste atribui alian fenestron al ĝi kiel la ĉefan fenestron. Por restarigi kombinaĵon, vi devas premi la kombinaĵon mem, kaj poste specialan restarigi kombinaĵon, mi havas ĝin asignita al Alt + Retrospaco. Ĉi tio nomos skripton, kiu malasignos la ĉefan fenestron por la antaŭa kombinaĵo. Kaj tiam vi povas asigni novan ĉefan fenestron kiel priskribite en la antaŭa alineo. Restarigi ligitan fenestron al universalaj kombinaĵoj okazas same.

La enkonduko montriĝis longa, sed mi volis unue diri, kion ni faros, kaj poste klarigi kiel fari ĝin.

Por tiuj, kiuj tedas legi

Resume, la ligilo al la skriptoj estas ĉe la fino de la artikolo.

Sed vi ankoraŭ ne povos instali kaj uzi ĝin tuj. Vi unue devos eltrovi kiel la skripto trovas la deziratan fenestron. Sen ĉi tio, ne eblos diri al la skripto, kie ĝuste la fokuso devas esti translokigita. Kaj vi devas kompreni, kion fari, se subite taŭga fenestro ne estas trovita.

Kaj mi ne koncentriĝos pri kiel agordi la ekzekuton de skriptoj premante klavkombinojn. Ekzemple, en KDE ĝi estas en Sistemaj Agordoj → Ŝparvojoj → Propraj Ŝparvojoj. Ĉi tio ankaŭ devus esti la kazo en aliaj fenestraj administrantoj.

Enkonduko de wmctrl

Wmctrl — konzola ilo por interagi kun X Window Manager. Ĉi tiu estas la ŝlosila programo por la skripto. Ni rigardu rapide kiel vi povas uzi ĝin.

Unue, ni montru liston de malfermitaj fenestroj:

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

Opcio -l montras liston de ĉiuj malfermitaj fenestroj, kaj -NS aldonas la klasnomon al la eligo (skajpo.Skype, Navigilo.Firefox ktp). Ĉi tie ni bezonas la fenestran identigilon (kolumno 1), klasnomon (kolumno 3) kaj fenestronomon (lasta kolumno).

Vi povas provi aktivigi iun fenestron uzante la opcion -a:

$ wmctrl -a skype.Skype -x

Se ĉio iris laŭplane, la Skype-fenestro devus aperi sur la ekrano. Se anstataŭ la opcio -x uzi opcion -i, tiam anstataŭ la klasnomo vi povas specifi la fenestran identigilon. La problemo kun id estas, ke la fenestro id ŝanĝiĝas ĉiufoje kiam la aplikaĵo estas lanĉita kaj ni ne povas scii ĝin anticipe. Aliflanke, ĉi tiu atributo unike identigas fenestron, kio povas esti grava kiam aplikaĵo malfermas pli ol unu fenestron. Pli pri ĉi tio iom pli.

En ĉi tiu etapo ni devas memori, ke ni serĉos la deziratan fenestron uzante regex per eligo wmctrl -lx. Sed tio ne signifas, ke ni devas uzi ion komplikan. Kutime la klasnomo aŭ fenestronomo sufiĉas.

Esence, la ĉefa ideo devus jam esti klara. En la tutmondaj klavoj/mallongigaj agordoj por via fenestra administranto, agordu la bezonatan kombinaĵon por ekzekuti la skripton.

Kiel uzi skriptojn

Unue vi devas instali konzolajn utilecojn wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Poste vi devas elŝuti la skriptojn kaj aldoni ilin al $ PADO. Mi kutime enmetas ilin ~/bin:

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

Se la dosierujo ~/bin ne estis tie, tiam vi devas krei ĝin kaj rekomenci (aŭ re-ensaluti), alie ~/bin ne trafos $ PADO. Se ĉio estas farita ĝuste, tiam la skriptoj devus esti alireblaj de la konzolo kaj Tab-kompletigo devus funkcii.

Ĉefa skripto showwin prenas 2 parametrojn: la unua estas regex, per kiu ni serĉos la bezonatan fenestron, kaj la dua parametro estas komando, kiu devas esti efektivigita se la bezonata fenestro ne estas trovita.

Vi povas provi ruli skripton, ekzemple:

$ showwin "Mozilla Firefox$" firefox

Se Firefox estas instalita, ĝia fenestro devus ricevi fokuson. Eĉ se Firefox ne funkciis, ĝi devus komenciĝi.

Se ĝi funkcias, tiam vi povas provi agordi la ekzekuton de komandoj pri kombinaĵoj. En la tutmondaj klavoj/mallongigaj agordoj aldonu:

  • Alt+F: montru "Mozilla Firefox$" firefox
  • Alt+D: montru "Mozilla Firefox (Privata Retumado)$" "firefox -private-window"
  • Alt+C: showwin "chromium-browser.Chromium-browser N*" krom-retumilo
  • Alt+X: montru "chromium-browser.Chromium-browser I*" "chromium-browser -inkognite"
  • Alt+S: montru "skype.Skype" skypeforlinux
  • Alt+E: showwin "jetbrains-idea" ideo.sh

Ktp. Ĉiuj povas agordi klavajn kombinaĵojn kaj programaron laŭplaĉe.
Se ĉio funkciis ĝuste, tiam uzante la suprajn kombinaĵojn ni povos ŝanĝi inter fenestroj simple premante klavojn.

Mi seniluziigos kromamantojn: ĝi povas inkognite distingi regulan fenestron per sia eligo wmctrl Vi ne povas, ili havas la samajn klasnomojn kaj fenestrotitolojn. En la proponita regex, la signoj N* kaj I* estas bezonataj nur por ke ĉi tiuj regulaj esprimoj diferencas unu de la alia kaj ili povas esti asignitaj kiel la ĉefaj fenestroj.

Por restarigi la ĉefan fenestron de la antaŭa kombinaĵo (fakte por regex, kiu showwin vokita lastan fojon) vi devas voki la skripton showwinDetach. Mi havas ĉi tiun skripton asignita al klavkombinaĵo Alt + Retrospaco.

Ĉe la skripto showwin estas unu plia funkcio. Kiam ĝi estas vokita per unu parametro (ĉi-kaze la parametro estas nur identigilo), ĝi tute ne kontrolas la regex-on, sed konsideras ĉiujn fenestrojn taŭgajn. En si mem, ĉi tio ŝajnas senutila, sed tiamaniere ni povas indiki ajnan fenestron kiel la ĉefan kaj rapide ŝanĝi al tiu aparta fenestro.

Mi havas la jenajn kombinaĵojn agordita:

  • Alt+1: montru "Personaklavo1"
  • Alt+2: montru "Personaklavo2"
  • ...
  • Alt+0: montru "Personaklavo0"
  • Alt+Retrospaco: showwinDetach

Tiel mi povas ligi ajnajn fenestrojn al kombinaĵoj Alt + 1...Alt + 0. Nur klakante Alt + 1 Mi ligas la nunan fenestron al ĉi tiu kombinaĵo. Mi povas nuligi la ligadon klakante Alt + 1, kaj tiam Alt + Retrospaco. Aŭ fermu la fenestron, tio ankaŭ funkcias.

Poste mi rakontos al vi kelkajn teknikajn detalojn. Vi ne devas legi ilin, sed nur provu agordi ilin kaj vidi. Sed mi tamen rekomendus kompreni la skriptojn de aliaj homoj antaŭ ol ruli ilin en via komputilo :).

Kiel distingi inter malsamaj fenestroj de la sama aplikaĵo

Principe, la plej unua ekzemplo "wmctrl -a skype.Skype -x" funkciis kaj povas esti uzata. Sed ni rigardu denove la ekzemplon kun Firefox, en kiu 2 fenestroj estas malfermitaj:

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

La unua fenestro estas normala reĝimo, kaj la dua estas Privata Retumado. Mi ŝatus konsideri ĉi tiujn fenestrojn kiel malsamajn aplikojn kaj ŝanĝi al ili per malsamaj klavkombinaĵoj.

Necesas kompliki la skripton, kiu ŝanĝas fenestrojn. Mi uzis ĉi tiun solvon: montri liston de ĉiuj fenestroj, faru grep per regex, prenu la unuan linion kun kapon, akiru la unuan kolumnon (ĉi tio estos la fenestra id) uzante tranĉo, ŝanĝu al fenestro per id.

Devus esti ŝerco pri regulaj esprimoj kaj du problemoj, sed fakte mi uzas nenion komplikan. Mi bezonas regulajn esprimojn, por ke mi povu indiki la finon de la linio (la simbolo “$”) kaj distingi “Mozilla Firefox$” de “Mozilla Firefox (Private Browsing)$”.

La komando aspektas kiel ĉi tio:

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

Ĉi tie vi jam povas diveni pri la dua trajto de la skripto: se grep resendas nenion, tiam la dezirata aplikaĵo ne estas malfermita kaj vi devas komenci ĝin per ekzekuto de la komando de la dua parametro. Kaj tiam periode kontrolu ĉu la bezonata fenestro malfermiĝis por transdoni fokuson al ĝi. Mi ne koncentriĝos pri tio; ĉiu, kiu bezonas ĝin, rigardos la fontojn.

Kiam aplikaĵfenestroj ne estas distingeblaj

Do, ni lernis kiel transdoni fokuson al la fenestro de la dezirata aplikaĵo. Sed kio se aplikaĵo havas pli ol unu fenestron malfermitaj? Al kiu mi fokusu? La supra skripto plej verŝajne translokiĝos al la unua malfermita fenestro. Tamen ni ŝatus pli da fleksebleco. Mi ŝatus povi memori kiun fenestron ni bezonas kaj ŝanĝi al tiu aparta fenestro.

La ideo estis jena: Se ni volas memori specifan fenestron por klavkombinaĵo, tiam ni devas premi ĉi tiun kombinaĵon kiam la dezirata fenestro estas enfokusigita. Estonte, kiam vi premas ĉi tiun kombinaĵon, la fokuso estos donita al ĉi tiu fenestro. Ĝis la fenestro fermiĝas aŭ ni faros rekomencon por ĉi tiu skriptokombinaĵo showwinDetach.

Skripto-algoritmo showwin io kiel ĉi tio:

  • Kontrolu ĉu ni antaŭe memoris la identigilon de la fenestro al kiu fokuso devus esti transdonita.
    Se vi memoras kaj tia fenestro ankoraŭ ekzistas, tiam ni transdonas fokuson al ĝi kaj eliras.
  • Ni rigardas kiu fenestro estas nuntempe enfokusigita, kaj se ĝi kongruas kun nia peto, tiam memoru ĝian identigilon por iri al ĝi estonte kaj eliri.
  • Ni iru almenaŭ al iu taŭga fenestro se ĝi ekzistas aŭ malfermas la deziratan aplikaĵon.

Vi povas ekscii, kiu fenestro estas nuntempe enfokusigita uzante la xdotool-konzolan ilon konvertante ĝian eligon al deksesuma formato:

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

La plej facila maniero memori ion en bash estas krei dosierojn en virtuala dosiersistemo situanta en memoro. En Ubuntu ĉi tio estas ebligita defaŭlte en /dev/shm/. Mi povas nenion diri pri aliaj distribuoj, mi esperas, ke ankaŭ estas io simila. Vi povas rigardi per la komando:

$ mount -l | grep tmpfs

La skripto kreos malplenajn dosierujojn en ĉi tiu dosierujo, jene: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Aldone, ĉiufoje kiam ĝi estas vokita, ĝi kreos simbolligon /dev/shm/$USER/showwin/showwin_last sur /dev/shm/$USER/showwin/$SEARCH_REGEX. Ĉi tio estos bezonata por, se necese, forigi la fenestran identigilon por certa kombinaĵo per skripto showwinDetach.

Kion oni povas plibonigi

Unue, la skriptoj devas esti agorditaj permane. Verŝajne, pro la bezono enprofundiĝi kaj fari multon per viaj manoj, multaj el vi eĉ ne provos agordi la sistemon. Se eblus simple instali la pakaĵon kaj agordi ĉion pli facile, tiam eble ĝi gajnus iom da populareco. Kaj tiam rigardu, la aplikaĵo estus liberigita en normajn distribuojn.

Kaj eble oni povas fari ĝin pli facile. Se per la id de fenestro vi povas ekscii la id de la procezo kiu kreis ĝin, kaj per la id de la procezo vi povas ekscii kiu komando kreis ĝin, tiam eblus aŭtomatigi la instalinstrukciojn. Fakte, mi ne komprenis, ĉu tio, kion mi skribis en ĉi tiu alineo, estas ebla. La fakto estas, ke mi persone estas kontenta pri la maniero kiel ĝi funkcias nun. Sed se iu alia ol mi trovas la tutan aliron oportuna kaj iu plibonigos ĝin, tiam mi volonte uzos pli bonan solvon.

Alia problemo, kiel mi jam skribis, estas ke en kelkaj kazoj la fenestroj ne povas esti distingitaj unu de la alia. Ĝis nun mi nur observis tion per inkognito en kromio/kromo, sed eble estas io simila ie aliloke. Kiel lasta rimedo, ĉiam ekzistas la eblo de universalaj kombinaĵoj Alt + 1...Alt + 0. Denove, mi uzas Firefox kaj por mi persone ĉi tiu problemo ne estas grava.

Sed la grava problemo por mi estas, ke mi uzas Mac OS por laboro kaj mi ne povis agordi ion tian tie. utileco wmctrl Mi pensas, ke mi povis instali ĝin, sed ĝi ne vere funkcias en Mac OS. Io povas esti farita kun la aplikaĵo Aŭtomatisto, sed ĝi estas tiel malrapida, ke ĝi ne konvenas uzi eĉ kiam ĝi funkcias. Mi ankaŭ ne povis agordi klavkombinojn tiel ke ili funkciu en ĉiuj programoj. Se iu subite venas kun solvo, mi volonte uzos ĝin.

Anstataŭ konkludo

Ĝi montriĝis neatendite granda nombro da vortoj por tia ŝajne simpla funkcieco. Mi volis transdoni la ideon kaj ne troŝarĝi la tekston, sed mi ankoraŭ ne eltrovis kiel rakonti ĝin pli simple. Eble estus pli bone en videoformato, sed homoj ne ŝatas ĝin ĉi tie.

Mi parolis iomete pri kio estas sub la kapuĉo de la skripto kaj kiel agordi ĝin. Mi ne eniris detalojn pri la skripto mem, sed ĝi estas nur 50 linioj, do ne malfacilas kompreni.

Mi esperas, ke iu alia provos ĉi tiun ideon kaj eble eĉ aprezos ĝin. Mi povas diri pri mi, ke la skripto estis verkita antaŭ ĉirkaŭ 3 jaroj kaj ĝi estas TRE oportuna por mi. Tiel oportuna, ke ĝi kaŭzas gravan malkomforton kiam oni laboras kun aliuloj komputiloj. Kaj kun funkcianta MacBook.

Ligo al skriptoj

fonto: www.habr.com

Aldoni komenton