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ę gvimokna 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,-3809gdy 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'
xdotoolKomenda searchsł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, xargsuruchamia 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 sedmecze dowodzenia i powroty tylko x,ywartość pozycji.
Na przykład uruchomienie polecenia u góry na moim 16. wirtualnym ekranie (4 na 4), z „DO ZROBIENIA” gvimna 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!
xdotooldo bani ... to taka prosta operacja i nie ma sposobu, aby zrobić to elegancko.