Alternatibong pamamahala ng window sa Linux

Isa ako sa nag-set ng Caps Lock para magpalit ng layout dahil tinatamad akong magpindot ng 2 key kapag napindot ko ang isa. Gusto ko pa nga ng 2 hindi kinakailangang key: Gagamit ako ng isa para i-on ang English na layout, at ang pangalawa para sa Russian. Ngunit ang pangalawang hindi kinakailangang susi ay ang pagtawag sa menu ng konteksto, na hindi kinakailangan na ito ay pinutol ng maraming mga tagagawa ng laptop. Kaya dapat makuntento ka sa kung anong meron ka.

At hindi ko rin gustong hanapin ang kanilang mga icon sa taskbar kapag lumilipat ng mga bintana, o mahuli ang mga pangalan kapag nag-scroll sa Alt + Tab, mag-scroll sa mga desktop, atbp. Gusto kong pindutin ang isang kumbinasyon ng key (perpektong isa lang, ngunit wala nang mga libreng hindi kinakailangang key) at agad na pumunta sa window na kailangan ko. Halimbawa tulad nito:

  • Alt+F: Firefox
  • Alt+D: Firefox (Pribadong Pagba-browse)
  • Alt+T: Terminal
  • Alt+M: Calculator
  • Alt+E: IntelliJ Idea
  • atbp.

Bukod dito, sa pamamagitan ng pagpindot, halimbawa, sa Alt+M Gusto kong makita ang calculator kahit na ang program na ito ay kasalukuyang tumatakbo. Kung ito ay tumatakbo, kung gayon ang window nito ay kailangang bigyan ng focus, at kung hindi, patakbuhin ang nais na programa at ilipat ang focus kapag nag-load ito.

Para sa mga kaso na hindi sakop ng nakaraang script, gusto kong magkaroon ng mga pangkalahatang kumbinasyon ng key na madaling maitalaga sa alinman sa mga bukas na bintana. Halimbawa, mayroon akong 10 kumbinasyon na itinalaga mula sa Alt + 1 sa Alt + 0, na hindi nakatali sa anumang mga programa. Click ko lang Alt + 1 at ang window na kasalukuyang nakatutok ay makakakuha ng focus kapag na-click Alt + 1.

Sa ibaba ng hiwa mayroong isang paglalarawan ng ilang higit pang mga tampok at isang sagot sa kung paano ito magagawa. Ngunit agad kong babalaan ka na ang naturang pagpapasadya "para sa iyong sarili" ay maaaring magdulot ng matinding pagkagumon at kahit na pag-withdraw kung kailangan mong gumamit ng Windows, Mac OS o kahit na computer ng ibang tao na may Linux.

Sa katunayan, kung iisipin mo, hindi kami gumagamit ng ganoon karaming programa araw-araw. Isang browser, isang terminal, isang IDE, isang uri ng messenger, isang file manager, isang calculator at, marahil, halos lahat iyon. Walang maraming key na kumbinasyon ang kailangan para masakop ang 95% ng mga pang-araw-araw na gawain.

Para sa mga programa na may maraming mga window na nakabukas, ang isa sa mga ito ay maaaring italaga bilang pangunahing isa. Halimbawa, marami kang IntelliJ Idea window na nakabukas at nakatalaga sa Alt + E. Sa ilalim ng normal na mga kondisyon, kapag pinindot mo Alt + E magbubukas ang ilang window ng program na ito, malamang na ang unang binuksan. Gayunpaman, kung nag-click ka sa Alt + E kapag ang isa sa mga bintana ng program na ito ay nakatutok na, ang partikular na window na ito ay itatalaga bilang pangunahing isa at ito ang bibigyan ng focus kapag pinindot ang mga kasunod na kumbinasyon.

Ang pangunahing window ay maaaring italaga muli. Upang gawin ito, kailangan mo munang i-reset ang kumbinasyon, at pagkatapos ay magtalaga ng isa pang window dito bilang pangunahing window. Upang i-reset ang isang kumbinasyon, kailangan mong pindutin ang kumbinasyon mismo, at pagkatapos ay isang espesyal na kumbinasyon ng pag-reset, itinalaga ko ito sa Alt + Backspace. Tatawag ito ng script na mag-aalis ng pagkakatalaga sa pangunahing window para sa nakaraang kumbinasyon. At pagkatapos ay maaari kang magtalaga ng isang bagong pangunahing window tulad ng inilarawan sa nakaraang talata. Ang pag-reset ng naka-link na window sa mga unibersal na kumbinasyon ay nangyayari sa parehong paraan.

Ang pagpapakilala ay naging mahaba, ngunit nais kong sabihin muna kung ano ang aming gagawin, at pagkatapos ay ipaliwanag kung paano ito gagawin.

Para sa mga pagod na magbasa

Sa madaling salita, ang link sa mga script ay nasa dulo ng artikulo.

Ngunit hindi mo pa rin mai-install at magagamit ito kaagad. Kailangan mo munang malaman kung paano nahahanap ng script ang nais na window. Kung wala ito, hindi posibleng sabihin sa script kung saan eksaktong kailangang ilipat ang focus. At kailangan mong maunawaan kung ano ang gagawin kung biglang hindi natagpuan ang isang angkop na window.

At hindi ako magtutuon sa kung paano i-configure ang pagpapatupad ng mga script sa pamamagitan ng pagpindot sa mga kumbinasyon ng key. Halimbawa, sa KDE ito ay nasa Mga Setting ng System β†’ Mga Shortcut β†’ Mga Custom na Shortcut. Ganito rin dapat ang kaso sa ibang mga window manager.

Ipinapakilala ang wmctrl

Wmctrl β€” console utility para sa pakikipag-ugnayan sa X Window Manager. Ito ang pangunahing programa para sa script. Tingnan natin kaagad kung paano mo ito magagamit.

Una, magpakita tayo ng listahan ng mga bukas na bintana:

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

Pagpipilian -l nagpapakita ng listahan ng lahat ng bukas na bintana, at -x idinaragdag ang pangalan ng klase sa output (skype.Skype, Navigator.Firefox atbp). Dito kailangan natin ang window id (column 1), class name (column 3) at window name (huling column).

Maaari mong subukang i-activate ang ilang window gamit ang opsyon -a:

$ wmctrl -a skype.Skype -x

Kung napunta ang lahat ayon sa plano, dapat na lumitaw ang window ng Skype sa screen. Kung sa halip na opsyon -x opsyon sa paggamit -i, pagkatapos ay sa halip na pangalan ng klase maaari mong tukuyin ang window id. Ang problema sa id ay nagbabago ang window id tuwing inilulunsad ang application at hindi namin ito malalaman nang maaga. Sa kabilang banda, ang katangiang ito ay natatanging kinikilala ang isang window, na maaaring maging mahalaga kapag ang isang application ay nagbukas ng higit sa isang window. Higit pa tungkol dito nang kaunti pa.

Sa yugtong ito kailangan nating tandaan na hahanapin natin ang nais na window gamit ang regex sa pamamagitan ng output wmctrl -lx. Ngunit hindi ito nangangahulugan na kailangan nating gumamit ng isang bagay na kumplikado. Karaniwan ang pangalan ng klase o pangalan ng window ay sapat.

Karaniwan, ang pangunahing ideya ay dapat na malinaw. Sa mga setting ng pandaigdigang hotkey/shortcut para sa iyong window manager, i-configure ang kinakailangang kumbinasyon upang maisagawa ang script.

Paano gamitin ang mga script

Una kailangan mong mag-install ng mga utility ng console wmctrl ΠΈ xdotool:

$ sudo apt-get install wmctrl xdotool

Susunod na kailangan mong i-download ang mga script at idagdag ang mga ito sa $ PATH. Karaniwan kong inilalagay ang mga ito ~/bin:

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

Kung ang direktoryo ~/bin ay wala doon, pagkatapos ay kailangan mong likhain ito at i-reboot (o muling pag-login), kung hindi man ~/bin hindi tatama $ PATH. Kung tama ang lahat, dapat na ma-access ang mga script mula sa console at dapat gumana ang pagkumpleto ng Tab.

Pangunahing script showwin tumatagal ng 2 parameter: ang una ay isang regex, kung saan hahanapin namin ang kinakailangang window, at ang pangalawang parameter ay isang command na kailangang isagawa kung ang kinakailangang window ay hindi natagpuan.

Maaari mong subukang magpatakbo ng isang script, halimbawa:

$ showwin "Mozilla Firefox$" firefox

Kung naka-install ang Firefox, dapat bigyan ng focus ang window nito. Kahit na hindi tumatakbo ang Firefox, dapat ay nagsimula na ito.

Kung gumagana ito, maaari mong subukang i-configure ang pagpapatupad ng mga utos sa mga kumbinasyon. Sa pandaigdigang mga setting ng mga hotkey/shortcut idagdag ang:

  • 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

Atbp. Lahat ay maaaring mag-configure ng mga pangunahing kumbinasyon at software ayon sa kanilang nakikitang akma.
Kung ang lahat ay gumana nang tama, pagkatapos gamit ang mga kumbinasyon sa itaas ay magagawa nating lumipat sa pagitan ng mga bintana sa pamamagitan lamang ng pagpindot sa mga key.

Biguin ko ang mga mahilig sa chrome: maaari nitong incognito na makilala ang isang regular na window sa pamamagitan ng output nito wmctrl Hindi mo magagawa, pareho sila ng mga pangalan ng klase at pamagat ng window. Sa iminungkahing regex, ang mga character na N* at I* ay kailangan lamang upang ang mga regular na expression na ito ay magkaiba sa isa't isa at maitalaga ang mga ito bilang mga pangunahing bintana.

Upang i-reset ang pangunahing window ng nakaraang kumbinasyon (sa katunayan para sa regex, na showwin tumawag sa huling pagkakataon) kailangan mong tawagan ang script showwinDetach. Itinalaga ko ang script na ito sa isang key combination Alt + Backspace.

Sa script showwin may isa pang function. Kapag ito ay tinatawag na may isang parameter (sa kasong ito ang parameter ay isang identifier lamang), hindi nito sinusuri ang regex, ngunit isinasaalang-alang ang lahat ng mga bintana na angkop. Sa sarili nito, tila walang silbi ito, ngunit sa ganitong paraan maaari nating italaga ang anumang window bilang pangunahing isa at mabilis na lumipat sa partikular na window na iyon.

Na-configure ko ang mga sumusunod na kumbinasyon:

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

Sa ganitong paraan maaari kong itali ang anumang mga bintana sa mga kumbinasyon Alt + 1...Alt + 0. Sa pamamagitan lamang ng pag-click Alt + 1 Itinatali ko ang kasalukuyang window sa kumbinasyong ito. Maaari kong kanselahin ang pagbubuklod sa pamamagitan ng pag-click Alt + 1at pagkatapos Alt + Backspace. O isara ang bintana, gumagana din iyon.

Susunod, sasabihin ko sa iyo ang ilang mga teknikal na detalye. Hindi mo kailangang basahin ang mga ito, ngunit subukan lang na i-set up ang mga ito at tingnan. Ngunit irerekomenda ko pa rin ang pag-unawa sa mga script ng ibang tao bago patakbuhin ang mga ito sa iyong computer :).

Paano makilala sa pagitan ng iba't ibang mga window ng parehong application

Sa prinsipyo, ang pinakaunang halimbawa na "wmctrl -a skype.Skype -x" ay gumagana at maaaring gamitin. Ngunit tingnan natin muli ang halimbawa sa Firefox, kung saan bukas ang 2 window:

0x04400003  0 Navigator.Firefox                   N/A Google ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Π›ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π·Π° сутки / Π₯Π°Π±Ρ€ - Mozilla Firefox (Private Browsing)

Normal mode ang unang window, at ang pangalawa ay Private Browsing. Gusto kong isaalang-alang ang mga window na ito bilang iba't ibang mga application at lumipat sa mga ito gamit ang iba't ibang mga kumbinasyon ng key.

Kinakailangang gawing kumplikado ang script na nagpapalit ng mga bintana. Ginamit ko ang solusyon na ito: ipakita ang isang listahan ng lahat ng mga bintana, gawin grep sa pamamagitan ng regex, kunin ang unang linya gamit ang ulo, kunin ang unang column (ito ang magiging window id) gamit bawasan, lumipat sa window sa pamamagitan ng id.

Dapat mayroong isang biro tungkol sa mga regular na expression at dalawang problema, ngunit sa katunayan hindi ako gumagamit ng anumang kumplikado. Kailangan ko ng mga regular na expression upang maipahiwatig ko ang dulo ng linya (ang "$" na simbolo) at makilala ang "Mozilla Firefox$" mula sa "Mozilla Firefox (Private Browsing)$".

Ang utos ay mukhang ganito:

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

Dito maaari mo nang hulaan ang tungkol sa pangalawang tampok ng script: kung ang grep ay hindi nagbabalik ng anuman, kung gayon ang nais na aplikasyon ay hindi bukas at kailangan mong simulan ito sa pamamagitan ng pagpapatupad ng utos mula sa pangalawang parameter. At pagkatapos ay pana-panahong suriin kung ang kinakailangang window ay nagbukas upang mailipat ang focus dito. Hindi ako magtutuon dito; ang sinumang nangangailangan nito ay titingnan ang mga pinagmulan.

Kapag ang mga window ng application ay hindi nakikilala

Kaya, natutunan namin kung paano ilipat ang focus sa window ng nais na application. Ngunit paano kung ang isang application ay may higit sa isang window na nakabukas? Alin ang dapat kong bigyan ng focus? Ang script sa itaas ay malamang na ililipat sa unang bukas na window. Gayunpaman, gusto namin ng higit na kakayahang umangkop. Gusto kong matandaan kung aling window ang kailangan namin at lumipat sa partikular na window na iyon.

Ang ideya ay ito: Kung gusto naming matandaan ang isang partikular na window para sa isang kumbinasyon ng key, kailangan naming pindutin ang kumbinasyong ito kapag ang nais na window ay nakatutok. Sa hinaharap, kapag pinindot mo ang kumbinasyong ito, ibibigay ang focus sa window na ito. Hanggang sa magsara ang window o magsagawa kami ng pag-reset para sa kumbinasyon ng script na ito showwinDetach.

Algoritmo ng script showwin isang bagay na tulad nito:

  • Suriin kung dati naming naalala ang id ng window kung saan dapat ilipat ang focus.
    Kung natatandaan mo at mayroon pa ring ganitong window, ililipat namin ang focus dito at lalabas.
  • Tinitingnan namin kung aling window ang kasalukuyang nakatutok, at kung tumutugma ito sa aming kahilingan, tandaan ang id nito upang pumunta dito sa hinaharap at lumabas.
  • Pumunta kami sa hindi bababa sa ilang naaangkop na window kung mayroon ito o buksan ang nais na aplikasyon.

Maaari mong malaman kung aling window ang kasalukuyang nakatutok gamit ang xdotool console utility sa pamamagitan ng pag-convert ng output nito sa hexadecimal na format:

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

Ang pinakamadaling paraan upang matandaan ang isang bagay sa bash ay ang lumikha ng mga file sa isang virtual file system na matatagpuan sa memorya. Sa Ubuntu ito ay pinagana bilang default sa /dev/shm/. Wala akong masasabi tungkol sa iba pang mga pamamahagi, umaasa ako na mayroon ding katulad. Maaari kang tumingin gamit ang utos:

$ mount -l | grep tmpfs

Ang script ay lilikha ng mga walang laman na direktoryo sa folder na ito, tulad nito: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Bukod pa rito, sa tuwing tatawagin ito ay lilikha ito ng symlink /dev/shm/$USER/showwin/showwin_last sa /dev/shm/$USER/showwin/$SEARCH_REGEX. Kakailanganin ito upang, kung kinakailangan, alisin ang window id para sa isang partikular na kumbinasyon gamit ang isang script showwinDetach.

Ano ang maaaring mapabuti

Una, ang mga script ay dapat na i-configure nang manu-mano. Tiyak, dahil sa pangangailangang bungkalin at gawin ang marami gamit ang iyong mga kamay, marami sa inyo ang hindi man lang susubukan na i-configure ang system. Kung posible na i-install lamang ang package at i-configure ang lahat nang mas madali, kung gayon marahil ay makakakuha ito ng ilang katanyagan. At pagkatapos ay tingnan, ang application ay ilalabas sa karaniwang mga distribusyon.

At marahil ito ay maaaring gawin nang mas madali. Kung sa pamamagitan ng id ng isang window maaari mong malaman ang id ng proseso na lumikha nito, at sa pamamagitan ng id ng proseso maaari mong malaman kung aling utos ang lumikha nito, kung gayon posible na i-automate ang pag-setup. Sa katunayan, hindi ko naintindihan kung posible ba ang isinulat ko sa talatang ito. Ang katotohanan ay personal akong nasisiyahan sa paraan ng paggana nito ngayon. Ngunit kung ang isang tao maliban sa akin ay nakahanap ng buong diskarte na maginhawa at may nagpapabuti nito, pagkatapos ay magiging masaya akong gumamit ng isang mas mahusay na solusyon.

Ang isa pang problema, tulad ng isinulat ko na, ay sa ilang mga kaso ang mga bintana ay hindi maaaring makilala sa isa't isa. Sa ngayon ay naobserbahan ko lang ito gamit ang incognito sa chrome/chromium, ngunit marahil ay may katulad sa ibang lugar. Bilang isang huling paraan, palaging may opsyon ng mga unibersal na kumbinasyon Alt + 1...Alt + 0. Muli, gumagamit ako ng Firefox at para sa akin personal na ang problemang ito ay hindi makabuluhan.

Ngunit ang malaking problema para sa akin ay ang paggamit ko ng Mac OS para sa trabaho at hindi ko ma-configure ang anumang bagay na ganoon doon. kagamitan wmctrl Sa tingin ko na-install ko ito, ngunit hindi talaga ito gumagana sa Mac OS. May magagawa sa application Automator, ngunit napakabagal nito kaya hindi ito maginhawang gamitin kahit na ito ay gumagana. Hindi rin ako makapag-set up ng mga key combination para gumana ang mga ito sa lahat ng program. Kung may biglang makaisip ng solusyon, ikalulugod kong gamitin ito.

Sa halip ng isang konklusyon

Ito ay naging isang hindi inaasahang malaking bilang ng mga salita para sa isang tila simpleng pag-andar. Gusto kong ihatid ang ideya at huwag mag-overload ang teksto, ngunit hindi ko pa naiisip kung paano ito sasabihin nang mas simple. Marahil ay mas maganda ito sa format ng video, ngunit hindi ito gusto ng mga tao dito.

Nag-usap ako ng kaunti tungkol sa kung ano ang nasa ilalim ng hood ng script at kung paano i-configure ito. Hindi ko na inalam ang mga detalye ng script mismo, pero 50 lines lang ito, kaya hindi mahirap intindihin.

Umaasa ako na may ibang sumubok ng ideyang ito at marahil ay pahalagahan ito. Masasabi ko tungkol sa aking sarili na ang script ay isinulat tungkol sa 3 taon na ang nakakaraan at ito ay VERY maginhawa para sa akin. Napakaginhawa na nagdudulot ito ng malubhang kakulangan sa ginhawa kapag nagtatrabaho sa mga computer ng ibang tao. At may gumaganang MacBook.

Link sa mga script

Pinagmulan: www.habr.com

Magdagdag ng komento