t7k*_*7ko 14 xorg x11 window-management xdotool
xdotool 允许您使用其搜索子命令搜索窗口。我需要找到一个窗口,该窗口的类为“gvim”,标题包含“TODO”一词。我该怎么做呢?
我试过的:
xdotool search --name --class,但它只接受名称和标题的一种模式。D.S*_*D.S 19
我的 xdotool 帮助通知我您的两个开关是相同的(xdotool 版本 3.20150503.1),
--name check regexp_pattern agains the window name
--title DEPRECATED. Same as --name.
Run Code Online (Sandbox Code Playgroud)
并且因此不做任何事情。我的 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
Run Code Online (Sandbox Code Playgroud)
if 语句中的星号是为了对 进行子字符串匹配TODO,以便它可以出现在标题中的任何位置。
我能够确定简短的 Unix 方式解决方案:
comm -12 \
<(xdotool search --name 'title-pattern' | sort) \
<(xdotool search --class 'class-pattern' | sort)
Run Code Online (Sandbox Code Playgroud)
这是另一个遵循 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'
Run Code Online (Sandbox Code Playgroud)
但请耐心等待!有一些隐藏的美丽。
简而言之,它
(这些点是否是优势取决于上下文 - 让我们忽略这方面*。)
我将在下面更结构化的布局中显示相同的代码,以便逐步理解。
但请注意缩进是为了解释命令——它并不表示嵌套左右,一切仍然是一个线性的 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'
Run Code Online (Sandbox Code Playgroud)
完整的命令,如上所示,给出了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'
Run Code Online (Sandbox Code Playgroud)
现在,它开始可读:
xdotool \
search --onlyvisible --class 'gvim' \
getwindowpid %@ |
xargs -I{} \
xdotool search --all --pid {} --name 'TODO'
Run Code Online (Sandbox Code Playgroud)
该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'
Run Code Online (Sandbox Code Playgroud)
其余部分列出了有关窗口的一些详细信息,包括位置。该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
Run Code Online (Sandbox Code Playgroud)
*) 免责声明:我更喜欢@t7ko 的代码。很多!