关于zsh:MacOS-下-zsh-执行长时间命令完成后自动提醒

57次阅读

共计 1366 个字符,预计需要花费 4 分钟才能阅读完成。

前言

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

正文完
 0