写在前面

其实这个问题本来一个月前就打算解决来着, 没想到居然拖到了现在 (懒癌晚期啊)。

缘由

虽然说 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 键可手动选择区域进行截图。

可还行?

用了几次,感觉效果还行。