Ось ще одне рішення, яке дотримується способу UNIX!
На перший погляд, він не такий гарний, як ваш, @ 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'
Але нехай зі мною! У ньому є якась прихована краса.
Словом, це
- має лінійну структуру , а не структуру дерева, як одну замість двох вимірів
- використовує більш відомий синтаксис оболонки .
- насправді відповідає на ваше запитання: воно знаходить вікно.
(Переваги цих моментів залежить від контексту - давайте просто ігноруємо цей аспект * .)
Я покажу той самий код у більш структурованому макеті нижче, щоб полегшити його розуміння крок за кроком.
Але зауважте, що відступ полягає в тому, щоб пояснити команду - вона не вказує на гніздування чи так, все одно це лінійний трубопровід UNIX.
Ця ж команда, щойно розділиться після труб ( |
):
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'
Повна команда, як показано вище, дає розташування пікселів у gvim
вікні, повертаючи координати пікселів відносно верхнього лівого кута поточного (можливо, віртуального) екрана, як x,y
, наприклад 42,433
, або, можливо, -5375,-3809
коли він знаходиться на першому з чотирьох віртуальних екранів , а поточний десь внизу праворуч.
Поки що я скорочую команду, щоб знайти лише ідентифікатор вікна X11 - можливо, це все, що насправді було потрібно OP, не впевнений:
Скорочений конвеєр команд, окрема команда оболонки на кожному рядку:
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
xargs -I{} xdotool search --all --pid {} --name 'TODO'
Тепер він починає читати:
xdotool \
search --onlyvisible --class 'gvim' \
getwindowpid %@ |
xargs -I{} \
xdotool search --all --pid {} --name 'TODO'
xdotool
Команда search
використовується для пошуку вікна з « клас » gvim
, в результаті чого деякі «внутрішні» вікна. Результат вказаний як PID
's (ідентифікатори процесу).
Для кожного PID
, xargs
працює інше xdotool search
, перевіряючи «ім'я» для нашого прикладу шаблону TODO
- після перевірки для PID
.
(На всяк випадок: рядки, що закінчуються на \
- називаються рядки продовження, - насправді повинні закінчуватися \
пробілом та без пробілу перед новим рядком.)
Тепер поверніться до початкової команди:
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'
У решті частини перераховані деякі деталі про вікно, включаючи положення. В sed
командних матчах і повертає тільки x,y
значення позиції.
Наприклад, запуск команди вгорі на моєму 16-му віртуальному екрані (з 4 на 4), з "TODO" gvim
на екрані 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
*) Відмова: Я віддаю перевагу коду @ t7ko. Багато!
xdotool
смокче ... це така проста операція, і немає способу зробити це елегантно.