xdotool позволяет искать окна с помощью подкоманды поиска. Мне нужно найти окно, которое имеет класс 'gvim' и заголовок, содержащий слово 'TODO'. Как мне это сделать?
Что я пробовал:
- Вы можете сделать
xdotool search --name --class
, но он будет принимать только один шаблон для имени и названия. - xdotool поддерживает цепочку команд, но я не смог найти способ связать два поисковых запроса - второй просто переопределяет первый.
xdotool
отстой ... это такая простая операция, и нет способа сделать это элегантно.Ответы:
Моя справка по xdotool информирует меня о том, что ваши два коммутатора одинаковы (xdotool версия 3.20150503.1),
и как таковой ничего не делает. Мой xdotool делает то же самое, что и вы, заменив стек окон, поэтому я сделал это с помощью сценария оболочки. Скрипт оболочки, выполняющий то, что вы хотите, представлен ниже:
Звездочки в операторе if присутствуют для того, чтобы сопоставить подстроку
TODO
, чтобы это могло произойти где угодно в заголовке.источник
Мне удалось определить короткое и одностороннее решение:
источник
Вот еще одно решение, придерживающееся пути UNIX!
На первый взгляд, это не так красиво, как у вас, @ t7ko:
Но потерпи меня! В этом есть какая-то скрытая красота.
Короче говоря, это
(Являются ли эти моменты преимуществами, зависит от контекста - давайте просто проигнорируем этот аспект * .)
Я покажу тот же код в более структурированном макете ниже, чтобы его было легче понять шаг за шагом.
Но обратите внимание, что отступ - это объяснение команды - она не указывает на вложение или что-то в этом роде, все по-прежнему является линейным конвейером UNIX.
Та же команда, только что разделенная после каналов (
|
):Полная команда, как показано выше, дает расположение
gvim
окна в пикселях, возвращая координаты пикселей относительно верхнего левого угла текущего (возможно, виртуального) экрана, какx,y
, например42,433
, или, возможно,-5375,-3809
когда он находится на первом из четырех на четырех виртуальных экранах и текущий находится где-то справа.Пока я сокращу команду, чтобы найти только идентификатор окна X11 - возможно, это все, что было на самом деле нужно OP, не уверен:
Сокращенный конвейер команд, отдельная команда оболочки в каждой строке:
Теперь он начинает читаться:
xdotool
Командаsearch
используется для поиска окна с « класс »gvim
, в результате чего некоторые «внутренние» окна. Результат указан какPID
's (идентификаторы процесса).Для каждого
PID
,xargs
работает другоеxdotool search
, проверяя «имя» для нашего примера шаблонаTODO
- после проверки дляPID
.(На всякий случай: строки, оканчивающиеся на
\
- называемые линиями продолжения - должны на самом деле заканчиваться\
символом «пробел» и без пробелов перед новой строкой.)Теперь вернемся к исходной команде:
В оставшейся части перечислены некоторые подробности об окне, включая положение. Команда
sed
соответствует и возвращает толькоx,y
значение позиции.Например, запустив команду сверху на моем 16-м виртуальном экране (из 4 на 4) с надписью «TODO»
gvim
на экране 1:*) Отказ от ответственности: я предпочитаю код @ t7ko. Много!
источник
--onlyvisible
это хорошо. Помог мне с похожим вопросом. Thunderbird может запускаться с 14 окнами, и только одно или два находятся на рабочем столе. Я понятия не имею, для чего другие. Кстати, только видимые средства могут отображаться, а не только сразу показываться на текущем рабочем столе.Краткий и элегантный ответ (который использует
wmctrl
):Полученный идентификатор окна указан в шестнадцатеричном формате, поэтому вам нужно преобразовать его в десятичное (используется
xdotool
):Тогда вы можете делать что угодно
xdotool
.источник
wmctrl
инструкция говорит, что-l
не печатает окно класса, только заголовок; поэтому ваш фрагмент кода не решает мою проблему "поиск по названию И классу".wmctrl -lx
действительно обеспечивает класс.