xdotool 是一个在 X Window 系统中模拟鼠标和键盘输入的命令行工具。它可以通过命令行来模拟用户的鼠标点击、键盘输入等操作,用于自动化、脚本编写和其他一些用途。
sudo apt install xdotool
我用 xdotool 的目的是想在多个应用之间快速切换,比如 现在打开了5个应用:idea、vscode、securecrt、chrome、wechat 这个5应用,此时下我可以按 alt + tab 在这些应用之间快速切换,其实在我看来这并不快,因为有可能我要按多次才能到达指定应用。
现在我的需求是这样的 只按一次就到达指定应用,比如 Alt+Q 直接跳转 chrome,解决办法在不同的系统有点不同,Windows上可以使用 Autohotkey,在mac上可以使用 Keyboard Maestro,但是在 Linux 上,没有太好的应用给你使用,你需要自己来实现。
比如在 linux mint 下切换文件管理器的脚本如下,我执行在定义 Alt+Q 快捷键来执行该脚本即可快速打开、切换到文件管理器。
$ cat /opt/pro/xdotools/nemo.sh
#!/bin/bash
classname="Nemo"
startpath="nemo"
windowidcount=$(xdotool search --all --onlyvisible --classname "$classname" | wc -l)
if [ "$windowidcount" -eq 1 ];then
windowid=""
else
windowid=$(xdotool search --all --onlyvisible --classname "$classname" | awk BEGIN'{max=0} {if($1>max)max=$1} END{print max}')
fi
if [ "$windowid" == "" ];then
nohup $startpath 1>/dev/null 2>&1 &
else
activewindowid=$(xdotool getactivewindow)
if [ "$windowid" == "$activewindowid" ];then
xdotool windowminimize "$activewindowid"
else
xdotool windowactivate $windowid
fi
fi
切换 Chrome 浏览器的脚本示例
$ cat /opt/pro/xdotools/google-chrome.sh
#!/bin/bash
classname="google-chrome"
startpath="google-chrome"
windowid=$(xdotool search --all --onlyvisible --classname "$classname")
if [ "$windowid" == "" ];then
nohup $startpath 1>/dev/null 2>&1 &
else
activewindowid=$(xdotool getactivewindow)
if [ "$windowid" == "$activewindowid" ];then
xdotool windowminimize "$activewindowid"
else
xdotool windowactivate $windowid
fi
fi
其实 wmctrl
也可以实现类似的功能,wmctrl
是一个用于控制和管理窗口(窗口管理器)的命令行工具。它允许你通过命令行来查看和控制当前打开的窗口,切换窗口,调整窗口大小和位置,以及执行其他窗口管理操作。
# 列出所有打开的窗口
wmctrl -l
# 切换到指定的窗口
wmctrl -a "窗口标题"
# 激活指定的窗口
wmctrl -R "窗口标题"
我们也可以编写 Python 脚本来实现 ,Python 脚本如下:
import subprocess
target_class = 'google-chrome.Google-chrome'
start_command = 'google-chrome'
output = system.exec_command('wmctrl -lx', getOutput=True)
if target_class in output:
win_class = window.get_active_class()
if win_class == target_class:
subprocess.Popen('xdotool windowminimize $(xdotool getactivewindow)', shell=True)
else:
window.activate(target_class, switchDesktop=True, matchClass=True)
else:
subprocess.Popen(start_command, shell=True)