You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用wmutils与Shell脚本聚焦当前窗口左右上下的最近窗口

用wmutils实现聚焦当前窗口左右最近窗口

需求背景

通过wmutils与Shell脚本实现聚焦当前窗口左侧/右侧最近的窗口,核心逻辑是计算其他窗口与当前窗口的x偏移差,筛选对应方向上距离最近的窗口。

现有基础代码

先获取当前窗口ID、排除当前窗口的其他窗口列表,以及当前窗口的x偏移量:

cur=$(pfw)
# 排除当前窗口,获取其他所有窗口ID
other_wins=$(lsw | grep -v "$cur")
curoff=$(wattr x "$cur")

遍历其他窗口,输出窗口ID和对应的x偏移量:

for win in $other_wins; do
    wattr ix "$win"
done

输出格式示例:

0x00c00005 152
0x01000015 0
0x01800001 2
0x01a00005 67

计算每个窗口与当前窗口的x偏移差:

for win in $other_wins; do
    wattr ix "$win"
done | awk -v curoff="$curoff" '{ dis = $2 - curoff; print $1, dis }'

输出示例(负数值为左侧窗口,正数值为右侧窗口):

0x01000015 -166
0x01600005 514
0x01800001 -164

解决方案:筛选左右最近窗口

1. 聚焦左侧最近窗口

通过awk筛选最大的负偏移差(最接近0的负数),对应左侧最近的窗口:

cur=$(pfw)
curoff=$(wattr x "$cur")
lsw | grep -v "$cur" | while read win; do
    wattr ix "$win"
done | awk -v curoff="$curoff" '
{
    dis = $2 - curoff
    # 只处理左侧窗口(偏移差为负)
    if (dis < 0) {
        # 首次赋值或找到更接近0的负数时更新
        if (dis > left_max || left_max == "") {
            left_max = dis
            left_win = $1
        }
    }
}
END {
    # 如果找到左侧窗口,输出ID并聚焦
    if (left_win != "") {
        echo "左侧最近窗口:$left_win"
        wtp "$left_win" # 使用wmutils的wtp命令聚焦窗口
    } else {
        echo "无左侧窗口"
    }
}'

2. 聚焦右侧最近窗口

通过awk筛选最小的正偏移差(最接近0的正数),对应右侧最近的窗口:

cur=$(pfw)
curoff=$(wattr x "$cur")
lsw | grep -v "$cur" | while read win; do
    wattr ix "$win"
done | awk -v curoff="$curoff" '
{
    dis = $2 - curoff
    # 只处理右侧窗口(偏移差为正)
    if (dis > 0) {
        # 首次赋值或找到更接近0的正数时更新
        if (dis < right_min || right_min == "") {
            right_min = dis
            right_win = $1
        }
    }
}
END {
    # 如果找到右侧窗口,输出ID并聚焦
    if (right_win != "") {
        echo "右侧最近窗口:$right_win"
        wtp "$right_win"
    } else {
        echo "无右侧窗口"
    }
}'

3. 整合为可指定方向的脚本

将逻辑整合为单一脚本(比如命名为focus-neighbor),通过参数指定方向:

#!/bin/bash

if [ $# -ne 1 ]; then
    echo "用法:$0 [left|right]"
    exit 1
fi

cur=$(pfw)
curoff=$(wattr x "$cur")

lsw | grep -v "$cur" | while read win; do
    wattr ix "$win"
done | awk -v dir="$1" -v curoff="$curoff" '
{
    dis = $2 - curoff
    if (dir == "left" && dis < 0) {
        if (dis > left_max || left_max == "") {
            left_max = dis
            target_win = $1
        }
    } else if (dir == "right" && dis > 0) {
        if (dis < right_min || right_min == "") {
            right_min = dis
            target_win = $1
        }
    }
}
END {
    if (target_win != "") {
        wtp "$target_win"
    } else {
        printf "无%s侧窗口\n", dir
    }
}'

给脚本添加执行权限后,可通过./focus-neighbor left或./focus-neighbor right快速聚焦对应方向的最近窗口。

上下方向拓展逻辑

上下方向实现逻辑完全一致,只需将wattr x替换为wattr y(获取窗口顶部的y偏移量),再在awk中处理y方向的偏移差即可。

内容的提问来源于stack exchange,提问作者fr3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:13:20