zshでプロンプトに現在時刻を表示&更新

zshのプロンプトにだいたいの現在時刻(30秒ごとに自動で更新される)を表示しておく方法です。
コマンドを実行した時刻が残るので、コンソールを見返す際に便利だったりします。

設定例

PROMPT="%F{green}[%m-%T]%f%# "
RPROMPT="%(?..%F{red}-%?-)%F{green}[%1(v|%F{yellow}%1v%F{green} |)%n:%~]%f"
# 時刻更新                                                                                          
TRAPALRM () { zle reset-prompt }
TMOUT=30

上記PROMPT、RPROMPTは私が使っているもの。%T(現在時刻)が入っていれば何でも良いです。

TRAPALRM は、ALRMシグナルのハンドラです。プロンプトを更新させます。

TMOUT=30 は、プロンプトが表示されっぱなしの状態だった場合、30秒毎にzshにALRMシグナルを発生させるという指定です。自動ログアウトに使われたりもしますが、これを利用して時刻更新の契機にしています。


参考: http://linux.die.net/man/1/zshparam

2014/1/7追記

上記だと、30秒に一度しか時刻が更新されないのであまり正確ではありません。

以下は、precmd_functions(プロンプト表示前に実行されるフック)を使って、zsh/datetimeモジュールで得た時刻から更新までのTMOUTを再計算することで、秒単位で正確な時刻を表示するように改良したバージョンです。

zmodload zsh/datetime # $EPOCHSECONDS, strftime等を利用可能に
reset_tmout() { TMOUT=$[60-EPOCHSECONDS%60] }
precmd_functions=($precmd_functions reset_tmout) # プロンプト表示時に更新までの時間を再計算
redraw_tmout() { zle reset-prompt; reset_tmout } # 時刻を更新
TRAPALRM() { redraw_tmout }

なおprecmdが定義されていると動作しないので、その場合はprecmd_functionsに置き換えてください。