Gestió de finestres alternativa a Linux

Sóc dels que configuren el bloqueig de majúscules per canviar de disseny perquè em fa massa mandra prémer 2 tecles quan en puc prémer una. Fins i tot m'agradaria 2 tecles innecessàries: n'utilitzaria una per activar la disposició en anglès i la segona per al rus. Però la segona clau innecessària és cridar el menú contextual, que és tan innecessari que molts fabricants d'ordinadors portàtils el tallen. Així que t'has d'acontentar amb el que tens.

I tampoc vull buscar les seves icones a la barra de tasques quan canvieu de finestra, ni captar els noms quan em desplaceu. Alt + fitxa, desplaçar-se pels escriptoris, etc. Vull prémer una combinació de tecles (idealment només una, però ja no hi ha tecles innecessàries gratuïtes) i arribar immediatament a la finestra que necessito. Per exemple com aquest:

  • Alt+F: Firefox
  • Alt+D: Firefox (navegació privada)
  • Alt+T: Terminal
  • Alt+M: calculadora
  • Alt+E: IntelliJ Idea
  • etc.

A més, prement, per exemple, sobre Alt+M Vull veure la calculadora independentment de si aquest programa s'està executant. Si s'està executant, s'ha de centrar la seva finestra i, si no, executar el programa desitjat i transferir el focus quan es carregui.

Per als casos que no estan coberts per l'script anterior, vull tenir combinacions de tecles universals que es puguin assignar fàcilment a qualsevol de les finestres obertes. Per exemple, tinc 10 combinacions assignades de Alt + 1 до Alt + 0, que no estan vinculats a cap programa. Només puc fer clic Alt + 1 i la finestra que està actualment enfocada se centrarà en fer clic Alt + 1.

A sota del tall hi ha una descripció d'un parell de funcions més i una resposta a com es pot fer això. Però de seguida us advertiré que aquesta personalització "per a vosaltres mateixos" pot provocar una addicció greu i fins i tot una abstinència si necessiteu utilitzar Windows, Mac OS o fins i tot l'ordinador d'una altra persona amb Linux.

De fet, si hi penseu bé, no fem servir tants programes diàriament. Un navegador, un terminal, un IDE, una mena de missatgeria, un gestor de fitxers, una calculadora i, potser, això és gairebé tot. No necessiteu moltes dreceres de teclat per cobrir el 95% de les vostres tasques diàries.

Per als programes que tenen diverses finestres obertes, una d'elles es pot designar com a principal. Per exemple, teniu diverses finestres IntelliJ Idea obertes i assignades Alt + E. En condicions normals, quan premeu Alt + E s'obrirà alguna finestra d'aquest programa, molt probablement la que es va obrir primer. Tanmateix, si feu clic a Alt + E quan una de les finestres d'aquest programa ja està enfocada, llavors aquesta finestra en particular s'assignarà com a principal i serà la que tindrà el focus quan es premeu les combinacions posteriors.

La finestra principal es pot reassignar. Per fer-ho, primer heu de restablir la combinació i després assignar-li una altra finestra com a finestra principal. Per restablir una combinació, heu de prémer la combinació en si, i després una combinació especial de restabliment, la tinc assignada a Alt + Retrocés. Això cridarà un script que anul·larà l'assignació de la finestra principal per a la combinació anterior. A continuació, podeu assignar una nova finestra principal tal com es descriu al paràgraf anterior. El restabliment d'una finestra enllaçada a combinacions universals es produeix de la mateixa manera.

La introducció va resultar ser llarga, però primer volia dir què farem i després explicar com fer-ho.

Per als que estan cansats de llegir

En resum, l'enllaç als guions es troba al final de l'article.

Però encara no podreu instal·lar-lo i utilitzar-lo immediatament. Primer haureu d'esbrinar com l'script troba la finestra desitjada. Sense això, no serà possible indicar a l'script on s'ha de transferir exactament el focus. I cal entendre què fer si de sobte no es troba una finestra adequada.

I no em centraré en com configurar l'execució dels scripts prement combinacions de tecles. Per exemple, al KDE és a Configuració del sistema → Dreceres → Dreceres personalitzades. Això també hauria de ser el cas d'altres gestors de finestres.

Presentació de wmctrl

Wmctrl — utilitat de consola per interactuar amb X Window Manager. Aquest és el programa clau per al guió. Fem una ullada ràpida a com el podeu utilitzar.

Primer, mostrem una llista de finestres obertes:

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

Opció -l mostra una llista de totes les finestres obertes i afegeix el nom de la classe a la sortida (skype.Skype, Navigator.Firefox etc). Aquí necessitem l'identificador de la finestra (columna 1), el nom de la classe (columna 3) i el nom de la finestra (última columna).

Podeu provar d'activar alguna finestra mitjançant l'opció -a:

$ wmctrl -a skype.Skype -x

Si tot ha anat segons el previst, la finestra de Skype hauria d'aparèixer a la pantalla. Si en comptes de l'opció -x utilitzar l'opció -i, aleshores en lloc del nom de la classe podeu especificar l'identificador de la finestra. El problema amb l'identificador és que l'identificador de la finestra canvia cada vegada que s'inicia l'aplicació i no podem saber-ho per endavant. D'altra banda, aquest atribut identifica de manera única una finestra, que pot ser important quan una aplicació obre més d'una finestra. Més sobre això una mica més enllà.

En aquesta etapa hem de recordar que buscarem la finestra desitjada mitjançant l'expressió regular per sortida wmctrl -lx. Però això no vol dir que hàgim d'utilitzar quelcom complicat. Normalment el nom de la classe o el nom de la finestra és suficient.

Bàsicament, la idea principal ja hauria de quedar clara. A la configuració global de tecles d'accés directe/dreceres del vostre gestor de finestres, configureu la combinació necessària per executar l'script.

Com utilitzar els scripts

Primer cal instal·lar les utilitats de la consola wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

A continuació, heu de descarregar els scripts i afegir-los $ PATH. Normalment les poso ~/bin:

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

Si el directori ~/bin no hi era, llavors haureu de crear-lo i reiniciar (o tornar a iniciar sessió), en cas contrari ~/bin no colpejarà $ PATH. Si tot es fa correctament, els scripts haurien de ser accessibles des de la consola i la finalització de la pestanya hauria de funcionar.

Guió principal showwin pren 2 paràmetres: el primer és una expressió regular, mitjançant la qual buscarem la finestra requerida, i el segon paràmetre és una ordre que cal executar si no es troba la finestra requerida.

Podeu provar d'executar un script, per exemple:

$ showwin "Mozilla Firefox$" firefox

Si el Firefox està instal·lat, s'hauria de centrar la seva finestra. Fins i tot si el Firefox no s'està executant, hauria d'haver començat.

Si funciona, podeu provar de configurar l'execució d'ordres en combinacions. A la configuració global de tecles d'accés directe/dreceres, afegiu:

  • Alt+F: mostra el Firefox de “Mozilla Firefox$”.
  • Alt+D: mostra "Mozilla Firefox (navegació privada)$" "firefox -private-window"
  • Alt+C: showwin "chromium-browser.Chromium-browser N*" chromium-browser
  • Alt+X: mostra "chromium-browser.Chromium-browser I*" "chromium-browser -incognito"
  • Alt+S: mostra "skype.Skype" skypeforlinux
  • Alt+E: mostra la idea "jetbrains-idea".sh

Etc. Tothom pot configurar les combinacions de tecles i el programari com cregui convenient.
Si tot ha funcionat correctament, amb les combinacions anteriors podrem canviar entre finestres simplement prement les tecles.

Decebré els amants de Chrome: pot distingir d'incògnit una finestra normal per la seva sortida wmctrl No podeu, tenen els mateixos noms de classe i títols de finestra. A l'expressió regular proposada, només es necessiten els caràcters N* i I* perquè aquestes expressions regulars difereixen entre si i es puguin assignar com a finestres principals.

Per restablir la finestra principal de la combinació anterior (de fet per a regex, que showwin trucat l'última vegada) heu de cridar el guió showwinDetach. Tinc aquest script assignat a una combinació de tecles Alt + Retrocés.

Al guió showwin hi ha una funció més. Quan es crida amb un paràmetre (en aquest cas el paràmetre és només un identificador), no comprova gens l'expressió regular, però considera que totes les finestres són adequades. En si mateix, això sembla inútil, però d'aquesta manera podem designar qualsevol finestra com a principal i canviar ràpidament a aquesta finestra en concret.

Tinc configurades les combinacions següents:

  • Alt+1: mostra "CustomKey1"
  • Alt+2: mostra "CustomKey2"
  • ...
  • Alt+0: mostra "CustomKey0"
  • Alt+Retrocés: showwinDetach

D'aquesta manera puc vincular qualsevol finestra a combinacions Alt + 1...Alt + 0. Només fent clic Alt + 1 Vincle la finestra actual a aquesta combinació. Puc cancel·lar l'enllaç fent clic Alt + 1i després Alt + Retrocés. O tanca la finestra, això també funciona.

A continuació us explicaré alguns detalls tècnics. No cal que les llegiu, sinó que intenteu configurar-les i veure-les. Però tot i així recomanaria entendre els scripts d'altres persones abans d'executar-los al vostre ordinador :).

Com distingir entre diferents finestres d'una mateixa aplicació

En principi, el primer exemple "wmctrl -a skype.Skype -x" funcionava i es pot utilitzar. Però tornem a mirar l'exemple amb Firefox, en què hi ha 2 finestres obertes:

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

La primera finestra és el mode normal i la segona és la navegació privada. M'agradaria considerar aquestes finestres com a aplicacions diferents i canviar-hi amb diferents combinacions de tecles.

Cal complicar l'script que canvia de finestres. Vaig utilitzar aquesta solució: mostrar una llista de totes les finestres, fer grep per regex, agafeu la primera línia amb cap, obteniu la primera columna (aquesta serà l'identificador de la finestra) utilitzant tallar, canvieu a la finestra per id.

Hi hauria d'haver una broma sobre les expressions regulars i dos problemes, però de fet no estic fent servir res complicat. Necessito expressions regulars per poder indicar el final de la línia (el símbol “$”) i distingir “Mozilla Firefox$” de “Mozilla Firefox (navegació privada)$”.

L'ordre s'assembla a això:

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

Aquí ja podeu endevinar sobre la segona característica de l'script: si grep no retorna res, aleshores l'aplicació desitjada no està oberta i l'heu d'iniciar executant l'ordre del segon paràmetre. A continuació, comproveu periòdicament si s'ha obert la finestra necessària per transferir-hi el focus. No em centraré en això; qui ho necessiti mirarà les fonts.

Quan les finestres de l'aplicació no es distingeixen

Per tant, hem après com transferir el focus a la finestra de l'aplicació desitjada. Però, què passa si una aplicació té més d'una finestra oberta? A quin hauria de centrar-me? El més probable és que l'script anterior es transfereixi a la primera finestra oberta. Tanmateix, ens agradaria més flexibilitat. M'agradaria poder recordar quina finestra necessitem i canviar a aquesta finestra en concret.

La idea era aquesta: si volem recordar una finestra específica per a una combinació de tecles, hem de prémer aquesta combinació quan la finestra desitjada estigui enfocada. En el futur, quan premeu aquesta combinació, el focus es centrarà en aquesta finestra. Fins que es tanqui la finestra o fem un restabliment d'aquesta combinació d'scripts showwinDetach.

Algorisme de script showwin alguna cosa com això:

  • Comproveu si prèviament hem recordat l'identificador de la finestra a la qual s'ha de transferir el focus.
    Si ho recordeu i aquesta finestra encara existeix, hi transferim el focus i sortim.
  • Mirem quina finestra està enfocada actualment i, si coincideix amb la nostra sol·licitud, recordem el seu identificador per anar-hi en el futur i sortir.
  • Anem a almenys alguna finestra adequada si existeix o obrim l'aplicació desitjada.

Podeu esbrinar quina finestra està enfocada actualment mitjançant la utilitat de la consola xdotool convertint la seva sortida a format hexadecimal:

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

La manera més fàcil de recordar alguna cosa a bash és crear fitxers en un sistema de fitxers virtual situat a la memòria. A Ubuntu, això està habilitat per defecte a /dev/shm/. No puc dir res sobre altres distribucions, espero que també hi hagi alguna cosa semblant. Podeu mirar amb l'ordre:

$ mount -l | grep tmpfs

L'script crearà directoris buits en aquesta carpeta, com aquest: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. A més, cada vegada que es crida, crearà un enllaç simbòlic /dev/shm/$USER/showwin/showwin_last en /dev/shm/$USER/showwin/$SEARCH_REGEX. Això serà necessari per, si cal, eliminar l'identificador de la finestra d'una combinació determinada mitjançant un script showwinDetach.

Què es pot millorar

En primer lloc, els scripts s'han de configurar manualment. Segurament, per la necessitat d'aprofundir i fer molt amb les mans, molts de vosaltres ni tan sols intentareu configurar el sistema. Si fos possible simplement instal·lar el paquet i configurar-ho tot més fàcilment, potser guanyaria certa popularitat. I llavors mira, l'aplicació es llançaria a distribucions estàndard.

I potser es pot fer més fàcil. Si amb l'identificador d'una finestra podeu esbrinar l'identificador del procés que l'ha creat, i per l'identificador del procés podeu esbrinar quina ordre l'ha creat, llavors seria possible automatitzar la configuració. De fet, no vaig entendre si el que vaig escriure en aquest paràgraf era possible. El fet és que personalment estic satisfet amb la manera com funciona ara. Però si algú més que jo troba tot l'enfocament convenient i algú el millora, estaré encantat d'utilitzar una solució millor.

Un altre problema, com ja he escrit, és que en alguns casos les finestres no es poden distingir entre si. Fins ara només ho he observat amb incògnit en crom/crom, però potser hi ha alguna cosa semblant en un altre lloc. Com a últim recurs, sempre hi ha l'opció de combinacions universals Alt + 1...Alt + 0. De nou, faig servir Firefox i per a mi personalment aquest problema no és significatiu.

Però el problema important per a mi és que faig servir Mac OS per a la feina i no he pogut configurar res així. utilitat wmctrl Crec que el vaig poder instal·lar, però realment no funciona amb Mac OS. Alguna cosa es pot fer amb l'aplicació Automator, però és tan lent que no és convenient utilitzar-lo fins i tot quan està funcionant. Tampoc he pogut configurar combinacions de tecles perquè funcionin en tots els programes. Si algú de sobte troba una solució, estaré encantada d'utilitzar-la.

En lloc d'una conclusió

Va resultar ser un nombre inesperadament gran de paraules per a una funcionalitat tan aparentment senzilla. Volia transmetre la idea i no sobrecarregar el text, però encara no he sabut com explicar-ho de manera més senzilla. Potser seria millor en format de vídeo, però a la gent no li agrada així.

Vaig parlar una mica sobre què hi ha sota el capó del guió i com configurar-lo. No vaig entrar en detalls del guió en si, però només té 50 línies, així que no és difícil d'entendre.

Espero que algú altre provi aquesta idea i potser fins i tot l'apreciï. Puc dir de mi que el guió es va escriure fa uns 3 anys i és MOLT convenient per a mi. Tan convenient que causa greus molèsties quan es treballa amb ordinadors d'altres persones. I amb un MacBook que funcioni.

Enllaç a scripts

Font: www.habr.com

Afegeix comentari