From 7e488d605fa736d2353c1c5e1f57ecf241edbda2 Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Sat, 13 Jul 2013 12:57:11 +0200 Subject: [PATCH] zsh/rc: Restart automatically once ~/.zshrc changes. --- zsh/rc | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/zsh/rc b/zsh/rc index 096dfab..7f5b1b0 100644 --- a/zsh/rc +++ b/zsh/rc @@ -914,6 +914,63 @@ periodic() { } +# RESTART SETTINGS + +zmodload -F zsh/stat b:zstat + +# Remember startup time. Used to perform automatic restarts when ~/.zshrc is +# modified. +zshrc_startup_time=$EPOCHSECONDS + +# Automatically restart Zsh if ~/.zshrc was modified. +zshrc_restart_precmd() { + local stat + if ! zstat -A stat +mtime ~/.zshrc; then + return + fi + + # ~/.zshrc wasn't modified, nothing to do. + if [[ $stat -le $zshrc_startup_time ]]; then + return + fi + + local startup + strftime -s startup '%Y-%m-%d %H:%M:%S' "$zshrc_startup_time" + + echo -n "${fg[magenta]}" + echo -n "~/.zshrc modified since startup ($startup) ... " + echo -n "${fg[default]}" + + if [[ -n $zshrc_disable_restart ]]; then + echo 'automatic restart disabled.' + return + fi + + # Don't exec if we have background processes because execing will let us + # lose control over them. + if [[ ${#${(k)jobstates}} -ne 0 ]]; then + echo 'active background jobs!' + return + fi + + # Try to start a new interactive shell. If it fails, something is wrong. + # Don't kill our current session by execing it. + zsh -i -c 'exit 42' + if [[ $? -ne 42 ]]; then + echo -n "${fg_bold[red]}" + echo 'failed to start new zsh!' + echo -n "${fg_bold[default]}" + return + fi + + echo 'restarting zsh.' + echo + + exec zsh +} +precmd_functions+=(zshrc_restart_precmd) + + source_debug '. ~/.zsh/rc (done)' # vim: ft=zsh -- 2.45.2