xdotool:如何通过不同模式的标题和类搜索窗口(类似于AutoHotkey)

xdotool:如何通过不同模式的标题和类搜索窗口(类似于AutoHotkey)

xdotool 允许您使用其搜索子命令搜索窗口。我需要找到一个窗口,该窗口具有“gvim”类和包含单词“TODO”的标题。我该怎么做呢?

我尝试过的:

  • 你可以这样做xdotool search --name --class,但它只会接受名称和标题的模式。
  • xdotool 支持命令链接,但我找不到链接两个搜索调用的方法——第二个搜索调用只是覆盖第一个搜索调用。

答案1

我的 xdotool 帮助告诉我你的两个开关是相同的(xdotool 版本 3.20150503.1),

--name          check regexp_pattern agains the window name
--title         DEPRECATED. Same as --name.

因此没有做任何事情。我的 xdotool 与你的一样,替换了窗口堆栈,所以我用 shell 脚本完成了它。下面提供了执行您想要的操作的 shell 脚本:

pids=$(xdotool search --class "gvim")
for pid in $pids; do
    name=$(xdotool getwindowname $pid)
    if [[ $name == *"TODO"* ]]; then
        #Do what you want, $pid is your sought for PID,
        #matching both class gvim and TODO in title
    fi
done

if 语句中的星号是为了对 进行子字符串匹配TODO,以便它可以出现在标题中的任何位置。

答案2

我能够确定简短的 Unix 方式解决方案:

comm -12 \
  <(xdotool search --name  'title-pattern'  | sort) \
  <(xdotool search --class 'class-pattern'  | sort)

答案3

这是另一个遵循UNIX方式的解决方案!

乍一看,它没有你的那么漂亮,@t7ko:

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | uniq | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

但请耐心听我说!其中有一些隐藏的美。

简而言之,它

  1. 有一个线性结构,而不是树结构,就像一维而不是二维
  2. 使用更多众所周知的 shell 语法
  3. 实际上回答了你的问题:它位于窗户。

(这些点是否是优点取决于上下文 - 让我们忽略这方面*。)

我将在下面以更结构化的布局展示相同的代码,以便逐步更容易理解。
但请注意,缩进是为了解释命令 - 它并不表示嵌套等,仍然是线性 UNIX 管道。

相同的命令,只是在管道 ( |) 之后分割:(uniq省略)

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 窗口 ID - 也许这就是 OP 实际需要的全部内容,但不确定:

缩短的命令管道,每行一个单独的 shell 命令:

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 (进程标识符)。
对于每个PIDxargs运行另一个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 x 4)的顶部运行命令,并gvim在屏幕 1 上显示“TODO”:

$ xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | uniq | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
-7653,-4732

*)免责声明:我更喜欢@t7ko的代码。很多!

答案4

简短而优雅的答案(使用wmctrl):

result=$(wmctrl -l | grep 'TODO - gvim' | grep -Eo '0x[0-9a-f]+')

生成的窗口 ID 为十六进制,因此您需要将其转换为十进制(由 所使用xdotool):

printf "%d\n" $result

然后你就可以用 做任何事了xdotool

相关内容