Gestión alternativa de ventanas en Linux

Soy uno de los que pone diseños de cambio de Bloq Mayús porque soy demasiado vago para presionar 2 teclas cuando puedes presionar una. Incluso me gustaría tener 2 teclas innecesarias: usaría una para activar el diseño en inglés y la segunda para el ruso. Pero la segunda clave innecesaria es una llamada al menú contextual, que es tan innecesario que muchos fabricantes de computadoras portátiles la cortan. Entonces debes estar contento con lo que tienes.


Y cuando cambio de ventana, no quiero buscar sus íconos en la barra de tareas, ver los nombres al desplazarme por Alt + Tab , desplazarme por los escritorios, etc. Quiero presionar una combinación de teclas (idealmente, hay una, pero no hay teclas innecesarias gratuitas ) e inmediatamente me meto en la ventana que necesito. Por ejemplo, así:


  • Alt + F: Firefox
  • Alt + D: Firefox (Navegación Privada)
  • Alt + T: Terminal
  • Alt + M: Calculadora
  • Alt + E: Idea IntelliJ
  • etc.

Además, al presionar, por ejemplo, Alt + M, quiero ver la calculadora, independientemente de si este programa se está ejecutando actualmente. Si se está ejecutando, entonces su ventana debe enfocarse, y si no, inicie el programa deseado y transfiera el foco cuando se cargue.


Para los casos que no están cubiertos por el escenario anterior, quiero tener atajos de teclado universales a los que pueda asignar fácilmente cualquiera de las ventanas abiertas. Por ejemplo, tengo 10 combinaciones asignadas de Alt + 1 a Alt + 0 que no están vinculadas a ningún programa. Solo puedo presionar Alt + 1 y la ventana que está actualmente enfocada recibirá el foco cuando se presione Alt + 1 .


Debajo del corte, una descripción de un par de características más y una respuesta a cómo hacerlo. Pero inmediatamente le advertiré que tal personalización "para usted" puede causar una fuerte adicción e incluso romperla si es necesario, use Windows, Mac OS o incluso la computadora de otra persona con Linux.


De hecho, si lo piensa, no usamos muchos programas todos los días. Un navegador, terminal, IDE, algún tipo de mensajero, administrador de archivos, calculadora y, tal vez, eso es casi todo. No se necesitan muchas combinaciones de teclas para cubrir el 95% de las tareas cotidianas.


Para los programas que tienen varias ventanas abiertas, una de ellas puede asignarse como la principal. Por ejemplo, varias ventanas de IntelliJ Idea están abiertas, asignadas a Alt + E. En condiciones normales, presionar Alt + E abrirá alguna ventana de este programa, muy probablemente la que se abrió primero. Sin embargo, si presiona Alt + E cuando una de las ventanas de este programa ya está enfocada, entonces esta ventana se asignará como la principal y el foco se transferirá a ella luego de presionar la combinación.


La ventana principal se puede reasignar. Para hacer esto, primero debe restablecer la combinación y luego asignarle otra ventana como la principal. Para restablecer una combinación, debe presionar la combinación en sí, y luego una combinación de restablecimiento especial, tengo asignada a Alt + Retroceso . Esto invocará un script que desasignará la ventana principal de la combinación anterior. Y luego puede asignar una nueva ventana principal como se describe en el párrafo anterior. Restablecer una ventana atada a combinaciones universales es similar.


La presentación resultó ser larga, pero primero quería decir qué haremos y luego explicar cómo hacerlo.


Para los que están cansados ​​de leer.


En resumen, un enlace a los guiones al final del artículo.


Pero de todos modos, no funcionará e inmediatamente se instalará y usará. Primero tienes que descubrir cómo el script encuentra la ventana correcta. Sin esto, no funcionará decirle al script exactamente dónde enfocarse. Y debe comprender qué hacer si de repente no se encuentra una ventana adecuada.


Y no me enfocaré en cómo configurar la ejecución del script presionando combinaciones de teclas. Por ejemplo, en KDE, esto está en Configuración del sistema → Accesos directos → Accesos directos personalizados. En otros gestores de ventanas, esto también debería ser.


Introduciendo wmctrl


Wmctrl es una utilidad de consola para interactuar con X Window Manager. Este es un programa de script clave. Echemos un vistazo rápido a cómo puede usarlo.


Primero, enumere las ventanas abiertas:


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

La opción -l muestra una lista de todas las ventanas abiertas, y -x agrega el nombre de la clase ( skype.Skype , Navigator.Firefox , etc.) a la salida. Necesitaremos la identificación de la ventana (columna 1), el nombre de la clase (columna 3) y el nombre de la ventana (última columna).


Puedes intentar activar alguna ventana usando la opción -a :


 $ wmctrl -a skype.Skype -x 

Si todo salió según el plan, debería aparecer una ventana de Skype en la pantalla. Si usa la opción -i en lugar de la opción -x , puede especificar el id de la ventana en lugar del nombre de la clase. Con id, el problema es que el id de la ventana cambia cada vez que se inicia la aplicación y no podemos saberlo de antemano. Por otro lado, este atributo indica de forma exclusiva una ventana, que puede ser importante cuando una aplicación abre más de una ventana. Sobre esto un poco más lejos.


En esta etapa, debemos recordar que buscaremos la ventana deseada utilizando expresiones regulares de acuerdo con la salida de wmctrl -lx . Pero esto no significa que debamos usar algo complicado. Por lo general, un nombre de clase o nombre de ventana es suficiente.


En principio, la idea básica ya debería estar clara. En la configuración global de teclas rápidas / accesos directos para su administrador de ventanas, configuramos la combinación deseada para ejecutar el script.


Cómo usar scripts


Primero necesita instalar las utilidades de consola wmctrl y xdotool :


 $ sudo apt-get install wmctrl xdotool 

A continuación, debe descargar los scripts y agregarlos a $ PATH . Usualmente los pongo en ~ / 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 no había un directorio ~ / bin , entonces debe crearse y reiniciarse (o iniciar sesión), de lo contrario ~ / bin no entrará en $ PATH . Si todo se hace correctamente, entonces los scripts deberían ser accesibles desde la consola y la finalización de Tab debería funcionar.


El script showwin principal toma 2 parámetros: el primero es regex, mediante el cual buscaremos la ventana deseada, y el segundo parámetro es el comando que debe ejecutarse si no se encuentra la ventana deseada.


Puede intentar ejecutar un script, por ejemplo:


 $ showwin "Mozilla Firefox$" firefox 

Si Firefox está instalado, debe enfocarse en su ventana. Incluso si Firefox no se estaba ejecutando, debería haber comenzado.


Si resultó, puede intentar configurar la ejecución de comandos en una combinación. En la configuración global de teclas rápidas / accesos directos, agregue:


  • Alt + F: showwin "Mozilla Firefox $" firefox
  • Alt + D: showwin "Mozilla Firefox (Navegación Privada) $" "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

Y así sucesivamente. Combinaciones de teclas y software que todos pueden configurar como más le convenga.
Si todo salió bien, de acuerdo con las combinaciones anteriores, podemos cambiar entre ventanas con una simple pulsación de tecla.


Decepcionaré a los amantes de Chrome: es incógnito distinguir una ventana ordinaria de la salida de wmctrl , tienen los mismos nombres de clase y encabezados de ventana. En la expresión regular propuesta, los caracteres N * e I * solo son necesarios para que estos clientes habituales difieran entre sí y se les puedan asignar diferentes ventanas como las principales.


Para restablecer la ventana principal de la combinación anterior (de hecho para regex, que se llamó a showwin por última vez), debe llamar al script showwinDetach . Tengo este script asignado a la combinación de teclas Alt + Retroceso .


El script showwin tiene otra característica. Cuando se llama con un parámetro (en este caso, el parámetro es solo un identificador), no verifica la expresión regular en absoluto y considera que todas las ventanas son adecuadas. En sí mismo, esto parece inútil, sin embargo, de esta manera podemos designar cualquier ventana como la principal y cambiar rápidamente a esta ventana en particular.


He configurado tales combinaciones:


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

De esta manera puedo vincular cualquier ventana a Alt + 1 ... Alt + 0 combinaciones. Simplemente presionando Alt + 1 , ato la ventana actual a esta combinación. Puedo desvincularme presionando Alt + 1 , y luego Alt + Retroceso . O cierre la ventana, esto también funciona.


Además les contaré algunos detalles técnicos. No puede leerlos, solo intente configurarlos y verlos. Pero aún así recomendaría comprender los scripts de otras personas antes de ejecutarlos en su computadora :).


Cómo distinguir diferentes ventanas de una aplicación


En principio, el primer ejemplo de "wmctrl -a skype.Skype -x" estaba funcionando y se puede usar. Pero veamos nuevamente el ejemplo con Firefox, en el que 2 ventanas están abiertas:


 0x04400003 0 Navigator.Firefox N/A Google  - Mozilla Firefox 0x04400218 0 Navigator.Firefox N/A     /  - Mozilla Firefox (Private Browsing) 

La primera ventana es el modo normal y la segunda es la Navegación privada. Me gustaría considerar estas ventanas como diferentes aplicaciones y cambiarlas usando diferentes combinaciones de teclas.


Necesita complicar el script que cambia las ventanas. Utilicé esta solución: mostrar una lista de todas las ventanas, hacer grep por regex, tomar la primera línea con encabezado , obtener la primera columna (esta será la identificación de la ventana) con corte , cambiar a la ventana por identificación.


Debería haber una broma sobre expresiones regulares y dos problemas, pero en realidad no uso nada complicado. Necesito clientes habituales para poder indicar el final de la línea (el carácter "$") y distinguir entre "Mozilla Firefox $" y "Mozilla Firefox (Navegación privada) $".


El comando se ve así:


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

Aquí ya puede adivinar la segunda característica del script: si grep no devolvió nada, la aplicación deseada no está abierta y debe iniciarla ejecutando el comando desde el segundo parámetro. Y luego verifique periódicamente si se ha abierto la ventana derecha para enfocarlo. No me enfocaré en esto, aquellos que lo necesiten mirarán la fuente.


Cuando las ventanas de la aplicación no son distinguibles


Entonces, hemos aprendido a transferir el foco a la ventana de la aplicación deseada. Pero, ¿qué pasa si hay más de una ventana de una aplicación abierta? ¿En cuál debería centrarme? La secuencia de comandos anterior pasará, muy probablemente, a la primera ventana abierta. Sin embargo, nos gustaría más flexibilidad. Me gustaría poder recordar qué ventana necesitamos y cambiar a esta ventana.


La idea era esta: si queremos recordar cierta ventana para una combinación de teclas, entonces debemos presionar esta combinación cuando la ventana deseada esté enfocada. En el futuro, cuando haga clic en esta combinación, se enfocará en esta ventana en particular. Hasta que se cierre la ventana o reiniciemos esta combinación de script showwinDetach .


El algoritmo de script showwin es algo como esto:


  • Verifique si recordamos previamente la identificación de la ventana a la que se debe pasar el foco.
    Si recuerdas y aún existe una ventana así, entonces transferimos el foco a ella y salimos.
  • Observamos qué ventana está actualmente enfocada, y si se ajusta a nuestra solicitud, recordaremos su identificación para ir a ella en el futuro y salir.
  • Pasamos al menos a una ventana adecuada si existe o abrimos la aplicación deseada.

Puede averiguar qué ventana está actualmente enfocada utilizando la utilidad de consola xdotool, convirtiendo su salida a formato hexadecimal:


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

Recordar algo en bash es la forma más fácil de crear archivos en un sistema de archivos virtual en la memoria. En Ubuntu, esto está conectado por defecto en / dev / shm / . No puedo decir nada sobre otras distribuciones, espero que esto también exista. Puedes ver el comando:


 $ mount -l | grep tmpfs 

El script creará directorios vacíos en esta carpeta, así: / dev / shm / $ USER / showwin / $ SEARCH_REGEX / $ WINDOW_ID . Además, con cada llamada, creará un enlace simbólico / dev / shm / $ USER / showwin / showwin_last en / dev / shm / $ USER / showwin / $ SEARCH_REGEX . Esto será necesario para eliminar la identificación de la ventana para una combinación específica si es necesario utilizando el script showwinDetach .


¿Qué se puede mejorar?


Primero, los scripts deben configurarse a mano. Seguramente, debido a la necesidad de profundizar y hacer mucho con sus manos, muchos de ustedes ni siquiera intentarán configurar el sistema. Si fuera posible simplemente poner el paquete y configurar todo más fácilmente, entonces tal vez ganaría algo de popularidad. Y allí, mire las distribuciones estándar, ellos cortarían la aplicación.


Y tal vez más fácil se puede hacer. Si por el id de la ventana puede encontrar el id del proceso que lo creó, y por el id del proceso puede averiguar qué equipo lo creó, entonces podría automatizar la configuración. De hecho, no entendí si lo que escribí en este párrafo es posible. El hecho es que para mí personalmente se adapta a la forma en que funciona ahora. Pero si para alguien que no sea yo, todo el enfoque parece conveniente y alguien lo mejora, entonces estaré encantado de usar la mejor solución.


Otro problema, como ya escribí, es que en algunos casos las ventanas no se pueden distinguir entre sí. Hasta ahora solo he visto esto con incógnito en cromo / cromo, pero quizás en otro lugar hay algo similar. En casos extremos, siempre hay una variante de las combinaciones universales Alt + 1 ... Alt + 0 . Nuevamente, uso Firefox y para mí personalmente este problema no es significativo.


Pero un problema importante para mí es que uso Mac OS para el trabajo y no pude configurar algo así allí. Parece que puede entregar la utilidad wmctrl , pero en realidad no funciona en Mac OS. Se puede hacer algo con la aplicación Automator , pero es tan lenta que no es conveniente usarla incluso cuando funciona. Tampoco pude configurar las combinaciones de teclas para que funcionaran en todos los programas. Si de repente alguien encuentra una solución, me complacerá usarla.


En lugar de una conclusión


Resultó inesperadamente muchas palabras para una funcionalidad aparentemente tan simple. Quería transmitir la idea y no sobrecargar el texto, pero aún no he descubierto cómo decirlo más fácilmente. Tal vez sería mejor en formato de video, pero no les gusta así.


Hablé un poco sobre lo que está debajo del capó del script y cómo configurarlo. No entré en los detalles del guión en sí, pero son solo 50 líneas, no es difícil de entender.


Espero que alguien más pruebe esta idea y quizás hasta la aprecie. Puedo decir por mí mismo que el guión fue escrito hace unos 3 años y es MUY conveniente para mí. Es tan conveniente que causa graves molestias al trabajar con las computadoras de otras personas. Y con un macbook que funcione.


Enlace de script

Source: https://habr.com/ru/post/483846/


All Articles