前言
最近正在应用 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,但好在问题也不大
- 多个终端同时跑可能会有抵触,但目前还没有发现
- 最初留神给到终端必要的告诉权限