前言
最近正在使用 Warp 作為常用的終端,有一些細節體驗做的真的很不錯,無論是命令提示還是補全都很厲害。其中有一個細節我認為對於我來説非常實用,就是長時間執行完成之後的命令提醒。
舉個例子🌰:當你在終端進行 make 編譯或者打包鏡像的時候,往往需要比較長的時間,而你一般不會一直等着它執行完成,而是執行完成之後就切到別的地方去工作(摸魚)了,然後你無法及時知道命令執行完成了,而只能是不是過來看下執行情況。
而在 warp 執行命令完成之後,就有這樣一個通知提醒,我就能時刻關注到命令什麼時候執行完成了。
當然,這必須依賴於你使用 warp,但我們常常在 IDE 下方的命令行中執行命令,而非單獨使用其他終端,因為切換窗口也比較麻煩。於是乎我就想,能否利用 zsh 來實現這個功能呢?
實現
vim ~/.zshrc
# 設置要匹配的字符串
string_to_match=("docker build" "go build" "echo linkinstar")
# 定義函數
function remind_me {
# 獲取上一個命令
previous_command=$(fc -lnr -1)
# 檢查上一個命令是否包含要匹配的字符串
for string in $string_to_match; do
if [[ $previous_command == *"$string"* ]]; then
osascript -e 'display notification "命令已執行完成" with title "命令提醒" sound name "Blow"'
fi
done
}
# 添加add-zsh-hook
add-zsh-hook precmd remind_me
source ~/.zshrc
echo linkinstar
其實原理非常簡單,就是通過 add-zsh-hook 的鈎子,在執行命令之之前(當前命令執行結束)判斷,上一個命令是否在我的匹配列表中,如果這個命令需要提示則使用 osascript 進行提示,其中通過 fc -lnr -1 獲取上一個執行的命令。
使用者只需要在 string_to_match 數組中添加你需要進行提醒的命令就可以了,因為通常我們不希望所以執行的命令都有一個提醒,而只需要包含特定功能的命令的進行提醒就可以了。比如:只要包含 go build 字符的編譯命令執行完成之後就進行提醒。
其中,通知提示的聲音可選項在 /System/Library/Sounds 目錄下的文件名稱,個人認為 Blow 還可以,其他聲音有點小。當然如果你不需要聲音提醒的話,去掉 sound name "Blow" 就可以了。
其他嘗試與問題
- 我嘗試過通過判斷上一個命令的執行時間比如超過 10 秒的命令就才進行提示,但實際使用效果並不好,有時候 9 秒的命令就很尷尬,所以還是認為指定具體命令效果更好
osascript還支持 alert,但效果一般,需要手動確認,還是通知更加合理,雖然通知有時候會被忽略,但開啓聲音之後我覺得就很不錯了- 你還可以嘗試將命令的內容放到通知的內容裏面,提示會更加友好,對於我來説現在的提示足夠了,所以我就沒做
- 目前有一個小 bug,就是當使用完成一個命令之後,如果重新打開一個命令行窗口,就會有一個提示,這是由於打開命令行窗口 zsh 也會觸發 add-zsh-hook,但好在問題也不大
- 多個終端同時跑可能會有衝突,但目前還沒有發現
- 最後注意給到終端必要的通知權限