Алтернативно управљање прозорима у Линуку

Ја сам један од оних који су подесили Цапс Лоцк да мењају распореде јер сам превише лењ да притиснем 2 тастера када могу да притиснем један. Желео бих чак 2 непотребна тастера: један бих користио да укључим енглески распоред, а други за руски. Али други непотребан кључ је позивање контекстног менија, који је толико непотребан да га многи произвођачи лаптопа избацују. Дакле, морате бити задовољни оним што имате.

Такође не желим да тражим њихове иконе на траци задатака када мењам прозоре, нити да ухватим имена када се крећете кроз Алт + Таб, скроловање по радним површинама итд. Желим да притиснем комбинацију тастера (идеално само један, али више нема бесплатних непотребних тастера) и одмах дођем до прозора који ми је потребан. На пример овако:

  • Алт+Ф: Фирефок
  • Алт+Д: Фирефок (приватно прегледање)
  • Алт+Т: Терминал
  • Алт+М: Калкулатор
  • Алт+Е: ИнтеллиЈ идеја
  • итд.

Штавише, притиском, на пример, на Алт+М Желим да видим калкулатор без обзира да ли је овај програм тренутно покренут. Ако је покренут, онда његовом прозору треба дати фокус, а ако не, покрените жељени програм и пребаците фокус када се учита.

За случајеве који нису обухваћени претходном скриптом, желим да имам универзалне комбинације тастера које се лако могу доделити било ком од отворених прозора. На пример, имам 10 додељених комбинација од Алт + КСНУМКС до Алт + КСНУМКС, који нису везани ни за један програм. Могу само да кликнем Алт + КСНУМКС а прозор који је тренутно у фокусу ће добити фокус када се кликне Алт + КСНУМКС.

Испод реза налази се опис још неколико карактеристика и одговор како се то може урадити. Али одмах ћу вас упозорити да такво прилагођавање „за себе“ може изазвати озбиљну зависност, па чак и повлачење ако треба да користите Виндовс, Мац ОС или чак нечији рачунар са Линуком.

У ствари, ако размислите о томе, ми не користимо толико програма на дневној бази. Претраживач, терминал, ИДЕ, нека врста гласника, менаџер датотека, калкулатор и, можда, то је скоро све. Није потребно много комбинација тастера за покривање 95% свакодневних задатака.

За програме који имају више отворених прозора, један од њих се може означити као главни. На пример, имате више отворених прозора ИнтеллиЈ Идеа који су им додељени Алт + Е. У нормалним условима, када притиснете Алт + Е отвориће се неки прозор овог програма, највероватније онај који је први отворен. Међутим, ако кликнете на Алт + Е када је један од прозора овог програма већ у фокусу, онда ће овај одређени прозор бити додељен као главни и то ће бити онај који ће добити фокус када се притисну следеће комбинације.

Главни прозор се може поново доделити. Да бисте то урадили, прво морате ресетовати комбинацију, а затим јој доделити други прозор као главни прозор. Да бисте ресетовали комбинацију, потребно је да притиснете саму комбинацију, а затим специјалну комбинацију за ресетовање којој је додељена Алт+Бацкспаце. Ово ће позвати скрипту која ће опозвати главни прозор за претходну комбинацију. А онда можете доделити нови главни прозор као што је описано у претходном параграфу. Ресетовање повезаног прозора на универзалне комбинације се дешава на исти начин.

Увод се показао дугим, али желео сам прво да кажем шта ћемо да радимо, а затим да објасним како да то урадимо.

За оне који су уморни од читања

Укратко, веза до скрипти је на крају чланка.

Али и даље нећете моћи да га инсталирате и користите одмах. Прво ћете морати да схватите како скрипта проналази жељени прозор. Без овога, неће бити могуће рећи скрипти где тачно фокус треба да се пренесе. И морате разумети шта да радите ако се изненада не пронађе одговарајући прозор.

И нећу се фокусирати на то како да конфигуришем извршавање скрипти притиском на комбинације тастера. На пример, у КДЕ-у се налази у Систем Сеттингс → Схортцутс → Цустом Схортцутс. Ово би такође требало да буде случај у другим менаџерима прозора.

Представљамо вмцтрл

Вмцтрл — услужни програм за конзолу за интеракцију са Кс Виндов Манагер-ом. Ово је кључни програм за скрипту. Хајде да брзо погледамо како га можете користити.

Прво, да прикажемо листу отворених прозора:

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

Опција -l приказује листу свих отворених прозора, и -НС додаје име класе на излаз (скипе.Скипе, Навигатор.Фирефок итд). Овде нам треба ИД прозора (колона 1), име класе (колона 3) и име прозора (последња колона).

Можете покушати да активирате неки прозор користећи опцију -a:

$ wmctrl -a skype.Skype -x

Ако је све ишло по плану, на екрану би се требао појавити прозор скајпа. Ако уместо опције -x користити опцију -i, онда уместо имена класе можете одредити ИД прозора. Проблем са ИД-ом је што се ИД прозора мења сваки пут када се апликација покрене и не можемо то унапред знати. С друге стране, овај атрибут јединствено идентификује прозор, што може бити важно када апликација отвори више прозора. Више о овоме мало даље.

У овој фази морамо да запамтимо да ћемо тражити жељени прозор користећи регуларни израз по излазу вмцтрл -лк. Али то не значи да морамо да користимо нешто компликовано. Обично је довољно име класе или име прозора.

У суштини, главна идеја би већ требала бити јасна. У глобалним поставкама интервентних тастера/пречица за ваш менаџер прозора, конфигуришите потребну комбинацију за извршавање скрипте.

Како користити скрипте

Прво морате да инсталирате услужне програме за конзолу вмцтрл и кдотоол:

$ sudo apt-get install wmctrl xdotool

Затим морате преузети скрипте и додати их $ ПАТХ. Обично их стављам ~/бин:

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

Ако именик ~/бин није било тамо, онда морате да га креирате и поново покренете (или се поново пријавите), у супротном ~/бин неће погодити $ ПАТХ. Ако је све урађено исправно, онда би скрипте требало да буду доступне са конзоле и довршавање картице би требало да функционише.

Главна скрипта сховвин узима 2 параметра: први је регек, по коме ћемо тражити тражени прозор, а други параметар је команда коју треба извршити ако се не пронађе потребан прозор.

Можете покушати да покренете скрипту, на пример:

$ showwin "Mozilla Firefox$" firefox

Ако је Фирефок инсталиран, његовом прозору треба дати фокус. Чак и да Фирефок није био покренут, требало је да почне.

Ако ради, онда можете покушати да конфигуришете извршавање команди на комбинацијама. У глобалним подешавањима интервентних тастера/пречица додајте:

  • Алт+Ф: сховвин „Мозилла Фирефок$“ фирефок
  • Алт+Д: сховвин "Мозилла Фирефок (приватно прегледање)$" "фирефок -привате-виндов"
  • Алт+Ц: сховвин "цхромиум-бровсер.Цхромиум-бровсер Н*" цхромиум-бровсер
  • Алт+Кс: сховвин "цхромиум-бровсер.Цхромиум-бровсер И*" "цхромиум-бровсер -инцогнито"
  • Алт+С: сховвин “скипе.Скипе” скипефорлинук
  • Алт+Е: сховвин идеја „јетбраинс-идеа”.сх

итд. Свако може да конфигурише комбинације тастера и софтвер како му одговара.
Ако је све испало како треба, онда ћемо помоћу горњих комбинација моћи да прелазимо између прозора једноставним притиском на тастере.

Разочараћу љубитеље хрома: може анонимно да разликује обичан прозор по излазу вмцтрл Не можете, они имају иста имена класа и наслове прозора. У предложеном редовном изразу, знакови Н* и И* су потребни само да би се ови регуларни изрази међусобно разликовали и да би се могли доделити као главни прозори.

Да бисте ресетовали главни прозор претходне комбинације (у ствари за регек, који сховвин позван последњи пут) треба да позовете скрипту сховвинДетацх. Имам ову скрипту додељену комбинацији тастера Алт+Бацкспаце.

На сценарију сховвин постоји још једна функција. Када се позове са једним параметром (у овом случају параметар је само идентификатор), он уопште не проверава регуларни израз, већ сматра да су сви прозори прикладни. Само по себи, ово изгледа бескорисно, али на овај начин можемо означити било који прозор као главни и брзо се пребацити на тај одређени прозор.

Имам следеће конфигурисане комбинације:

  • Алт+1: сховвин "ЦустомКеи1"
  • Алт+2: сховвин "ЦустомКеи2"
  • ...
  • Алт+0: сховвин "ЦустомКеи0"
  • Алт+Бацкспаце: сховвинДетацх

На овај начин могу да повежем било који прозор са комбинацијама Алт + КСНУМКС...Алт + КСНУМКС. Само кликом Алт + КСНУМКС Вежем тренутни прозор за ову комбинацију. Могу да откажем везивање кликом Алт + КСНУМКС, и онда Алт+Бацкспаце. Или затворите прозор, то такође ради.

Затим ћу вам рећи неке техничке детаље. Не морате да их читате, али само покушајте да их подесите и видите. Али ипак бих препоручио да разумете туђе скрипте пре него што их покренете на свом рачунару :).

Како разликовати различите прозоре исте апликације

У принципу, први пример „вмцтрл -а скипе.Скипе -к“ је радио и може се користити. Али хајде да поново погледамо пример са Фирефоком, у којем су отворена 2 прозора:

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

Први прозор је нормалан режим, а други је приватно прегледање. Желео бих да ове прозоре сматрам различитим апликацијама и да се пребацим на њих користећи различите комбинације тастера.

Неопходно је искомпликовати скрипту која мења прозоре. Користио сам ово решење: прикажи листу свих прозора, уради греп помоћу регуларног израза, узми први ред са глава, узмите прву колону (ово ће бити ид прозора) користећи исећи, пређите на прозор по ид.

Требало би да буде шала о регуларним изразима и два проблема, али у ствари не користим ништа компликовано. Потребни су ми регуларни изрази да бих могао да назначим крај реда (симбол „$“) и да разликујем „Мозилла Фирефок$“ од „Мозилла Фирефок (приватно прегледање)$“.

Команда изгледа отприлике овако:

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

Овде већ можете да нагађате о другој особини скрипте: ако греп ништа не врати, онда жељена апликација није отворена и потребно је да је покренете извршавањем команде из другог параметра. А затим повремено проверавајте да ли се потребан прозор отворио да бисте пренели фокус на њега. Нећу се фокусирати на ово; свако коме је потребно погледаће изворе.

Када се прозори апликације не разликују

Дакле, научили смо како да пребацимо фокус на прозор жељене апликације. Али шта ако апликација има више отворених прозора? Коме да се фокусирам? Горња скрипта ће се највероватније пренети у први отворени прозор. Међутим, желели бисмо више флексибилности. Желео бих да могу да запамтим који нам је прозор потребан и да се пребацим на тај одређени прозор.

Идеја је била следећа: ако желимо да запамтимо одређени прозор за комбинацију тастера, онда морамо да притиснемо ову комбинацију када је жељени прозор у фокусу. У будућности, када притиснете ову комбинацију, фокус ће бити дат овом прозору. Док се прозор не затвори или док не извршимо ресетовање ове комбинације скрипте сховвинДетацх.

Алгоритам скрипте сховвин овако нешто:

  • Проверите да ли смо претходно запамтили ид прозора на који фокус треба да се пренесе.
    Ако се сећате и такав прозор још увек постоји, онда пребацимо фокус на њега и изађемо.
  • Гледамо који прозор је тренутно у фокусу, и ако се поклапа са нашим захтевом, онда запамтите његов ИД да бисте у будућности отишли ​​до њега и изашли.
  • Идемо у бар неки одговарајући прозор ако постоји или отворимо жељену апликацију.

Можете сазнати који прозор је тренутно у фокусу помоћу услужног програма кдотоол конзоле тако што ћете конвертовати његов излаз у хексадецимални формат:

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

Најлакши начин да запамтите нешто у басх-у је креирање датотека у виртуелном систему датотека који се налази у меморији. У Убунту-у је ово подразумевано омогућено у /дев/схм/. О осталим дистрибуцијама не могу ништа да кажем, надам се да има и нешто слично. Можете погледати командом:

$ mount -l | grep tmpfs

Скрипта ће креирати празне директоријуме у овој фасцикли, овако: /дев/схм/$УСЕР/сховвин/$СЕАРЦХ_РЕГЕКС/$ВИНДОВ_ИД. Поред тога, сваки пут када се позове креираће симболичку везу /дев/схм/$УСЕР/сховвин/сховвин_ласт на /дев/схм/$УСЕР/сховвин/$СЕАРЦХ_РЕГЕКС. Ово ће бити потребно да би се, ако је потребно, уклонио ИД прозора за одређену комбинацију помоћу скрипте сховвинДетацх.

Шта се може побољшати

Прво, скрипте морају бити ручно конфигурисане. Сигурно, због потребе да се удубите и урадите много својим рукама, многи од вас неће ни покушати да конфигуришу систем. Када би било могуће једноставно инсталирати пакет и све лакше конфигурисати, онда би можда добио неку популарност. А онда погледајте, апликација би била пуштена у стандардне дистрибуције.

А можда се то може учинити лакше. Ако по ИД-у прозора можете сазнати ИД процеса који га је креирао, а по ИД-у процеса можете сазнати која наредба га је створила, онда би било могуће аутоматизирати подешавање. У ствари, нисам разумео да ли је могуће оно што сам написао у овом пасусу. Чињеница је да сам лично задовољан како то сада функционише. Али ако неко други осим мене сматра да је цео приступ погодан и неко га побољша, онда ћу са задовољством користити боље решење.

Други проблем, као што сам већ написао, је што се у неким случајевима прозори не могу разликовати један од другог. До сада сам ово посматрао само са анонимним начином рада у хрому/хрому, али можда постоји нешто слично негде другде. У крајњем случају, увек постоји опција универзалних комбинација Алт + КСНУМКС...Алт + КСНУМКС. Опет, користим Фирефок и за мене лично овај проблем није значајан.

Али значајан проблем за мене је што користим Мац ОС за посао и нисам могао тамо да конфигуришем ништа слично. корисност вмцтрл Мислим да сам успео да га инсталирам, али не ради баш на Мац ОС-у. Нешто се може урадити са апликацијом Аутоматор, али је толико спор да га није згодно користити чак ни када ради. Такође нисам могао да подесим комбинације тастера тако да раде у свим програмима. Ако неко изненада дође до решења, биће ми драго да га искористим.

Уместо закључка

Испоставило се да је то неочекивано велики број речи за тако наизглед једноставну функционалност. Хтео сам да пренесем идеју и да не преоптерећујем текст, али још нисам схватио како да то једноставније кажем. Можда би било боље у видео формату, али људима се то не свиђа овде.

Причао сам мало о томе шта је испод хаубе скрипте и како да је конфигуришем. Нисам улазио у детаље самог сценарија, али има само 50 редова, тако да није тешко разумети.

Надам се да ће још неко испробати ову идеју и можда је чак и ценити. За себе могу рећи да је сценарио написан пре отприлике 3 године и да ми је ЈАКО згодан. Толико згодно да изазива озбиљну нелагодност при раду са рачунарима других људи. И са исправним МацБоок-ом.

Линк ка скриптама

Извор: ввв.хабр.цом

Додај коментар