Estoy intentando crear un módulo de barra polivinílica personalizado que muestre la clase de ventana activa actual, ya que el módulo predeterminado genera el nombre de la ventana.
Estoy usando este comando para obtener la clase de ventana:
xprop -id $(xdotool getactivewindow) WM_CLASS
y obteniendo este resultado:
WM_CLASS(STRING) = "kitty", "kitty"
pero el resultado deseado es:
kitty
¿Cómo puedo hacer eso?
Respuesta1
Puedes salirte con la tuya:
xprop -id $(xdotool getactivewindow) WM_CLASS |
awk -F '"' '{print $2}'
Pero también con (el más simple):
xprop -id $(xdotool getactivewindow) WM_CLASS |
cut -d '"' -f 2
O (advertencia, si la expresión regular no coincide, se imprimirá toda la entrada)
xprop -id $(xdotool getactivewindow) WM_CLASS |
sed 's/^[^"]*"\([^"]*\)".*$/\1/'
O sed de nuevo, pero un poco más robusto:
xprop -id $(xdotool getactivewindow) WM_CLASS |
sed -n 's/^[^"]*r"\([^"]*\)".*$/\1/p'
O incluso (no tan robusto) con grep (pero solo grep GNU y con expresiones regulares de Perl):
xprop -id $(xdotool getactivewindow) WM_CLASS |
grep -Po '^[^"]*"\K[^"]*'
¿Es eso lo que quieres decir?
En palabras: ¿extrae la cadena dentro del primer par de comillas; de lo contrario, falla?
Respuesta2
xprop
genera cadenas en un formato muy similar al de las $'...'
comillas de ksh93/zsh/bash donde la barra invertida, el control y los caracteres no ASCII se representan como su notación ANSI C \\
, \n
o .\r
\t
\ooo
La única diferencia es que debido a que están entre comillas dobles, "
se representa como \"
y '
se representa como '
en lugar de \'
, por lo que no debería ser demasiado difícil convertir esa salida para que WM_CLASS=$'...'
la evalúe el shell.
Sin embargo, es aún más fácil (y seguro) generarlo xprop
como valores hexadecimales y transformarlo a $'\xHH...'
:
Para el nombre de la aplicación (el primero kitty
en su ejemplo):
eval "$(
xprop -id "$(xdotool getactivewindow)" -notype 8x WM_CLASS |
sed 's/0x/\\x/g;s/[, ]//g;s/\\x0.*/'\''/;s/=/=$'\'/
)"
para el nombre de la clase de aplicación (el segundo kitty
en su ejemplo):
eval "$(
xprop -id "$(xdotool getactivewindow)" -notype 8x WM_CLASS |
sed 's/0x/\\x/g;s/[, ]//g;s/=.*\\x0\(.*\)\\x0/=$'"'\\1'/"
)"
Ambos establecen la $WM_CLASS
variable de shell.
Eso funcionaría independientemente del valor de byte que pueda contener la propiedad.
Se supone un shell con soporte para $'\xHH'
.
Respuesta3
Probado con el método
xprop -id $(xdotool getactivewindow) WM_CLASS| awk '{gsub(/[","]/,"",$3);print $3}'
output
kitty
pitón
la salida del comando "xprop -id $(xdotool getactivewindow) WM_CLASS" se guarda en la variable "a"
#!/usr/bin/python
import re
a='"WM_CLASS(STRING) = "kitty", "kitty"'
b=a.split(' ')[2]
print b.replace('"','').replace(",","")