写在前面
其实这个问题本来一个月前就打算解决来着, 没想到居然拖到了现在 (懒癌晚期啊)。
缘由
虽然说 Linux 作为桌面系统时, 软件相对于 Windows 和 MacOS 少了很多。
但是在这少数的软件中, 重复造轮子的还是不要太多。
截图工具也是如此, 在试过众多的截图工具后, 喜欢上了 FlameShot。
截图后有临时编辑功能,不仅轻量还很好看呢。
不过用了几次后, 发现它有一个逼死强迫症的问题:
每次截图后 FlameShot 不会自己退出。
截图并不一个常用的功能,每次截图后,
还占着一个托盘位置看着实在碍眼
(所以 GNOME 就把托盘功能砍了?)。
具体实现
本来打算根据程序退出后的状态码来判断是否截图成功 (如果取消了截图就立即 Kill 掉, 如果截图成功就等待图像编辑完成后再 Kill)。
结果发现这货居然不管什么情况都返回的是 0。
逛了一圈 Issues, 发现这个问题其实在一个 PR 中已经修复了 — Exit non-zero when aborting with –raw。
不过不知为啥会无效, 好在因为这个 PR 意外的发现 –raw 参数有妙用。
代码
然后写了个 Shell 以不太优雅的方式解决了这个问题 (点击 此处 下载脚本)。
#!/bin/bash
# @Author: 文正•喵
# @E-Mail: ivlioioilvi@outlook.com
#
# 自定义 FlameShot 行为
#
# 截取整个桌面
entire_Desktop() {
# 开始截图
flameshot full --raw --path "$HOME/Pictures/"
# 等待 2 秒
sleep 2s
# 结束 FlameShot
killall flameshot
}
# 手动截图
manual_Capture() {
# 开始截图
flameshot gui --raw --path "$HOME/Pictures/"
# 等待 2 秒
sleep 2s
# 结束 FlameShot
killall flameshot
}
# 帮助页
manual_Page() {
echo -e "
Usage: _flameshot [options] [arguments]
Options:
-h, --help Displays this help
-v, --version Displays version information
Arguments:
full Capture the entire desktop.
select Start a manual capture in GUI mode.
"
}
# 版本信息
show_Version() {
echo -e "
_flameshot v_0.0.1
It is written in the scripting language Bash.
"
}
# 参数判断
case "$1" in
"-h")
manual_Page
;;
"--help")
manual_Page
;;
"-v")
show_Version
;;
"--version")
show_Version
;;
"full")
entire_Desktop
;;
"select")
manual_Capture
;;
*)
echo -e "
No options/arguments were used or the wrong options/arguments were used.
Use the -h/-help option for detailed help.
"
;;
esac
释疑
截图后为何要等待 2 秒
是为了让 FlameShot 在截图后有时间写入文件到磁盘 (2 秒已足够)。
为何要加 –raw 参数
至于为何我也不是很清楚,不靠谱的猜测一下。
如果不加 –raw 参数, 脚本的第 10 / 20 行中的动作几乎是一瞬间就执行完成, 然后再继续执行下面的语句 (尽管 FlameShot 还在后台运行)。
这样的话就不能再使用编辑截图的功能了,因为只有 2 秒的时间来编辑 (2 秒后 FlameShot 会被 Kill 掉)。
而加了这个参数,FlameShot 就会一直处于前台,直到截图完成或者取消截图 (截图完成就输出原始的 PNG,如果中途取消截图,就输出 screenshot aborted)。
拓展阅读
鱼和熊掌不可兼得
如果要让 FlameShot 截图后就被 Kill 掉, 那么就不能使用 截图后复制到剪切版 这个功能了。
这是 X
的 剪切板 机制所决定的。
键盘流
有时候我们想要抓住游戏中精彩的一瞬间, 电影中搞笑的那一刻。
如果这时还要在程序菜单中慢慢找到截图程序, 再打开截图,就太慢了。
机会总是转瞬即逝的。
所以这时候使用快捷键就很方便了, 比如我的做法是:
将上述的脚本以 _flameshot
名称保存到 PATH
中,
然后在 i3wm
的配置文件中分配不同的快捷来键执行此脚本。
bindsym $mod+m mode "+Multimedia"
mode "+Multimedia" {
bindsym f exec --no-startup-id _flameshot full ,mode "default"
bindsym Shift+f exec --no-startup-id _flameshot select ,mode "default"
bindsym Escape mode "default"
bindsym Return mode "default"
bindsym $mod+m mode "default"
}
按下 Win + M 键后,再按下 F 键可进行全屏截图。
按下 Win + M 键后,再按下 Shift + F 键可手动选择区域进行截图。
可还行?
用了几次,感觉效果还行。