Xestión de ventás alternativa en Linux

Son dos que configuran o bloqueo de maiúsculas para cambiar de deseño porque son demasiado preguiceiro para premer dúas teclas cando podo premer unha. Mesmo gustaríame 2 teclas innecesarias: usaría unha para activar o deseño en inglés e a segunda para o ruso. Pero a segunda clave innecesaria é abrir o menú contextual, que é tan innecesario que moitos fabricantes de portátiles o cortan. Así que tes que contentarte co que tes.

E tampouco quero buscar as súas iconas na barra de tarefas cando cambie de ventá, nin captar os nomes ao desprazarse. Alt + Tab, desprácese polos escritorios, etc. Quero premer unha combinación de teclas (idealmente só unha, pero xa non hai teclas innecesarias gratuítas) e chegar inmediatamente á xanela que necesito. Por exemplo así:

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

Ademais, premendo, por exemplo, en Alt+M Quero ver a calculadora independentemente de que este programa estea en execución. Se se está a executar, hai que darlle foco á súa xanela e, se non, executa o programa desexado e transfire o foco cando se cargue.

Para os casos que non están cubertos polo script anterior, quero ter combinacións de teclas universais que se poidan asignar facilmente a calquera das fiestras abertas. Por exemplo, teño 10 combinacións asignadas de Alt + 1 para Alt + 0, que non están vinculados a ningún programa. Só podo facer clic Alt + 1 e a xanela que está actualmente enfocada terá o foco cando se faga clic Alt + 1.

Debaixo do corte hai unha descrición dun par de funcións máis e unha resposta a como se pode facer. Pero avisarei inmediatamente de que esa personalización "por si mesmo" pode causar adicción grave e mesmo abstinencia se precisa usar Windows, Mac OS ou mesmo o ordenador doutra persoa con Linux.

De feito, se o pensas ben, non usamos tantos programas a diario. Un navegador, un terminal, un IDE, algún tipo de mensaxeiro, un xestor de ficheiros, unha calculadora e, quizais, iso é case todo. Non se necesitan moitas combinacións de teclas para cubrir o 95 % das tarefas cotiás.

Para programas que teñan varias fiestras abertas, pódese designar unha delas como principal. Por exemplo, ten varias fiestras de IntelliJ Idea abertas e asignadas Alt + E. En condicións normais, cando preme Alt + E abrirase algunha xanela deste programa, moi probablemente a que se abriu primeiro. Non obstante, se fai clic en Alt + E cando unha das fiestras deste programa xa estea enfocada, esta xanela en particular asignarase como principal e será a que se enfocará cando se premen as combinacións posteriores.

A xanela principal pódese reasignar. Para iso, primeiro debes restablecer a combinación e despois asignarlle outra xanela como xanela principal. Para restablecer unha combinación, cómpre premer a propia combinación e, a continuación, unha combinación especial de reinicio, téñoa asignada a Alt + Retroceso. Isto chamará a un script que anulará a xanela principal da combinación anterior. E entón pode asignar unha nova xanela principal como se describe no parágrafo anterior. O restablecemento dunha xanela vinculada a combinacións universais ocorre do mesmo xeito.

A introdución resultou ser longa, pero primeiro quería contar o que imos facer, e despois explicar como facelo.

Para os que están cansos de ler

En resumo, a ligazón aos guións está ao final do artigo.

Pero aínda non poderás instalalo e usalo de inmediato. Primeiro terás que descubrir como o script atopa a xanela desexada. Sen isto, non será posible indicarlle ao guión onde se debe transferir exactamente o foco. E cómpre entender que facer se de súpeto non se atopa unha xanela adecuada.

E non me centrarei en como configurar a execución de scripts premendo combinacións de teclas. Por exemplo, en KDE está en Configuración do sistema → Atallos → Atallos personalizados. Isto tamén debería ser o caso noutros xestores de fiestras.

Presentación de wmctrl

Wmctrl — utilidade de consola para interactuar con X Window Manager. Este é o programa clave para o guión. Imos dar unha ollada rápida a como podes usalo.

Primeiro, imos mostrar unha lista de fiestras abertas:

$ 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ón -l mostra unha lista de todas as fiestras abertas e -NS engade o nome da clase á saída (skype.Skype, Navegador.Firefox etc). Aquí necesitamos o ID da xanela (columna 1), o nome da clase (columna 3) e o nome da xanela (última columna).

Podes tentar activar algunha xanela usando a opción -a:

$ wmctrl -a skype.Skype -x

Se todo foi segundo o plan, a xanela de Skype debería aparecer na pantalla. Se en lugar da opción -x usar opción -i, entón en lugar do nome da clase podes especificar o ID da xanela. O problema co ID é que o ID da xanela cambia cada vez que se inicia a aplicación e non podemos sabelo de antemán. Por outra banda, este atributo identifica de forma única unha xanela, o que pode ser importante cando unha aplicación abre máis dunha xanela. Máis sobre isto un pouco máis alá.

Nesta fase debemos lembrar que buscaremos a xanela desexada usando regex por saída wmctrl -lx. Pero iso non significa que teñamos que usar algo complicado. Normalmente o nome da clase ou o nome da xanela é suficiente.

Basicamente, a idea principal xa debería estar clara. Na configuración global de teclas de acceso rápido/atallos para o seu xestor de fiestras, configure a combinación necesaria para executar o script.

Como usar scripts

Primeiro cómpre instalar as utilidades da consola wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

A continuación, cómpre descargar os scripts e engadilos $ PATH. Normalmente poñoos ~/bin:

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

Se o directorio ~/bin non estaba alí, entón tes que crealo e reiniciar (ou volver iniciar sesión), se non ~/bin non golpeará $ PATH. Se todo está feito correctamente, entón os scripts deberían estar accesibles desde a consola e a finalización da pestana debería funcionar.

Guión principal showwin toma 2 parámetros: o primeiro é unha expresión regular, mediante a cal buscaremos a xanela requirida, e o segundo parámetro é un comando que hai que executar se non se atopa a xanela requirida.

Podes probar a executar un script, por exemplo:

$ showwin "Mozilla Firefox$" firefox

Se Firefox está instalado, a súa xanela debería estar enfocada. Aínda que Firefox non estivese en execución, debería comezar.

Se funciona, podes tentar configurar a execución de comandos en combinacións. Na configuración global de teclas de acceso rápido/atallos, engade:

  • Alt+F: mostrar “Mozilla Firefox$” firefox
  • Alt+D: mostrar "Mozilla Firefox (Navegación privada)$" "firefox -private-window"
  • Alt+C: showwin "chromium-browser.Chromium-browser N*" chromium-browser
  • Alt+X: mostrar "chromium-browser.Chromium-browser I*" "chromium-browser -incógnito"
  • Alt+S: mostrar "skype.Skype" skypeforlinux
  • Alt+E: showwin idea "jetbrains-idea".sh

Etc. Todo o mundo pode configurar as combinacións de teclas e o software que considere oportuno.
Se todo funcionou correctamente, usando as combinacións anteriores poderemos cambiar entre as fiestras simplemente premendo as teclas.

Decepcionarei aos amantes do cromo: pode distinguir de incógnito unha fiestra normal pola súa saída wmctrl Non podes, teñen os mesmos nomes de clases e títulos de ventás. Na expresión regular proposta, os caracteres N* e I* son necesarios só para que estas expresións regulares difiran entre si e poidan asignarse como ventás principais.

Para restablecer a xanela principal da combinación anterior (de feito para regex, que showwin chamada a última vez) cómpre chamar ao guión showwinDetach. Teño este script asignado a unha combinación de teclas Alt + Retroceso.

No guión showwin hai unha función máis. Cando se chama cun parámetro (neste caso o parámetro é só un identificador), non verifica a expresión regular, pero considera que todas as fiestras son adecuadas. En si mesmo, isto parece inútil, pero deste xeito podemos designar calquera xanela como a principal e cambiar rapidamente a esa xanela concreta.

Teño configuradas as seguintes combinacións:

  • Alt+1: mostrar "CustomKey1"
  • Alt+2: mostrar "CustomKey2"
  • ...
  • Alt+0: mostrar "CustomKey0"
  • Alt+Retroceso: showwinDetach

Deste xeito podo vincular calquera fiestra a combinacións Alt + 1...Alt + 0. Só facendo clic Alt + 1 Enlazo a xanela actual a esta combinación. Podo cancelar a vinculación facendo clic Alt + 1, e logo Alt + Retroceso. Ou pecha a fiestra, que tamén funciona.

A continuación vouvos contar algúns detalles técnicos. Non tes que lelos, pero intenta configuralos e velos. Pero aínda así recomendaría comprender os scripts doutras persoas antes de executalos no teu ordenador :).

Como distinguir entre as distintas fiestras dunha mesma aplicación

En principio, o primeiro exemplo "wmctrl -a skype.Skype -x" funcionaba e pódese usar. Pero vexamos de novo o exemplo con Firefox, no que hai 2 ventás abertas:

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

A primeira xanela é o modo normal e a segunda é a navegación privada. Gustaríame considerar estas fiestras como aplicacións diferentes e cambiar a elas usando diferentes combinacións de teclas.

É necesario complicar o script que cambia de fiestra. Usei esta solución: mostrar unha lista de todas as fiestras, facer grep por regex, toma a primeira liña con cabeza, obtén a primeira columna (este será o ID da xanela) usando cortar, cambia á xanela por id.

Debería haber unha broma sobre expresións regulares e dous problemas, pero de feito non estou usando nada complicado. Necesito expresións regulares para poder indicar o final da liña (o símbolo “$”) e distinguir “Mozilla Firefox$” de “Mozilla Firefox (Navegación privada)$”.

O comando parece algo así:

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

Aquí xa podes adiviñar a segunda característica do script: se grep non devolve nada, entón a aplicación desexada non está aberta e cómpre iniciala executando o comando do segundo parámetro. E despois comprobe periodicamente se se abriu a xanela necesaria para transferirlle o foco. Non me centrarei nisto; quen o necesite mirará as fontes.

Cando as fiestras da aplicación non son distinguibles

Entón, aprendemos a transferir o foco á xanela da aplicación desexada. Pero que pasa se unha aplicación ten máis dunha ventá aberta? A cal debo centrarme? O script anterior probablemente se transferirá á primeira xanela aberta. Non obstante, gustaríanos máis flexibilidade. Gustaríame poder lembrar que xanela necesitamos e cambiar a esa xanela en particular.

A idea era esta: se queremos lembrar unha xanela específica para unha combinación de teclas, entón necesitamos premer esta combinación cando a xanela desexada estea enfocada. No futuro, ao premer esta combinación, o foco será centrado nesta xanela. Ata que se peche a xanela ou fagamos un reinicio para esta combinación de scripts showwinDetach.

Algoritmo de script showwin algo coma isto:

  • Comproba se lembramos previamente o id da xanela á que se debe transferir o foco.
    Se lembras e aínda existe esa xanela, transferimos o foco a ela e saímos.
  • Observamos que xanela está actualmente enfocada e, se coincide coa nosa solicitude, lembra o seu ID para ir a ela no futuro e saír.
  • Imos polo menos a algunha xanela adecuada se existe ou abrimos a aplicación desexada.

Podes descubrir que xanela está actualmente enfocada usando a utilidade da consola xdotool convertendo a súa saída a formato hexadecimal:

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

A forma máis sinxela de lembrar algo en bash é crear ficheiros nun sistema de ficheiros virtual situado na memoria. En Ubuntu, isto está activado por defecto en /dev/shm/. Non podo dicir nada doutras distribucións, espero que tamén haxa algo parecido. Podes mirar co comando:

$ mount -l | grep tmpfs

O script creará directorios baleiros neste cartafol, como este: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Ademais, cada vez que se chame, creará unha ligazón simbólica /dev/shm/$USER/showwin/showwin_last en /dev/shm/$USER/showwin/$SEARCH_REGEX. Isto será necesario para, se é necesario, eliminar o ID da xanela dunha determinada combinación mediante un script showwinDetach.

Que se pode mellorar

En primeiro lugar, os scripts deben configurarse manualmente. Seguramente, pola necesidade de afondar e facer moito coas mans, moitos de vós nin sequera tentaredes configurar o sistema. Se fose posible simplemente instalar o paquete e configurar todo máis facilmente, quizais gañase algo de popularidade. E despois mira, a aplicación lanzaríase en distribucións estándar.

E quizais se poida facer máis doado. Se co id dunha xanela podes descubrir o id do proceso que a creou, e polo id do proceso podes saber que comando a creou, entón sería posible automatizar a configuración. De feito, non entendín se o que escribín neste parágrafo era posible. O caso é que, persoalmente, estou satisfeito coa forma en que funciona agora. Pero se alguén que non sexa eu considera que todo o enfoque é conveniente e alguén o mellora, estarei encantado de usar unha solución mellor.

Outro problema, como xa escribín, é que nalgúns casos as fiestras non se poden distinguir entre si. Ata agora só observei isto con incógnito en cromo/cromo, pero quizais haxa algo semellante noutro lugar. Como último recurso, sempre existe a opción de combinacións universais Alt + 1...Alt + 0. De novo, uso Firefox e para min persoalmente este problema non é significativo.

Pero o problema importante para min é que uso Mac OS para traballar e non puiden configurar nada así alí. utilidade wmctrl Creo que puiden instalalo, pero realmente non funciona en Mac OS. Algo pódese facer coa aplicación Automator, pero é tan lento que non é conveniente usar aínda que estea funcionando. Tampouco puiden configurar combinacións de teclas para que funcionasen en todos os programas. Se alguén de súpeto dálle unha solución, estarei encantado de usala.

En vez de unha conclusión

Resultou ser un número inesperadamente grande de palabras para unha funcionalidade tan aparentemente sinxela. Quería transmitir a idea e non sobrecargar o texto, pero aínda non descubrín como contalo de xeito máis sinxelo. Quizais sería mellor en formato de vídeo, pero á xente non lle gusta así.

Falei un pouco sobre o que hai baixo o capó do guión e como configuralo. Non entrei en detalles do guión en si, pero só ten 50 liñas, polo que non é difícil de entender.

Espero que alguén máis probe esta idea e quizais incluso a aprecie. Podo dicir de min mesmo que o guión foi escrito hai uns 3 anos e é MOI conveniente para min. Tan cómodo que provoca graves molestias cando se traballa con ordenadores alleos. E cun MacBook funcionando.

Ligazón a guións

Fonte: www.habr.com

Engadir un comentario