fish · environment

Fish: notify me when you finish

Sharing a simple Fish shell hack I built to help stay focused - it notifies me when long-running commands complete instead of getting distracted while waiting. The solution uses Fish's CMD_DURATION variable to detect lengthy commands and send notifications when they finish. While originally made for macOS, you can easily adapt it for other systems.


some random image you can find on barberry garden

Have you ever been in a situation when you called git fetch, stared at the screen for several seconds and then switched to the browser to read something 'useful' while git fetches updates? And in five minutes you're like 'Oh wait, I was doing something important, no?'. Rings the bell, doesn't it?

At some point in my life1, I decided to fix it. The idea is to send a notification whenever fish completes executing a long-running command. It is part of my configurations for a long time and I decided to share it more openly only now. Shame!

Fish already exposes variable CMD_DURATION which returns the duration of previous command execution in milliseconds. So it's easy to hack a solution that we can put into fish_prompt function.

function __d12_prompt__check_duration if test $CMD_DURATION if test $CMD_DURATION -ge $cmd_notification_threshold __d12_prompt__on_duration_exceeded $CMD_DURATION __d12_prompt__notify_completion $CMD_DURATION end end set CMD_DURATION 0 end function __d12_prompt__on_duration_exceeded -a duration set_color $fish_color_command echo -esn ' ~> duration: ' set_color $fish_color_param echo -es $duration ' ms' set_color normal end function __d12_prompt__notify_completion -a duration if command -v terminal-notifier > /dev/null echo -es 'Finished in ' $duration ' ms' | terminal-notifier end end

Just call __d12_prompt__check_duration at the very beginning2 of fish_promt. Then set the value of cmd_notification_threshold to the minimal amount of milliseconds before notification is sent. Good place for setting that value is config.fish.

Good luck, and don't procrastinate too much.

P. S. Current implementation of __d12_prompt__notify_completion targets macOS users. Make sure you modify it so it works well on your system as well.


Footnotes

  1. Just right after I realised that I have failed to master meditation techniques that would help me to stare into the terminal window until command execution completes without being distracted by other things.

  2. but after you cache the $status value.