其實這個問題本來一個月前就打算解決來著, 沒想到居然拖到了現在 (懶癌晚期啊)。

截圖工具比較喜歡 FlameShot, 截圖後有編輯功能,還算比較輕量也很好看呢。

不過用了幾次後, 發現它有一個逼死強迫症的問題:

每次截圖後 FlameShot 不會自己退出。

截圖並不一個常用的功能,每次截圖後, 還佔著一個托盤位置看著實在礙眼 (所以 GNOME 就把托盤功能砍了?)

分析

本來打算根據程序退出後的狀態碼來判斷是否截圖成功, 如果取消了截圖就立即 Kill 掉, 如果截圖成功就等待圖像編輯完成後再 Kill。

結果發現這貨居然不管什麼情況都返回的是 0。

逛了一圈 Issues, 發現這個問題在一個 PR 中已經修復了: Exit non-zero when aborting with –raw

不過不知為啥會無效, 好在因為這個 PR 意外的發現 --raw 參數有妙用。

Shell 實現

然後寫了個 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 鍵可手動選擇區域進行截圖。

可還行?

用了幾次,感覺效果還行。