diff --git a/impure.zsh b/impure.zsh index 91fdd8d..94764cb 100644 --- a/impure.zsh +++ b/impure.zsh @@ -259,14 +259,14 @@ prompt_impure_instant_prompt_cleanup() { (( ${IMPURE_INSTANT_PROMPT_ACTIVE:-0} )) || return 0 typeset -g IMPURE_INSTANT_PROMPT_ACTIVE=0 if (( ${IMPURE_IP_FD_1:-0} )) && { true >&${IMPURE_IP_FD_1} } 2>/dev/null; then - exec 1>&${IMPURE_IP_FD_1} 2>&${IMPURE_IP_FD_2} \ - {IMPURE_IP_FD_1}>&- {IMPURE_IP_FD_2}>&- + exec 0<&${IMPURE_IP_FD_0} 1>&${IMPURE_IP_FD_1} 2>&${IMPURE_IP_FD_2} \ + {IMPURE_IP_FD_0}>&- {IMPURE_IP_FD_1}>&- {IMPURE_IP_FD_2}>&- fi if [[ -s "${IMPURE_IP_OUTPUT_FILE:-}" ]]; then cat "$IMPURE_IP_OUTPUT_FILE" 2>/dev/null fi rm -f "${IMPURE_IP_OUTPUT_FILE:-}" 2>/dev/null - unset IMPURE_IP_FD_1 IMPURE_IP_FD_2 IMPURE_IP_OUTPUT_FILE + unset IMPURE_IP_FD_0 IMPURE_IP_FD_1 IMPURE_IP_FD_2 IMPURE_IP_OUTPUT_FILE prompt_impure_reset_prompt } diff --git a/instant-prompt.zsh b/instant-prompt.zsh index a47ca47..38f11a8 100644 --- a/instant-prompt.zsh +++ b/instant-prompt.zsh @@ -28,12 +28,14 @@ typeset -g IMPURE_INSTANT_PROMPT_ACTIVE=1 # Redirect stdout/stderr during init to prevent output smearing over the prompt. + # Stdin goes to /dev/null so nothing reads from the terminal during init. # Uses sysopen (like p10k) for robust fd management. zmodload zsh/system 2>/dev/null || return typeset -g IMPURE_IP_OUTPUT_FILE="${TMPDIR:-/tmp}/impure-ip-output-$$" { : > "$IMPURE_IP_OUTPUT_FILE" } 2>/dev/null || return local fd_null sysopen -ru fd_null /dev/null 2>/dev/null || return - exec {IMPURE_IP_FD_1}>&1 {IMPURE_IP_FD_2}>&2 0<&$fd_null 1>"$IMPURE_IP_OUTPUT_FILE" + exec {IMPURE_IP_FD_0}<&0 {IMPURE_IP_FD_1}>&1 {IMPURE_IP_FD_2}>&2 \ + 0<&$fd_null 1>"$IMPURE_IP_OUTPUT_FILE" exec 2>&1 {fd_null}>&- }