将窗口绑定到快捷键的linux桌面脚本

编辑于2022-03-30

提前安装好xdotool、wmctrl

sudo pacman -S xdotool wmctrl  # archlinux系
sudo apt install xdotool wmctrl  # debian系
...

配置脚本文件

新建一个bind_shortcut.sh,内容如下

#!/bin/bash
focus=`xdotool getwindowfocus`
result=`xdotool getwindowname $focus|grep -i $1`
if [[ "$result" == "" ]]
then
echo `xdotool getwindowfocus` > /tmp/bindkey_$1.tmp
wmctrl -a $1||$1
else
xdotool windowactivate `cat /tmp/bindkey_$1.tmp`
fi

大体思路是,通过xdotool和wmctrl配合,检查前台窗口名称是否包含指定程序名称,如:obsidian

运行方法为 bash bind_shortcut.sh obsidian

  • 如果前台程序不是obsidian,
    • 将当前窗口id保存到/tmp/bindkey_obsidian.tmp
    • 使用wmctrl -a 将窗口提前
    • 提前失败说明不存在本窗口,则运行该程序
  • 如果前台程序为obsidian(说明此时的意图是隐藏obsidian)
    • 读取/tmp/bindkey_obsidian.tmp内容,然后用xdotool激活该窗口

进入系统快捷键配置

将快捷键与对应命令绑定
比如我的快捷键

bash bind_shortcut.sh obsidian  # 绑定在F1
bash bind_shortcut.sh zotero    # 绑定在alt+z
bash bind_shortcut.sh netease-music # 绑定在鼠标手势