Ich versuche, ein benutzerdefiniertes Polybar-Modul zu erstellen, das die aktuell aktive Fensterklasse anzeigt, da das Standardmodul den Fensternamen ausgibt.
Ich verwende diesen Befehl, um die Fensterklasse zu erhalten:
xprop -id $(xdotool getactivewindow) WM_CLASS
und erhalte diese Ausgabe:
WM_CLASS(STRING) = "kitty", "kitty"
aber die gewünschte Ausgabe ist:
kitty
wie kann ich das machen?
Antwort1
Möglicherweise kommen Sie damit durch:
xprop -id $(xdotool getactivewindow) WM_CLASS |
awk -F '"' '{print $2}'
Aber auch mit (dem einfacheren):
xprop -id $(xdotool getactivewindow) WM_CLASS |
cut -d '"' -f 2
Oder (Achtung, wenn der reguläre Ausdruck nicht übereinstimmt, wird die gesamte Eingabe ausgedruckt)
xprop -id $(xdotool getactivewindow) WM_CLASS |
sed 's/^[^"]*"\([^"]*\)".*$/\1/'
Oder noch einmal sed, aber etwas robuster:
xprop -id $(xdotool getactivewindow) WM_CLASS |
sed -n 's/^[^"]*r"\([^"]*\)".*$/\1/p'
Oder sogar (nicht so robust) mit grep (aber nur GNU grep und mit Perl regex):
xprop -id $(xdotool getactivewindow) WM_CLASS |
grep -Po '^[^"]*"\K[^"]*'
Meinen Sie das?
In Worten: Extrahieren Sie die Zeichenfolge innerhalb des ersten Anführungszeichenpaars, andernfalls tritt ein Fehler auf?
Antwort2
xprop
gibt Zeichenfolgen in einem Format aus, das dem der Anführungszeichen von ksh93/zsh/bash sehr ähnlich ist, wobei Backslash, Steuerzeichen und Nicht-ASCII-Zeichen in ihrer ANSI-C- , , , oder -Notation $'...'
dargestellt werden .\\
\n
\r
\t
\ooo
Der einzige Unterschied besteht darin, dass aufgrund der Einschließung in doppelte Anführungszeichen "
selbst als \"
und als statt als '
wiedergegeben wird . Es sollte also nicht zu schwierig sein, diese Ausgabe so umzuwandeln, dass sie von der Shell ausgewertet werden kann.'
\'
WM_CLASS=$'...'
Es ist jedoch noch einfacher (und sicherer), xprop
es als Hexadezimalwerte auszugeben und wie folgt umzuwandeln $'\xHH...'
:
Für den Anwendungsnamen (der erste kitty
in Ihrem Beispiel):
eval "$(
xprop -id "$(xdotool getactivewindow)" -notype 8x WM_CLASS |
sed 's/0x/\\x/g;s/[, ]//g;s/\\x0.*/'\''/;s/=/=$'\'/
)"
für den Namen der Anwendungsklasse (die zweite kitty
in Ihrem Beispiel):
eval "$(
xprop -id "$(xdotool getactivewindow)" -notype 8x WM_CLASS |
sed 's/0x/\\x/g;s/[, ]//g;s/=.*\\x0\(.*\)\\x0/=$'"'\\1'/"
)"
Beide setzen die $WM_CLASS
Shell-Variable.
Dies würde unabhängig davon funktionieren, welchen Bytewert die Eigenschaft enthalten könnte.
Setzt eine Shell mit Unterstützung für voraus $'\xHH'
.
Antwort3
Mit Methode versucht
xprop -id $(xdotool getactivewindow) WM_CLASS| awk '{gsub(/[","]/,"",$3);print $3}'
output
kitty
Python
Die Ausgabe des Befehls „xprop -id $(xdotool getactivewindow) WM_CLASS“ wird in der Variable „a“ gespeichert.
#!/usr/bin/python
import re
a='"WM_CLASS(STRING) = "kitty", "kitty"'
b=a.split(' ')[2]
print b.replace('"','').replace(",","")