Вот еще одно решение, придерживающееся пути 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
отстой ... это такая простая операция, и нет способа сделать это элегантно.