Oto kolejne rozwiązanie zgodne ze sposobem UNIX!
Na pierwszy rzut oka nie jest tak piękny jak twój, @ t7ko:
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
Ale znoś mnie! Jest w tym trochę ukrytego piękna.
Krótko mówiąc, to
- ma strukturę liniową zamiast struktury drzewa, jak jeden zamiast dwóch wymiarów
- używa bardziej znanej składni powłoki .
- faktycznie odpowiada na twoje pytanie: lokalizuje okno.
(To, czy te punkty są zaletami, zależy od kontekstu - zignorujmy ten aspekt * ).
Pokażę ten sam kod w bardziej uporządkowanym układzie poniżej, aby ułatwić zrozumienie krok po kroku.
Zauważ jednak, że wcięcie ma na celu wyjaśnienie polecenia - nie oznacza to zagnieżdżenia, wszystko jest nadal liniowym potokiem UNIX.
To samo polecenie, po prostu podzielone za potokami ( |
):
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
Pełne polecenie, jak pokazano powyżej, podaje lokalizację gvim
okna w pikselach, zwracając współrzędne pikseli względem lewego górnego rogu bieżącego (ewentualnie wirtualnego) ekranu x,y
, tak jak 42,433
, a może, -5375,-3809
gdy jest on na pierwszym z czterech na czterech wirtualnych ekranach , a obecny jest gdzieś po prawej stronie.
Na razie skrócę polecenie, aby znaleźć tylko identyfikator okna X11 - może to wszystko, czego faktycznie potrzebował OP, nie jestem pewien:
Skrócony potok poleceń, osobne polecenie powłoki w każdym wierszu:
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
xargs -I{} xdotool search --all --pid {} --name 'TODO'
Teraz zaczyna być czytelny:
xdotool \
search --onlyvisible --class 'gvim' \
getwindowpid %@ |
xargs -I{} \
xdotool search --all --pid {} --name 'TODO'
xdotool
Komenda search
służy do znalezienia okna z „ klasą ” gvim
, pozostawiając pewne „wewnętrzne” okna. Wynik jest wymieniony jako PID
„s” (identyfikatory procesu).
Dla każdego PID
, xargs
uruchamia kolejny xdotool search
, sprawdzając „name” dla naszego przykładowego wzorca TODO
- po sprawdzeniu dla PID
.
(Na wszelki wypadek: linie kończące się na \
- tak zwane linie kontynuacji - muszą faktycznie kończyć \
się znakiem spacji przed znakiem nowej linii i bez białych znaków).
Teraz wróć do pierwotnego polecenia:
xdotool \
search --onlyvisible --class 'gvim' \
getwindowpid %@ |
xargs -I{} \
xdotool \
search --all --pid {} --name 'TODO' \
getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
W pozostałej części wymieniono niektóre szczegóły dotyczące okna, w tym pozycję. Te sed
mecze dowodzenia i powroty tylko x,y
wartość pozycji.
Na przykład uruchomienie polecenia u góry na moim 16. wirtualnym ekranie (4 na 4), z „DO ZROBIENIA” gvim
na ekranie 1:
$ xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
-7653,-4732
*) Zastrzeżenie: Wolę kod @ t7ko. Dużo!
xdotool
do bani ... to taka prosta operacja i nie ma sposobu, aby zrobić to elegancko.