Ես նրանցից եմ, ովքեր Caps Lock-ի վրա շատ են հենվում, որովհետև մրթածության սեղմելու երկու կոճակներ փոխարեն մեկ կոճակ սեղմելը ավելի հեշտ է: Ես նույնիսկ կցանկանայի ունենալ 2 անպետք կոճակ. մեկով կօգտագործեի անգլերեն դասավորությունը միացնել, իսկ մյուսով՝ ռուսերենի։ Բայց երկրորդ անպետք կոճակը պետք է լինի կոնտեքստային մենյուն ցուցադրելու, որը այնքան անպետք է, որ շատ մատակարարներ հեռացնում են՝ իրենց նոութբուքերի պարունակությունից։ Դրա համար ստիպված եմ գոհանալ նրանով, ինչ կա։
Կարևորը, ես չեմ ցանկանում պատուհաներ փոխելիս դրանց պատկերակները որոնել աշխատանքային տախտակին, հստակ տեսնելու նրանց անունները, երբ սահում եմ միջով Alt+Tab, սահելու աշխատանքային սեղաններից և այլն։ Ես ուզում եմ սեղմել կպցված կոճակների համադրություն (լավագույն դեպքում ընդամենը մեկը, բայց այլևս ազատ անապահով կոճակներ չունեմ) և անմիջապես հայտնվել անհրաժեշտ պատուհանում։ Օրինակ, ահա այնպես՝
- Alt+F: Firefox
- Alt+D: Firefox (Անվտանգ Browsing)
- Alt+T: Terminal
- Alt+M: Խնդիրների լուծիչ
- Alt+E: IntelliJ Idea
- և այլն։
Причём, по нажатию, например, на Alt+M я хочу видеть калькулятор вне зависимости от того, запущена ли в данный момент эта программа. Если запущена, то её окну надо передать фокус, а если нет — запустить нужную программу и передать фокус когда она загрузится.
На случаи, которые не покрываются предыдущим сценарием, я хочу иметь универсальные комбинации клавиш, на которые можно легко назначить любые из открытых окон. Например, у меня назначены 10 комбинаций от Alt+1 մինչ Alt+0, которые не привязанные ни к каким программам. Я могу просто нажать Alt+1 и окно, которое сейчас в фокусе, будет получать фокус при нажатии Alt+1.
Под катом описание ещё пары фич и ответ на то, как можно это сделать. Но сразу предупрежу, что подобная кастомизация «под себя» может вызвать сильную зависимость и даже ломку при необходимости использовать Windows, Mac OS или даже чужой компьютер с Linux.
Այդ իսկ պատճառով, եթե մտածենք, մեզ այնքան էլ շատ ծրագրեր չեն պետք ամենօրյա օգտագործման համար։ Բրաուզեր, տերմինալ, IDE, ինչ-որ հաղորդագրությունների ծրագիր, ֆայլերի կառավարիչ, խնդիրների լուծիչ և, հավանաբար, դա գրեթե ամեն ինչ է: Մեզ այնքան էլ շատ կոճակների համադրություններ չեն պետք, որպեսզի ծածկենք ամենօրյա խնդիրների 95%-ը։
Մասնակի, որոնց բացված են մի քանի պատուհաններ, մեկը կարող է նշանակվել հիմնական։ Օրինակ, բացված է մի քանի IntelliJ Idea պատուհաններ, որոնք նշանակված են Alt+E. Սովորաբար, երբ սեղմում ես Alt+E մի պատուհան այս ծրագրից բացվելու է, ամենայն հավանականությամբ այն, որը բացվեց առաջինը։ Բայց եթե սեղմես Alt+E երբ այս ծրագրի մեկ պատուհանը արդեն կենտրոնացավ, ապա այդ անձրևային պատուհանը կբացվի որպես գլխավոր և հենց նրան կհանձնվի կենտրոնացումը հաջորդ սեղմումների պարագաներում։
Գլխավոր պատուհանը կարելի է վերագրել։ Для этого комбинацию нужно сначала сбросить, а потом назначить на неё главным другое окно. Для сброса комбинации нужно нажать саму комбинацию, а потом специальную комбинацию сброса, у меня она назначена на Alt+Backspace. Սա կմղի սկրիպտ, որն անցկացնում է նախորդ համադրությունը հիմնական պատուհանի назначения: Հետագայում կարող եք նշանակել նոր հիմնական պատուհան, ինչպես նշված է նախորդ պարագայում: Կապված պատուհանը վերականգնվում է հանրային համադրություններին համապատասխան:
Մուտք աղբյուրն այնպիսի երկար ստացվեց, բայց ուզում էի նախ vertellen, թե ինչ ենք անելու, հետո պարզաբանել, թե ինչպես անել:
Ակնհայտ է նրանց համար, ովքեր հոգնել են կարդալ
Հակառակ դեպքում, կարճ ասած, սցենարների հղումը հոդվածի վերջում:
Բայց միևնույն է, անմիջապես տեղադրել և օգտագործել չի ստացվի: Նախ պետք է հասկանալ, թե ինչպես է սցենարը գտնում անհրաժեշտ պատուհանը: Դա առանց համաչափության հնարավոր չէ, որպեսզի կոորդինատացնեն սցենարը, թե ուր պետք է ուղարկեն ուշադրությունը: Եվ պետք է հասկանալ, թե ինչ անել, եթե հանկարծ անհրաժեշտ պատուհանը չգտնվի:
Երևի ես ուշադրություն չեմ դարձնի, թե ինչպես կարգավորել սցենարների կատարման, երբ զանգը սեղմվի: Օրինակ, KDE- ում դա տեղի է ունենում System Settings → Shortcuts → Custom Shortcuts-ում: Մյուս պատուհանների կառավարիչներում նույնպես պետք է նման լինել:
Հանդիպում wmctrl- ի հետ
Wmctrl — կոնսոլային ծրագիր, որը համագործակցում է X Window Manager- ի հետ: Սա սկրիպտի հիմնական ծրագիրն է: Եկեք արագ նայենք, թե ինչպես կարող ենք օգտագործել:
Նախ, ցույց տանք բացված պատուհանների ցանկը.
$ 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 Translate - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Ամենօրյա լավագույն հրապարակումները / Հաբռ - Mozilla Firefox (Այնպես որ, գաղտնի դիտում)
...Ընտանք -l ով տարածում է բոլոր բացված պատուհանների ցանկը, և -х հավելում է ելքին դասի անվանումը (skype.Skype, Navigator.Firefox և այլն): Մենք այստեղ կհանձնենք պատուհանի id-ին (1-ին սյունակ), դասի անվան (3-րդ սյունակ) և պատուհանի անվան (վերջին սյունակ):
Հնարավոր է փորձել ակտիվացնել պատուհանը `օգտագործելով տարբերակ. -a:
$ wmctrl -a skype.Skype -xԵթե ամենը նախատեսված է, ապա էկրանին պետք է երևա Skype պատուհանն: Եթե փոխարենը -x օգտագործել տարբերակը -i, ապա դասի անունը կարելի է նշել պատուհանի id-ով: Բայց id-ի խնդիրը այն է, որ պատուհանի id-ն փոփոխվում է յուրաքանչյուր ծրագրի գործարկման ժամանակ, և մենք չենք կարող ժենապես կանխատեսել այն: Հակառակ այս, այս ցուցանիշը հստակ նշում է պատուհանը, ինչը կարևոր կարող է լինել, երբ ծրագիրը բացում է ավելին, քան մեկ պատուհան: Կարճ ժամանակ անց:
Այս պահին մենք պետք է հիշենք, որ մենք պետք է գտնենք անհրաժեշտ պատուհանը regex- ի միջոցով՝ ելքի wmctrl -lx. Բայց դա չի նշանակում, որ մեզ անհրաժեշտ է օգտագործել ինչ-որ բարդ բան: Ամբողջ ընթացքում բավական է դասի անունը կամ պատուհանի անունը:
Ընդհանուր առմամբ, հիմնական գաղափարը արդեն հավանաբար հասկանալի է: Համաշխարհային հակիրճ հանձնարարականների/արագ ծանոթությունների կարգավորում կարող եք կազմակերպել ձեր պատուհանային կառավարիչում:
Ինչպես օգտվել սցենարներից
Նախ պետք է տեղադրել կոնսոլային ծրագրեր՝ wmctrl և xdotool:
$ sudo apt-get install wmctrl xdotoolԱյնուհետեւ պետք է ներբեռնել սցենարները և ավելացնել դրանք մինչ $PATH. Ես սովորաբար դրանք տեղադրում եմ ~/bin:
$ cd ~\/bin
$ git clone https:\/\/github.com\/masyamandev\/Showwin-script.git
$ ln -s .\/Showwin-script\/showwin showwin
$ ln -s .\/Showwin-script\/showwinDetach showwinDetachԵթե կատալոգի ~/bin չեր եղել, ապա պետք է ստեղծել և վերապումдаться (կամ նորից մուտք գործել), այլապես ~/bin չի մտնի $PATH. Եթե ամեն ինչը ճիշտ է արվել, ապա սկրիպտները պետք է հասանելի լինեն կոնսոլից և միջավայր պետք է աշխատի Tab-ով ավտո լրացումը:
Հիմնական սկրիպտը showwin ընդունում է 2 պարանոց՝ առաջինը է regex, որով մենք կպատահենենք անհրաժեշտ պատուհանը, իսկ երկրորդ պարանոցը այն հրամանն է, որը պետք է իրականացվի, եթե անհրաժեշտ պատուհանը չի գտնվել:
Կարող եք փորձել իրականացնել սկրիպտը, օրինակ:
$ showwin "Mozilla Firefox$" firefoxԵթե Firefox-ը տեղադրված է, ապա նրա պատուհանին պետք է փոխանցվի ֆոկուս։ Даже если Firefox գործարկված չի եղել, նա պետք է գործարկվի:
Եթե ամեն բան ճիշտ է, ապա կարող եք փորձել կարգավորել հրամանների կատարման կոմբինացիաներ։ Գլոբալ հոթկեյների/շորտկութների կարգավորումներում ավելացնում ենք:
- 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
Եվ այլն։ Յուրաքանչյուր մարդ կարող է կարգավորել իրենց հարմար կոմբինացիաները:
Եթե ամեն բան ճիշտ է, ապա նշված սղթոներով մենք կարող ենք անցնել պատուհանների միջև միայն կոճակները սեղմելով:
Համար ուղղված ձեռնարկներին հետ արվելու մասին ես տխրում եմ՝ սովորական պատուհանները ինկոգնիտոյեմ տարբերակել հնարավոր չէ նրա ելույթով wmctrl չկա, նրանց անունները նույն կլասների և պատուհանի վերնագրերի միջև հավասար են։ Ներդրված regex խորհրդանիշները N* եւ I* անհրաժեշտ են միայն, որպեսզի այդ կանոնները միմյանցից տարբեր լինեն և կարելի է նշանակել տարբեր կարևոր պատուհաններին:
Նախկինում նշանակված գլխավոր պատուհանը (իրականում regex, որով showwin վերջին անգամ կանչվում էր) վերածելու համար, անհրաժեշտ է կանչել սկրիպտը showwinDetach. Ենթադրում եմ, որ այս սկրիպտը նշանակված է ինձ համար կոմբինացիան: Alt+Backspace.
Սկրիպտը showwin ունի դեռ մեկ ֆունկցիա։ Երբ այն կանչվում է մեկ պարանոցով (այս օրինակում պարանոցը պարզապես նույնականացնողն է), ապա նա ընդհանրապես չի ստուգում regex-ը, այլ բոլոր պատուհանները համարում է համապատասխան։ Սա ինքնին դարձյալ անհրաժեք է թվում, սակայն այս ձևով մենք կարող ենք ցանկացած պատուհան նշանակել գլխավոր և արագ տեղափոխվել հենց այդ պատուհանին:
Ես կառուցել եմ նման կոմբինացիաներ:
- Alt+1: showwin «CustomKey1»
- Alt+2: showwin «CustomKey2»
- …
- Alt+0: showwin «CustomKey0»
- Alt+Backspace: showwinDetach
Այսպիսով, ես կարող եմ կապել ցանկացած պատուհան կոմբինացիաներին Alt+1…Alt+0. Պարզապես սեղմելով Alt+1 ես կապում եմ ընթացիկ պատուհանը այդ կոմբինացիային։ Մերժումն ինձ կարող եմ արել սեղմելով Alt+1, այնուհետև Alt+Backspace. Թերություններ տեսնելու համար կամ պարզապես փակել պատուհանը, այդպես էլ աշխատում է:
Այժմ կպատմեմ մի քիչ տեխնիկական մանրամասներ։ Դրանք կարող եք չقرأել, պարզապես փորձեքնու կարգավորեք և տեսեք։ Բայց ես մեկ անգամ ևս խորհուրդ եմ տալիս հասկանալ ուրիշների սկրիպտները նախքան դրանք գործածելը ձեր համակարգչում :)
Ինչպես տարբերել տարբեր պատուհաններ մեկ հավելվածի
Դեպք, որի առաջին օրինակն էր «wmctrl -a skype.Skype -x», աշխատում էր և կարող ենք այն օգտագործել: Բայց եկեք ևս մեկ անգամ նայենք Firefox-ի օրինակին, որտեղ բացված են 2 պատուհան:
0x04400003 0 Navigator.Firefox N/A Google Translate - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Լավագույն հրապարակումները օրում / Հաբր - Mozilla Firefox (Private Browsing)Առաջին պատուհանն է սովորական ռեժիմ, իսկ երկրորդը՝ Private Browsing: Այս պատուհանները կցուցադրենք որպես տարբեր ծրագրեր և կսրամատակենք տեղափոխվել դրանց տարբեր ստեղնահարվածներով:
Պետք է բարդացնենք պատուհանները փոխարկող սցենարը: Ես օգտագործեցի պարզ լուծում՝ ունենալով բոլոր պատուհանների ցուցակը, կատարել grep regex-ի միջոցով, վերցնելու առաջին տողը head, ստանալ առաջին չափման (այդ կլինի պատուհանի id)՝ օգտագործելով cut, փոխարինել պատուհանին id-ի միջոցով:
Այստեղ պետք է լինի հումոր վերագրված կանոնավոր արտահայտությունների և երկու խնդիրների շուրջ, բայց փաստացիորեն ես ոչինչ բարդ չեմ օգտագործում: Կանոնավոր արտահայտությունները ինձ պետքե կարծում ապացուցելու համար, որ կարող չմոտ լինել տողը (լսողական «$») և տարբերվել «Mozilla Firefox$»-ից «Mozilla Firefox (Private Browsing)$»-ից:
Հրամանը մոտավորապես այսպես է.
$ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`Այստեղ արդեն կարելի է կռահել ծրագրի երկրորդ առանձնահատկությունը. եթե grep-ն ոչինչ չի ուտել, նշանակում է, որ անհրաժեշտ ծրագիրը չի բացված և պետք է այն գործարկել, կատարելով հրամանը երկրորդ պարամетрից: Իսկ հետո՝ периодически ստուգել, արդյոք բացի է անհրաժեշտ պատուհանը, որպեսզի փոխանցվի ուշադրությունը: Չեմ ցանկանում ուշադրությունն այս վրայ կ-focus անել, ով ուզում է, նա կարող է տեսնել աղբյուրները:
Երբ ծրագրի պատուհանները չեն տարբերակվում.
Այսպիսով, մենք ուսում առեցինք, թե ինչպես փոխանցել ուշադրությունը անհրաժեշտ ծրագրի պատուհանին: Բայց ի՞նչ, եթե բացված է մեկից ավելի պատուհաններ գործընթացում: Որտեղի՞ն փոխանցել ուշադրությունը: Ցուցադրանքը հավանաբար առաջին բացված պատուհանին կփոխանցի: Սակայն մենք կցանկանայինք ավելի մեծ ճկունություն: Կցանկանայինք հնարավորությունը հիշել, թե որն է անհրաժեշտ պատուհանը և հենց դրան переключиться:
Սխեման հետևյալն էր. Եթե ուզում ենք հիշել ստեղնահարվածի համար որոշակի պատուհան, ապա պետք է սեղմենք այդ ստեղնահարվածը, երբ անհրաժեշտ պատուհանը կենտրոնացված է: Անցյալը, երբ սեղմենք այդ ստեղնահարվածը, ուշադրությունը կտրվի հենց այդ պատուհանին: Համար, հասանելի փրկել այս ստեղնահարվածի պես մինչև պատուհանը փակվի կամ մենք չանենք վերադառնալություն այդքի գիտակցումից: showwinDetach.
Սցենարի ալգորիթմը showwin մոտավորապես այսպիսին է:
- Ստուգենք, թե արդյոք մենք նախկինում հիշել ենք պատուհանի id-ն, որի համար պետք է փոխանցել ուշադրությունը:
Եթե հիշել ենք, և այդ պատուհանը դեռ գոյություն ունի, ապա տալիս ենք ուշադրությունը և դուրս գալիս: - Դիտենք, որ պատուհանը այժմ կենտրոնացված է, և եթե դա համապատասխանում է մեր պահանջներին, ապա մենք մնում ենք նրա id-ն, որպեսզի կարողանանք հետագա ժամանակում փոխանցել ուշադրությունը:
- Փոխում ենք որևէ մի մոտավորապես պատուհան, եթե այն գոյություն ունի, կամ բացում ենք անհրաժեշտ ծրագիրը:
Ինչպե՞ս իմանալ, որ պատուհանը այժմ կենտրոնացված է, դա կարելի է օգտագործել xdotool կոմպլեքսի միջոցով, նրան փոխարկելով թվային համակարգում:
$ printf "0xx" `xdotool getwindowfocus`Ինչ-որ բան հիշել bash-ում ամենադյուրինն է ստեղծել ֆայլեր հիշողության մեջ գտնվող վիրտուալ ֆայլային համակարգում: Ubuntu-ում սա անպայման միացված է /dev/shm/. Մյուս դիստրիբյուտների մասին ոչինչ չգիտեմ, հույս ունեմ, որ նման բան նույնպես կա: Կարող եք տեսնել հրամանով:
$ mount -l | grep tmpfsՍkriptը այս папке կհաստատի դատարկ директории, այսպիսի: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Հավելյալ, յուրաքանչյուր կանչի ժամանակ այն կտանի symlink /dev/shm/$USER/showwin/showwin_last ըստ /dev/shm/$USER/showwin/$SEARCH_REGEX. Սա անհրաժեշտ կլինի, որպեսզի անհրաժեշտության դեպքում ջնջել חלון-ի id որոշակի համադրության համար սkriptի միջոցով showwinDetach.
Ինչ կարելի է բարելավել
Առաջին հերթին, սkriptերը պետք է ձեռքով կարգավորել: Իրականում, անհրաժեշտության պատճառով մտնել և անել շատ բան ձեռքով, դուք, հավանաբար, նույնիսկ չեք փորձի կարգավորել համակարգը: Եթե լիներ հնարավորություն պարզապես տեղադրել փաթեթը և ամենը ավելի հեշտ կարգավորել, այն գուցե որոշակի ժողովրդականություն գտներ: Իսկ այնտեղ հարում եք և ստանդարտ դիստրիբյուտներում լցրեին ծրագիրը:
Ենթադրաբար, ավելի հեշտ կարելի էր անել: Եթե חלון-ի id-ի միջոցով կարելի է իմանալ այն գործընթացի id-ը, որը ստեղծել է, իսկ գործընթացի id-ի միջոցով իմանալ, թե որն է ստեղծել հրամանը, ապա կարելի կլիներ ավտոմատացնել կարգավորումը: Իրականում ես չեմ ուսումնասիրել, հնարավոր է, թե այն, ինչ ես գրել եմ այս պարբերությունում, հնարավոր է: Փաստն այն է, որ անձամբ ինձ գոհացնում է, թե ինչպես է այժմ աշխատում: Բայց եթե որևէ մեկի համար, բացի ինձ, ամբողջ մոտեցումը հարմար է, և որևէ մեկը բարելավի, ես ուրախությամբ կօգտագործեմ լավագույն լուծումը:
Մյուս խնդիրն, ինչպես արդեն նշել եմ, այն է, որ որոշ դեպքերում окна-ն无法 քիչ շատ մեկը մյուսից տարբերվել: Դրանք ես սեռերից դիտել եմ միայն incognito-ով chrome/chromium-ում, բայց, հնարավոր է, որտեղ-то ուրիշ նման բան լինի: Վերջին դեպքում միշտ կա համընդհանուր համադրությունների տարբերակ Alt+1…Alt+0. Կրկին, ես օգտագործում եմ Firefox և անձնական적으로 ինձ համար այս հարցը չկա:
Բայց ինձ համար կարևոր հարց է, որ աշխատանքի համար օգտագործում եմ Mac OS և այնտեղ նման բան կարգավորել չեմ կարողացել: Ուտիլիտա wmctrl տեղադրել似乎成功, 但它在 Mac OS 上似乎并不正常工作。有些事情可以用应用程序做 Automator, 但它的速度很慢,因此即使它正常工作也是不方便的。我也无法配置热键组合,使它们在所有程序中都有效。如果有人想出了解决方案,我会乐意使用它。
Վերջում
对于这样的功能来说,竟然写了那么多字,意外。 我想传达思想而不让文字太沉重,但我目前还没想出更简单的方式。 也许用视频的格式效果会更好,但这里似乎不喜欢。
我稍微讲述了脚本的底层原理及其配置方式。并没有深入探讨脚本的具体内容,但它只有50行,弄清楚并不复杂。
Հույս ունեմ, որ ուրիշներն էլ կփորձեն այս գաղափարը և, հավանաբար, անգամ կգնահատեն այն: Ինձի մասին կարող եմ ասել, որ այս սկրիպտը գրանցվել է 3 տարի առաջ, և ինձ դա ՃՈՒՂ ՀԻՄԱՑՆՈՒՄ է: Այդքան հարմար, որ լուրջ անհանգստություն է առաջացնում այլ անձանց համակարգիչներով աշխատելիս: Եվ աշխատավայրում գործածվող MacBook-ով:
Ընտանիք: habr.com
