按耐不住,忙里偷闲,再发一篇,谈谈如何在linux下为chrome浏览器增加快捷键(老板键),用途呢,嗯,不多说,名字就足以说明问题了。
因为chrome本身并未提供此类功能,所以必然是需要借助第三方辅助,而在linux平台下,最简单的就是shell脚本了,在键盘快捷键中添加一段脚本就可解决问题。
在linux下,和窗口交互的命令行工具最典型就是xdotool,我们就是借助他的功能来完成,所以请提前安装
# ubuntu系列
apt install -y xdotool
# centos系列
dnf install -y xdotool
接下来,谈一下思路,如果只是想实现功能,那么可以略过这部份,直接跳转到最底下代码部分,复制粘贴即可
- 获取到chrome窗口的id。可通过xdotool search命令来完成,通过Alt+Tab键观察,我们能看到,chrome窗体名称的组成是“网页名称 - Google Chrome”,故只需让xdotool匹配“- Google Chrome”即可实现此功能
- 因为chrome存在多窗口场景,故上一步操作可能会获得多个窗口id,此时需要对每一个窗口均执行显隐操作
- 遍历窗口id,判断当前窗口是否可见。因为xdotool并未提供相关命令,所以我们考虑通过xdotool search --onlyvisible配合grep来完成,如果查询到了窗体id表示可见,否则为不可见
- 根据获得的信息,设置目标窗口可见性
思路有了,代码自然就容易了,脚本如下:
#!/bin/bash
# 获取标题中含有“- Google Chrome”的窗口
windows=$(xdotool search --name '\- Google Chrome' | sort -n)
# 遍历窗口
for window in ${windows[@]}; do
# 判断当前窗口是否可见,以此为依据完成乒乓操作
visible=$(xdotool search --onlyvisible --name '\- Google Chrome' | grep ${window})
if [[ -n "${visible}" ]]; then
# 最小化窗口
xdotool windowminimize ${window}
# 隐藏窗口
xdotool windowunmap --sync ${window}
else
# 显示窗口
xdotool windowmap ${window}
# 激活窗口
xdotool windowactivate --sync ${window}
fi
done
脚本有了,那么在系统中新增快捷键,定义快捷键及执行的命令即可了
对于我正在使用的ubuntu 22.10,操作步骤是:设置 -> 键盘 -> 键盘快捷键,查看及自定义快捷键 -> 自定义快捷键,如下图,其他系统大同小异
自定义快捷键.png
好的,一切貌似很顺利,但是实际操作中,如果chrome处于隐藏状态时再打开新的浏览器窗口,此时再按快捷键,我们会发现问题出来了,出现了窗体部分显示/部分隐藏的尴尬局面,那么如何解决呢,只能变更我们的逻辑:
- 窗体的显隐不再单纯由自身的显隐来确定,而是由所有窗体的状态来确定
- 只要存在1个显示的窗口,就将所有的窗口都隐藏
有了idea,再次变更脚本
#!/bin/bash
# 获取标题中含有“- Google Chrome”的窗口
windows=$(xdotool search --name '\- Google Chrome' | sort -n)
# 遍历窗口,寻找可见窗口,默认为0表示不存在可见窗口
has_visible_window=0
for window in ${windows[@]}; do
visible=$(xdotool search --onlyvisible --name '\- Google Chrome' | grep ${window})
if [[ -n "${visible}" ]]; then
has_visible_window=1
break
fi
done
for window in ${windows[@]}; do
if [[ ${has_visible_window} -eq 1 ]]; then
# 最小化窗口
xdotool windowminimize ${window}
# 隐藏窗口
xdotool windowunmap --sync ${window}
else
# 显示窗口
xdotool windowmap ${window}
# 激活窗口
xdotool windowactivate --sync ${window}
fi
done
世界终于完美了,但是,==,我还有需求,完美主义者问题总是很多的
问:我不想用脚本,想直接用命令来完成,怎么办?
答:可以将这些代码写成1行,然后用bash -c来调用,如下,灰常灰常长的一行代码,复制去吧。其基本规则就是:
- 干掉注释行
- 每行行尾添加一个分号
- do、then、else语句后面不加分号
bash -c "windows=$(xdotool search --name '\- Google Chrome' | sort -n); has_visible_window=0; for window in ${windows[@]}; do visible=$(xdotool search --onlyvisible --name '\- Google Chrome' | grep ${window}); if [[ -n "${visible}" ]]; then has_visible_window=1; break; fi; done; for window in ${windows[@]}; do if [[ ${has_visible_window} -eq 1 ]]; then xdotool windowminimize ${window}; xdotool windowunmap --sync ${window}; else xdotool windowmap ${window}; xdotool windowactivate --sync ${window}; fi; done"
老苍子,书写于2023年4月11日