Gestión de ventanas alternativa en Linux

Soy uno de los que configura el bloqueo de mayúsculas para cambiar de diseño porque soy demasiado vago para presionar 2 teclas cuando puedo 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 tecla innecesaria es abrir el menú contextual, que es tan innecesario que muchos fabricantes de portátiles lo eliminan. Entonces tienes que contentarte con lo que tienes.

Y tampoco quiero buscar sus íconos en la barra de tareas al cambiar de ventana, ni ver los nombres al desplazarme Alt + Tab, desplazarme por los escritorios, etc. Quiero presionar una combinación de teclas (idealmente solo una, pero ya no hay teclas gratuitas innecesarias) e inmediatamente acceder a 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, pulsando, por ejemplo, en Alt + M Quiero ver la calculadora independientemente de si este programa se está ejecutando actualmente. Si se está ejecutando, entonces es necesario darle foco a su ventana, y si no, ejecute el programa deseado y transfiera el foco cuando se cargue.

Para los casos que no están cubiertos por el script anterior, quiero tener combinaciones de teclas universales que puedan asignarse fácilmente a cualquiera de las ventanas abiertas. Por ejemplo, tengo 10 combinaciones asignadas de Alt + 1 a Alt + 0, que no están vinculados a ningún programa. Puedo simplemente hacer clic Alt + 1 y la ventana que está actualmente enfocada se enfocará cuando se haga clic Alt + 1.

Debajo del corte hay una descripción de un par de características más y una respuesta sobre cómo se puede hacer esto. Pero le advertiré de inmediato que dicha personalización "por usted mismo" puede causar una adicción severa e incluso abstinencia si necesita usar Windows, Mac OS o incluso la computadora de otra persona con Linux.

De hecho, si lo piensas bien, no utilizamos tantos programas a diario. Un navegador, un terminal, un IDE, algún tipo de mensajería, un administrador de archivos, una calculadora y, quizás, eso es casi todo. No se necesitan muchas combinaciones de teclas para cubrir el 95% de las tareas diarias.

Para programas que tienen varias ventanas abiertas, una de ellas puede designarse como principal. Por ejemplo, tiene varias ventanas de IntelliJ Idea abiertas y asignadas a Alt + E. En condiciones normales, cuando presiona Alt + E Se abrirá alguna ventana de este programa, muy probablemente la que se abrió primero. Sin embargo, si hace clic en Alt + E cuando una de las ventanas de este programa ya está enfocada, entonces esta ventana en particular será asignada como la principal y será la que recibirá foco cuando se presionen combinaciones posteriores.

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

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

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

En resumen, el enlace a los guiones se encuentra al final del artículo.

Pero aún así no podrás instalarlo ni usarlo de inmediato. Primero deberá descubrir cómo el script encuentra la ventana deseada. Sin esto, no será posible indicarle al guión dónde exactamente debe transferirse el foco. Y debe comprender qué hacer si de repente no se encuentra una ventana adecuada.

Y no me centraré en cómo configurar la ejecución de scripts presionando combinaciones de teclas. Por ejemplo, en KDE está en Configuración del sistema → Accesos directos → Accesos directos personalizados. Este también debería ser el caso en otros administradores de ventanas.

Presentamos wmctrl

Wmctrl — utilidad de consola para interactuar con X Window Manager. Este es el programa clave para el guión. Echemos un vistazo rápido a cómo puedes usarlo.

Primero, mostremos una lista de 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)
...

Opcion -l muestra una lista de todas las ventanas abiertas y -X agrega el nombre de la clase a la salida (Skype Skype, Navegador.Firefox etc). Aquí necesitamos 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 lo planeado, debería aparecer la ventana de Skype en la pantalla. Si en lugar de la opción -x opción de uso -i, luego, en lugar del nombre de la clase, puede especificar la identificación de la ventana. El problema con la identificación es que la identificación de la ventana cambia cada vez que se inicia la aplicación y no podemos saberlo de antemano. Por otro lado, este atributo identifica de forma única una ventana, lo que puede ser importante cuando una aplicación abre más de una ventana. Más sobre esto un poco más lejos.

En esta etapa debemos recordar que buscaremos la ventana deseada usando expresiones regulares por salida wmctrl-lx. Pero eso no significa que tengamos que usar algo complicado. Normalmente, el nombre de la clase o el nombre de la ventana es suficiente.

Básicamente, la idea principal ya debería estar clara. En la configuración global de teclas de acceso rápido/atajos de su administrador de ventanas, configure la combinación requerida para ejecutar el script.

Cómo utilizar guiones

Primero necesitas instalar las utilidades de la consola. wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

A continuación debe descargar los scripts y agregarlos a $ RUTA. normalmente los pongo ~ / 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 directorio ~ / bin no estaba allí, entonces necesita crearlo y reiniciar (o volver a iniciar sesión), de lo contrario ~ / bin no golpeará $ RUTA. Si todo se hace correctamente, entonces se debería poder acceder a los scripts desde la consola y la finalización con tabulación debería funcionar.

guión principal showwin toma 2 parámetros: el primero es una expresión regular, mediante la cual buscaremos la ventana requerida, y el segundo parámetro es un comando que debe ejecutarse si no se encuentra la ventana requerida.

Puedes intentar ejecutar un script, por ejemplo:

$ showwin "Mozilla Firefox$" firefox

Si Firefox está instalado, se debe resaltar su ventana. Incluso si Firefox no se estuviera ejecutando, debería haberse iniciado.

Si funciona, puede intentar configurar la ejecución de comandos en combinaciones. En la configuración global de teclas de acceso rápido/atajos agregue:

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

Etc. Cada uno puede configurar combinaciones de teclas y software como mejor le parezca.
Si todo salió correctamente, usando las combinaciones anteriores podremos cambiar entre ventanas simplemente presionando las teclas.

Decepcionaré a los amantes de Chrome: puede distinguir de incógnito una ventana normal por su salida wmctrl No puedes, tienen los mismos nombres de clases y títulos de ventanas. En la expresión regular propuesta, los caracteres N* e I* son necesarios sólo para que estas expresiones regulares difieran entre sí y puedan asignarse como ventanas principales.

Para restablecer la ventana principal de la combinación anterior (de hecho, para expresiones regulares, que showwin llamado la última vez) necesitas llamar al script showwinDetach. Tengo este script asignado a una combinación de teclas. Alt + Retroceso.

en el guión showwin Hay una función más. 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, pero considera que todas las ventanas son adecuadas. En sí mismo, esto parece inútil, pero de esta manera podemos designar cualquier ventana como principal y cambiar rápidamente a esa ventana en particular.

Tengo configuradas las siguientes combinaciones:

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

De esta manera puedo vincular cualquier ventana a combinaciones. Alt + 1...Alt + 0. Con solo hacer clic Alt + 1 Vinculo la ventana actual a esta combinación. Puedo cancelar el enlace haciendo clic Alt + 1y luego Alt + Retroceso. O cierra la ventana, eso también funciona.

A continuación os cuento algunos detalles técnicos. No es necesario que los leas, solo intenta configurarlos y verlos. Pero aun así recomendaría comprender los scripts de otras personas antes de ejecutarlos en su computadora :).

Cómo distinguir entre diferentes ventanas de una misma aplicación

En principio, el primer ejemplo “wmctrl -a skype.Skype -x” funcionaba y se podía utilizar. Pero volvamos a ver el ejemplo con Firefox, en el que hay 2 ventanas 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 aplicaciones diferentes y cambiar a ellas usando diferentes combinaciones de teclas.

Es necesario complicar el script que cambia de ventana. Utilicé esta solución: mostrar una lista de todas las ventanas, hacer grep por expresiones regulares, tome la primera línea con cabeza, obtenga la primera columna (esta será la identificación de la ventana) usando cortar, cambie a ventana por id.

Debería haber un chiste sobre expresiones regulares y dos problemas, pero en realidad no estoy usando nada complicado. Necesito expresiones regulares para poder indicar el final de la línea (el símbolo “$”) y distinguir “Mozilla Firefox$” de “Mozilla Firefox (Navegación privada)$”.

El comando se parece a esto:

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

Aquí ya puedes adivinar la segunda característica del script: si grep no devuelve nada, entonces la aplicación deseada no está abierta y debes iniciarla ejecutando el comando desde el segundo parámetro. Y luego verifique periódicamente si se ha abierto la ventana requerida para poder transferirle el foco. No me centraré en esto; cualquiera que lo necesite consultará las fuentes.

Cuando las ventanas de la aplicación no se distinguen

Entonces, hemos aprendido cómo transferir el foco a la ventana de la aplicación deseada. ¿Pero qué pasa si una aplicación tiene más de una ventana abierta? ¿A cuál debería darle foco? Lo más probable es que el script anterior se transfiera a la primera ventana abierta. Sin embargo, nos gustaría tener más flexibilidad. Me gustaría poder recordar qué ventana necesitamos y cambiar a esa ventana en particular.

La idea era la siguiente: si queremos recordar una ventana específica para una combinación de teclas, entonces debemos presionar esta combinación cuando la ventana deseada esté enfocada. En el futuro, cuando presione esta combinación, el foco se centrará en esta ventana. Hasta que se cierre la ventana o reiniciemos esta combinación de scripts showwinDetach.

Algoritmo de secuencia de comandos showwin algo como esto:

  • Comprobar si hemos recordado previamente el id de la ventana a la que se debe transferir el foco.
    Si recuerda y esa ventana todavía existe, le transferimos el foco y salimos.
  • Observamos qué ventana está actualmente enfocada y, si coincide con nuestra solicitud, recordamos su identificación para acceder a ella en el futuro y salir.
  • Nos dirigimos al menos a alguna ventana adecuada si existe o abrimos la aplicación deseada.

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

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

La forma más sencilla de recordar algo en bash es crear archivos en un sistema de archivos virtual ubicado en la memoria. En Ubuntu esto está habilitado de forma predeterminada en /dev/shm/. De otras distribuciones no puedo decir nada, espero que haya algo parecido también. Puedes mirar con el comando:

$ mount -l | grep tmpfs

El script creará directorios vacíos en esta carpeta, como este: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Además, cada vez que se llame, se creará un enlace simbólico. /dev/shm/$USUARIO/showwin/showwin_last en /dev/shm/$USER/showwin/$SEARCH_REGEX. Esto será necesario para, si es necesario, eliminar la identificación de la ventana para una determinada combinación mediante un script. showwinDetach.

que se puede mejorar

En primer lugar, los scripts deben configurarse manualmente. Seguramente, por la necesidad de profundizar y hacer muchas cosas con las manos, muchos de vosotros ni siquiera intentaréis configurar el sistema. Si fuera posible simplemente instalar el paquete y configurar todo más fácilmente, quizás ganaría algo de popularidad. Y luego mire, la aplicación se lanzaría en distribuciones estándar.

Y quizás se pueda hacer más fácilmente. Si por la identificación de una ventana puedes encontrar la identificación del proceso que la creó, y por la identificación del proceso puedes encontrar qué comando la creó, entonces sería posible automatizar la configuración. De hecho, no entendí si lo que escribí en este párrafo era posible. El hecho es que personalmente estoy satisfecho con el funcionamiento actual. Pero si alguien que no sea yo encuentra conveniente todo el enfoque y alguien lo mejora, estaré encantado de utilizar una solución mejor.

Otro problema, como ya escribí, es que en algunos casos las ventanas no se pueden distinguir entre sí. Hasta ahora sólo he observado esto con incógnito en chrome/chromium, pero quizás haya algo similar en otro lugar. Como último recurso, siempre existe la opción de combinaciones universales. Alt + 1...Alt + 0. Nuevamente uso Firefox y para mí personalmente este problema no es significativo.

Pero el problema importante para mí es que uso Mac OS para trabajar y no pude configurar nada parecido allí. utilidad wmctrl Creo que pude instalarlo, pero en realidad no funciona en Mac OS. Se puede hacer algo con la aplicación. Automator, pero es tan lento que no es cómodo de usar incluso cuando está funcionando. Tampoco pude configurar combinaciones de teclas para que funcionaran en todos los programas. Si de repente a alguien se le ocurre una solución, estaré encantado de utilizarla.

En lugar de una conclusión

Resultó ser una cantidad inesperadamente grande de palabras para una funcionalidad aparentemente tan simple. Quería transmitir la idea y no sobrecargar el texto, pero todavía no he descubierto cómo contarlo de forma más sencilla. Quizás sería mejor en formato vídeo, pero a la gente aquí no le gusta así.

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

Espero que alguien más pruebe esta idea y tal vez incluso la aprecie. Puedo decir de mí que el guión fue escrito hace unos 3 años y me resulta MUY conveniente. Tan conveniente que causa graves molestias al trabajar con computadoras ajenas. Y con una MacBook que funcione.

Enlace a guiones

Fuente: habr.com

Añadir un comentario