締切りまでの時間をカウントダウンしてくれる zsh プロンプト 君


はじめに

学生や社会人の皆様は,

  • 20xx 年 x 月 x 日の xx 時 xx 分 までに締切りが
  • 締切り間近だけど,やる気が..

なんてこともあるはずです.

そんなときに,ターミナルのどこかに締切りまでの時間をカウントダウンしてくれる人がいれば,
少しはやる気がでるのでは無いでしょうか?

今回は,zle の機能を使用し,zsh ターミナルに 締切りまでの時間をカウントダウンしてくれるスクリプトを書きました.

実装

  • 基本, $DEADLINE を変更すれば,締切りまでをカウントダウンしてくれる
  • PROMPTの部分の $TIMEREMAIN にカウントダウンの日数が格納され,ターミナルに表示される
  • 締切り後は,その部分がジョブ数 %j に変わる
  • 締切りの 1,2,3,4,5 週間前には,表示の色が変わり,警告してくれる
    • 好きな日にち,好きな色に変えてお楽しみください
.zshTimeRemain
function getTimeRemain(){
  DEADLINE="2018/12/16 00:00:00" # 締切り日
  ALL=$(expr \( `date --date $DEADLINE +%s` - `date +%s` \)) # 合計秒数
  DAY=$(expr $ALL / 86400)
  HOR=$(expr $ALL % 86400 / 3600)
  MIN=$(expr $ALL % 86400 % 3600 / 60)
  SEC=$(expr $ALL % 86400 % 3600 % 60)
  # 残りの日数に応じて,色を変更
  if   [ $DAY -le  7 ]; then COLOR="%F{1}" # red
  elif [ $DAY -le 14 ]; then COLOR="%F{5}" # magenta
  elif [ $DAY -le 21 ]; then COLOR="%F{3}" # yellow
  elif [ $DAY -le 28 ]; then COLOR="%F{2}" # green
  elif [ $DAY -le 35 ]; then COLOR="%F{6}" # cyan
  elif [ $DAY -le 42 ]; then COLOR="%F{4}" # blue
  else                       COLOR="%F{7}" # white
  fi
  if [ $ALL -le 0 ]; then
      TIMEREMAIN="%j"
  else
      TIMEREMAIN=$COLOR$(printf "%d %.2d:%.2d:%.2d" $DAY $HOR $MIN $SEC)"%f"
  fi
}

setopt PROMPT_SUBST

PROMPT='%U%B$promptname%b [ %m : $TIMEREMAIN : %~ ] %u
'
getTimeRemain

TRAPALRM () {
  getTimeRemain
  zle reset-prompt
}
TMOUT=1 # 1s
.zshrc
if [ -f ~/.zshTimeRemain ]; then
  source ~/.zshTimeRemain
fi
結果
user_name [ host_name : 3 14:15:26 : ~ ] # 締切りまで 3日と 14時間 15分 26秒 

最後に

正直,普段は bash を使っているので, zsh について詳しく分からないため,

  • 正しい動作か
  • ターミナル処理への弊害の有無

については分かりません.

あと,bash でも同じことがしたいんですが,そんな機能が bash にあるのだろうか?
知ってる人がいたら教えてください.