zshの右プロンプトにコマンド開始終了時刻を表示

コマンドの開始時刻と終了時刻を右プロンプトに表示したくなった。

$                    15:00:00 -           # 15時00分00秒に sleep 30 を入力開始
$ sleep 30           15:00:00 -           # 10秒掛けて sleep 30 と打ち込んだ
$ sleep 30           15:00:00 - 15:00:10  # 15時00分10秒にエンターキー押した

# 30秒経過

$                    15:00:40 -           # 15時00分40秒にコマンド終了

これを実現するには、以下のコードを ~/.zshrc に書き込めば実現できる。だいぶ試行錯誤した。

export PREV_COMMAND_END_TIME
export NEXT_COMMAND_BGN_TIME

function show_command_end_time() {
  PREV_COMMAND_END_TIME=`date "+%H:%M:%S"`
  RPROMPT="${PREV_COMMAND_END_TIME} -         "
}
autoload -Uz add-zsh-hook
add-zsh-hook precmd show_command_end_time

show_command_begin_time() {
  NEXT_COMMAND_BGN_TIME=`date "+%H:%M:%S"`
  RPROMPT="${PREV_COMMAND_END_TIME} - ${NEXT_COMMAND_BGN_TIME}"
  zle .accept-line
  zle .reset-prompt
}
zle -N accept-line show_command_begin_time

ググったら似たような設定してる人が国内外に散見されるのだが、 開始時刻と終了時刻の両方をUPDATEしている例が見つからなかった。 わりと便利だと思う。使うといいよ~