Linux-da alternativ pəncərə idarəetməsi

Mən Caps Lock-u planları dəyişmək üçün təyin edənlərdən biriyəm, çünki birinə basa bildiyim halda 2 düyməni basmağa çox tənbəl oluram. Mən hətta 2 lazımsız açar istərdim: birini ingilis dilini, ikincisini isə rus dilini açmaq üçün istifadə edərdim. Ancaq ikinci lazımsız açar kontekst menyusunu çağırmaqdır, o qədər lazımsızdır ki, bir çox noutbuk istehsalçıları tərəfindən kəsilir. Odur ki, sahib olduqlarınla ​​kifayətlənməlisən.

Həm də pəncərələri dəyişdirərkən tapşırıqlar panelində onların nişanlarını axtarmaq və ya sürüşərkən adları tutmaq istəmirəm. Alt + Tab, masaüstləri arasında sürüşdürün və s. Mən düymələr kombinasiyasını sıxmaq istəyirəm (ideal olaraq yalnız bir, lakin artıq pulsuz lazımsız düymələr yoxdur) və dərhal mənə lazım olan pəncərəyə keçmək istəyirəm. Məsələn, bu kimi:

  • Alt+F: Firefox
  • Alt+D: Firefox (Şəxsi Baxış)
  • Alt+T: Terminal
  • Alt+M: Kalkulyator
  • Alt+E: IntelliJ Idea
  • və s.

Üstəlik, məsələn, üzərinə basaraq Alt+M Bu proqramın hazırda işlək olub-olmamasından asılı olmayaraq kalkulyatoru görmək istəyirəm. Əgər o işləyirsə, o zaman onun pəncərəsinə diqqət yetirilməlidir, yoxsa, istədiyiniz proqramı işə salın və yükləndikdə fokusunu köçürün.

Əvvəlki skriptlə əhatə olunmayan hallar üçün, açıq pəncərələrin hər hansı birinə asanlıqla təyin edilə bilən universal düymə birləşmələrinə sahib olmaq istəyirəm. Məsələn, məndən təyin olunmuş 10 kombinasiyam var Alt + 1 üzrə Alt + 0heç bir proqrama bağlı olmayan. Mən sadəcə klikləyə bilərəm Alt + 1 və hazırda fokusda olan pəncərə kliklədikdə fokuslanacaq Alt + 1.

Kəsimin altında daha bir neçə xüsusiyyətin təsviri və bunun necə edilə biləcəyinə cavab var. Ancaq dərhal xəbərdarlıq edəcəm ki, belə "özünüz üçün" fərdiləşdirmə, Windows, Mac OS və ya Linux ilə başqasının kompüterindən istifadə etməlisinizsə, ciddi asılılığa və hətta geri çəkilməyə səbəb ola bilər.

Əslində, düşünsəniz, biz gündəlik olaraq o qədər proqramdan istifadə etmirik. Brauzer, terminal, IDE, bir növ messencer, fayl meneceri, kalkulyator və bəlkə də, demək olar ki, hamısı. Gündəlik işlərin 95%-ni əhatə etmək üçün lazım olan çoxlu düymə birləşmələri yoxdur.

Bir neçə pəncərəsi olan proqramlar üçün onlardan biri əsas kimi təyin edilə bilər. Məsələn, sizin bir neçə IntelliJ Idea pəncərəniz var və onlara təyin olunub Alt + E. Normal şəraitdə, basdığınız zaman Alt + E bu proqramın bəzi pəncərələri açılacaq, çox güman ki, ilk açılan pəncərə. Ancaq üzərinə klikləsəniz Alt + E bu proqramın pəncərələrindən biri artıq fokusda olduqda, bu xüsusi pəncərə əsas kimi təyin ediləcək və sonrakı birləşmələrə basıldıqda diqqət yetiriləcək.

Əsas pəncərə yenidən təyin edilə bilər. Bunun üçün əvvəlcə kombinasiyanı sıfırlamalı, sonra ona əsas pəncərə kimi başqa bir pəncərə təyin etməlisiniz. Kombinasiyanı sıfırlamaq üçün birləşmənin özünü sıxmaq lazımdır, sonra isə xüsusi sıfırlama kombinasiyası, mən onu təyin etmişəm. Alt+Backspace. Bu, əvvəlki birləşmə üçün əsas pəncərənin təyinatını ləğv edəcək skripti çağıracaq. Və sonra əvvəlki paraqrafda təsvir olunduğu kimi yeni bir əsas pəncərə təyin edə bilərsiniz. Əlaqəli pəncərənin universal birləşmələrə yenidən qurulması eyni şəkildə baş verir.

Giriş uzun oldu, amma mən əvvəlcə nə edəcəyimizi danışmaq, sonra bunu necə edəcəyimizi izah etmək istədim.

Oxumaqdan bezənlər üçün

Bir sözlə, skriptlərə keçid məqalənin sonundadır.

Lakin siz hələ də onu dərhal quraşdırıb istifadə edə bilməyəcəksiniz. Əvvəlcə skriptin istədiyiniz pəncərəni necə tapdığını anlamalı olacaqsınız. Bunsuz, skriptə fokusun tam olaraq hara köçürülməsi lazım olduğunu söyləmək mümkün olmayacaq. Və birdən uyğun bir pəncərə tapılmadıqda nə edəcəyinizi başa düşməlisiniz.

Düymə birləşmələrini basaraq skriptlərin icrasını necə konfiqurasiya edəcəyimə diqqət yetirməyəcəyəm. Məsələn, KDE-də bu, Sistem Parametrləri → Qısa yollar → Xüsusi Qısayollar bölməsindədir. Bu, digər pəncərə idarəçilərində də belə olmalıdır.

wmctrl ilə tanış olun

Wmctrl — X Window Manager ilə qarşılıqlı əlaqə üçün konsol yardım proqramı. Bu skript üçün əsas proqramdır. Gəlin ondan necə istifadə edə biləcəyinizi qısaca nəzərdən keçirək.

Əvvəlcə açıq pəncərələrin siyahısını göstərək:

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

Seçim -l bütün açıq pəncərələrin siyahısını göstərir və -NS sinif adını çıxışa əlavə edir (skype.Skype, Naviqator.Firefox və s.). Burada bizə pəncərə id (sütun 1), sinif adı (sütun 3) və pəncərə adı (son sütun) lazımdır.

Seçimdən istifadə edərək bəzi pəncərələri aktivləşdirməyə cəhd edə bilərsiniz -a:

$ wmctrl -a skype.Skype -x

Hər şey plana uyğun getsə, ekranda Skype pəncərəsi görünməlidir. Əgər seçim əvəzinə -x istifadə seçimi -i, sonra sinif adının əvəzinə pəncərə identifikatorunu təyin edə bilərsiniz. İd ilə bağlı problem ondadır ki, proqram hər dəfə işə salındıqda pəncərə id-si dəyişir və biz bunu əvvəlcədən bilə bilmirik. Digər tərəfdən, bu atribut bir pəncərəni unikal şəkildə müəyyənləşdirir, proqram birdən çox pəncərə açdıqda vacib ola bilər. Bu barədə bir az daha ətraflı.

Bu mərhələdə yadda saxlamalıyıq ki, çıxışa görə regexdən istifadə edərək istədiyiniz pəncərəni axtaracağıq wmctrl -lx. Amma bu o demək deyil ki, biz mürəkkəb bir şeydən istifadə etməliyik. Adətən sinif adı və ya pəncərə adı kifayətdir.

Prinsipcə, əsas fikir artıq aydın olmalıdır. Pəncərə meneceriniz üçün qlobal isti düymələr/qısayollar parametrlərində skripti icra etmək üçün tələb olunan kombinasiyanı konfiqurasiya edin.

Skriptlərdən necə istifadə etmək olar

Əvvəlcə konsol yardım proqramlarını quraşdırmalısınız wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Sonra skriptləri yükləməli və onları əlavə etməlisiniz $ PATH. Mən adətən onları qoyuram ~/bin:

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

Əgər kataloq ~/bin yox idi, onda onu yaratmalı və yenidən başladın (və ya yenidən daxil olun), əks halda ~/bin vurmayacaq $ PATH. Hər şey düzgün aparılırsa, skriptlər konsoldan əlçatan olmalıdır və Tab tamamlama işləməlidir.

Əsas skript showwin 2 parametr qəbul edir: birincisi regexdir, onun vasitəsilə biz tələb olunan pəncərəni axtaracağıq, ikinci parametr isə tələb olunan pəncərə tapılmadıqda yerinə yetirilməli olan əmrdir.

Bir skript işə salmağa cəhd edə bilərsiniz, məsələn:

$ showwin "Mozilla Firefox$" firefox

Firefox quraşdırılıbsa, onun pəncərəsinə diqqət yetirilməlidir. Firefox işləməsə belə, işə başlamalı idi.

Əgər işləyirsə, o zaman kombinasiyalarda əmrlərin icrasını konfiqurasiya etməyə cəhd edə bilərsiniz. Qlobal isti düymələr/qısayol parametrlərində əlavə edin:

  • Alt+F: “Mozilla Firefox$” firefox-u göstərin
  • Alt+D: showwin "Mozilla Firefox (Şəxsi Baxış)$" "firefox -özəl pəncərə"
  • Alt+C: showwin "xrom-brauzer. Chromium-brauzer N*" xrom-brauzer
  • Alt+X: showwin "xrom-brauzer. Chromium-brauzer I*" "xrom-brauzer -inkoqnito"
  • Alt+S: “skype.Skype” skypeforlinux-u göstərin
  • Alt+E: showwin “jetbrains-idea” idea.sh

Və s. Hər kəs öz bildiyi kimi düymə kombinasiyalarını və proqram təminatını konfiqurasiya edə bilər.
Hər şey düzgün aparılıbsa, yuxarıdakı birləşmələrdən istifadə edərək, sadəcə düymələri basaraq pəncərələr arasında keçid edə biləcəyik.

Xrom həvəskarlarını məyus edəcəm: o, adi pəncərəni çıxışı ilə inkoqnito rejimində fərqləndirə bilər wmctrl Siz edə bilməzsiniz, onların eyni sinif adları və pəncərə başlıqları var. Təklif olunan regexdə N* və I* simvolları yalnız ona görə lazımdır ki, bu müntəzəm ifadələr bir-birindən fərqlənsin və onlar əsas pəncərələr kimi təyin olunsunlar.

Əvvəlki birləşmənin əsas pəncərəsini yenidən qurmaq üçün (əslində regex üçün, hansı showwin sonuncu dəfə zəng etdi) skriptə zəng etməlisiniz showwinDetach. Məndə bu skript düymələr birləşməsinə təyin olunub Alt+Backspace.

Ssenaridə showwin daha bir funksiyası var. Bir parametrlə çağırıldıqda (bu halda parametr sadəcə identifikatordur), ümumiyyətlə regexi yoxlamır, bütün pəncərələri uyğun hesab edir. Özlüyündə bu faydasız görünür, lakin bu yolla biz istənilən pəncərəni əsas pəncərə kimi təyin edə və tez həmin pəncərəyə keçə bilərik.

Aşağıdakı birləşmələri konfiqurasiya etmişəm:

  • Alt+1: "CustomKey1"-i göstərin
  • Alt+2: "CustomKey2"-i göstərin
  • ...
  • Alt+0: "CustomKey0"-i göstərin
  • Alt+Backspace: showwinDetach

Bu yolla mən istənilən pəncərəni birləşmələrə bağlaya bilərəm Alt + 1...Alt + 0. Sadəcə klikləməklə Alt + 1 Mən cari pəncərəni bu kombinasiyaya bağlayıram. Mən klikləməklə bağlamanı ləğv edə bilərəm Alt + 1və sonra Alt+Backspace. Və ya pəncərəni bağlayın, bu da işləyir.

Sonra sizə bəzi texniki detalları deyəcəyəm. Onları oxumaq lazım deyil, sadəcə onları qurmağa və görməyə çalışın. Ancaq yenə də başqalarının skriptlərini kompüterinizdə işə salmazdan əvvəl başa düşməyi tövsiyə edərdim :).

Eyni tətbiqin müxtəlif pəncərələrini necə ayırd etmək olar

Prinsipcə, ilk nümunə “wmctrl -a skype.Skype -x” işləyirdi və istifadə edilə bilər. Ancaq 2 pəncərənin açıq olduğu Firefox ilə nümunəyə yenidən baxaq:

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

Birinci pəncərə normal rejimdir, ikincisi isə Şəxsi Baxışdır. Mən bu pəncərələri fərqli proqramlar hesab etmək və müxtəlif düymə birləşmələrindən istifadə edərək onlara keçmək istərdim.

Pəncərələri dəyişdirən skripti mürəkkəbləşdirmək lazımdır. Mən bu həlldən istifadə etdim: bütün pəncərələrin siyahısını göstərin, edin grep regex ilə ilk sətri götürün baş, istifadə edərək, ilk sütunu əldə edin (bu pəncərə id olacaq). kəsmək, id ilə pəncərəyə keçin.

Normal ifadələr və iki problem haqqında bir zarafat olmalıdır, amma əslində mən mürəkkəb bir şey istifadə etmirəm. Mənə müntəzəm ifadələrə ehtiyacım var ki, sətrin sonunu (“$” simvolu) göstərim və “Mozilla Firefox$” ilə “Mozilla Firefox (Şəxsi Baxış)$”ı fərqləndirim.

Komanda bu kimi görünür:

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

Burada skriptin ikinci xüsusiyyəti haqqında artıq təxmin edə bilərsiniz: grep heç bir şey qaytarmırsa, istədiyiniz proqram açıq deyil və ikinci parametrdən əmri yerinə yetirərək işə başlamaq lazımdır. Və sonra diqqəti ona köçürmək üçün lazımi pəncərənin açılıb-açılmadığını vaxtaşırı yoxlayın. Mən buna diqqət yetirməyəcəyəm, ehtiyacı olan hər kəs mənbələrə baxacaq.

Tətbiq pəncərələri fərqlənmədikdə

Beləliklə, diqqəti istədiyiniz tətbiqin pəncərəsinə necə köçürməyi öyrəndik. Bəs tətbiqin birdən çox pəncərəsi açıqdırsa nə olacaq? Hansına diqqət yetirməliyəm? Yuxarıdakı skript çox güman ki, ilk açıq pəncərəyə köçürüləcək. Bununla belə, biz daha çox çeviklik istərdik. İstərdim ki, bizə hansı pəncərə lazım olduğunu xatırlayaq və həmin pəncərəyə keçim.

İdeya belə idi: Əgər düymələr kombinasiyası üçün konkret pəncərəni yadda saxlamaq istəyiriksə, o zaman istədiyiniz pəncərə fokusda olduqda bu kombinasiyanı sıxmalıyıq. Gələcəkdə bu kombinasiyaya basdığınız zaman diqqət bu pəncərəyə veriləcək. Pəncərə bağlanana qədər və ya biz bu skript kombinasiyası üçün sıfırlama həyata keçirənə qədər showwinDetach.

Skript alqoritmi showwin bu kimi bir şey:

  • Daha əvvəl fokusun köçürülməli olduğu pəncərənin id-sini xatırlayıb-yadda saxlamadığımızı yoxlayın.
    Əgər xatırlayırsınızsa və belə bir pəncərə hələ də mövcuddursa, o zaman diqqəti ona köçürür və çıxırıq.
  • Hazırda hansı pəncərənin diqqət mərkəzində olduğuna baxırıq və əgər o, sorğumuza uyğun gəlirsə, gələcəkdə ona getmək və çıxmaq üçün onun id-sini yadda saxla.
  • Mövcuddursa, ən azı uyğun bir pəncərəyə gedirik və ya istədiyiniz proqramı açırıq.

Çıxışını onaltılıq formata çevirməklə xdotool konsol yardım proqramından istifadə edərək hazırda hansı pəncərənin diqqət mərkəzində olduğunu öyrənə bilərsiniz:

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

Bash-da nəyisə yadda saxlamağın ən asan yolu yaddaşda yerləşən virtual fayl sistemində fayllar yaratmaqdır. Ubuntu-da bu, standart olaraq aktivdir /dev/shm/. Digər paylamalar haqqında heç nə deyə bilmərəm, ümid edirəm ki, oxşar bir şey də var. Komanda ilə baxa bilərsiniz:

$ mount -l | grep tmpfs

Skript bu qovluqda aşağıdakı kimi boş qovluqlar yaradacaq: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Bundan əlavə, hər dəfə çağırılanda simvolik əlaqə yaradacaqdır /dev/shm/$USER/showwin/showwin_last haqqında /dev/shm/$USER/showwin/$SEARCH_REGEX. Bu, lazım gələrsə, bir skriptdən istifadə edərək müəyyən bir birləşmə üçün pəncərə id-ni silmək üçün lazım olacaq showwinDetach.

Nəyi yaxşılaşdırmaq olar

Birincisi, skriptlər əl ilə konfiqurasiya edilməlidir. Şübhəsiz ki, əllərinizlə çox şey araşdırmaq və etmək ehtiyacı səbəbindən bir çoxunuz sistemi konfiqurasiya etməyə belə cəhd etməyəcəksiniz. Paketi sadəcə quraşdırmaq və hər şeyi daha asan konfiqurasiya etmək mümkün olsaydı, bəlkə də bir qədər populyarlıq qazanardı. Və sonra baxın, tətbiq standart paylamalara buraxılacaq.

Və bəlkə də bunu daha asan etmək olar. Pəncərənin id-si ilə onu yaradan prosesin id-sini, prosesin id-si ilə isə onu hansı komandanın yaratdığını öyrənə bilsəniz, onda quraşdırmanı avtomatlaşdırmaq mümkün olardı. Əslində bu bənddə yazdıqlarımın mümkün olub-olmadığını başa düşmədim. Fakt budur ki, mən şəxsən onun indiki işindən razıyam. Amma məndən başqa kimsə bütün yanaşmanı əlverişli hesab etsə və kimsə onu təkmilləşdirsə, mən daha yaxşı həll yolu istifadə etməkdən məmnun olaram.

Başqa bir problem, artıq yazdığım kimi, bəzi hallarda pəncərələrin bir-birindən fərqlənə bilməməsidir. İndiyə qədər mən bunu yalnız xrom/xromda inkoqnito ilə müşahidə etmişəm, amma bəlkə də başqa yerdə buna bənzər bir şey var. Son çarə olaraq, həmişə universal birləşmələr seçimi var Alt + 1...Alt + 0. Yenə Firefox istifadə edirəm və şəxsən mənim üçün bu problem əhəmiyyətli deyil.

Ancaq mənim üçün əhəmiyyətli problem odur ki, Mac OS-dən iş üçün istifadə edirəm və orada belə bir şey konfiqurasiya edə bilmədim. kommunal wmctrl Düşünürəm ki, onu quraşdıra bildim, lakin o, həqiqətən Mac OS-də işləmir. Tətbiqlə nəsə etmək olar Automator, lakin o qədər yavaşdır ki, işləyərkən belə istifadə etmək rahat deyil. Mən də bütün proqramlarda işləməsi üçün düymə birləşmələrini qura bilmədim. Birdən kimsə bir həll yolu tapsa, mən onu istifadə etməkdən məmnun olaram.

Bunun əvəzinə bir nəticəyə

Belə sadə görünən funksionallıq üçün gözlənilmədən çox sayda söz olduğu ortaya çıxdı. Mən fikri çatdırmaq və mətni həddən artıq yükləməmək istədim, amma bunu daha sadə şəkildə necə izah edəcəyimi hələ başa düşməmişəm. Ola bilsin ki, video formatında daha yaxşı olardı, amma burada insanların xoşuna gəlmir.

Skriptin başlığı altında nə olduğunu və onu necə konfiqurasiya etmək barədə bir az danışdım. Ssenarinin özünün təfərrüatlarına girmədim, ancaq cəmi 50 sətirdir, ona görə də başa düşmək çətin deyil.

Ümid edirəm ki, başqası bu ideyanı sınayacaq və bəlkə də bunu qiymətləndirəcək. Özüm haqqında deyə bilərəm ki, ssenari təxminən 3 il əvvəl yazılıb və mənim üçün ÇOX rahatdır. O qədər rahatdır ki, başqalarının kompüterləri ilə işləyərkən ciddi narahatlıq yaradır. Və işləyən MacBook ilə.

Skriptlərə keçid

Mənbə: www.habr.com

Добавить комментарий