Zsh提示符优化:避免命令失败后重复显示✘标识
解决Zsh提示符错误后回车重绘重复显示叉号的问题
我明白你遇到的困扰——每次执行错误命令后,回车重绘提示符时那个讨厌的✘会重复出现。这其实是因为Zsh的%?变量会一直保留上一条命令的退出状态,哪怕你只是回车刷新提示符,它依然会读取之前的错误状态,导致叉号反复显示。
这里有个可靠的解决方案,通过Zsh的preexec和precmd钩子函数来精准控制错误提示的显示时机:
# 标记是否是刚执行完新命令 NEW_COMMAND=0 # 命令执行前触发,标记为新命令 preexec() { NEW_COMMAND=1 } # 显示提示符前触发,根据状态设置错误提示 precmd() { local exit_code=$? # 只有新命令执行且退出码非0时,才显示叉号 if [ $NEW_COMMAND -eq 1 ] && [ $exit_code -ne 0 ]; then PROMPT_ERROR="✘\n" else PROMPT_ERROR="" fi # 重置标记,避免重绘时重复触发 NEW_COMMAND=0 # 组装最终提示符 PROMPT=$'${PROMPT_ERROR}\n› ' } # 初始化提示符 PROMPT=$'\n› '
原理说明:
preexec函数会在你输入命令并按下回车执行时触发,把NEW_COMMAND设为1,告诉系统“这是一条新执行的命令”。precmd函数会在每次显示提示符前运行,它会检查两个条件:是不是刚执行完新命令,以及命令是否执行失败。只有同时满足这两个条件时,才会添加✘提示;回车重绘时,因为没有执行新命令,NEW_COMMAND是0,就不会重复显示叉号了。
测试一下效果:
› echo Hello Hello › asjdfiasdf zsh: command not found: asjdfiasdf ✘ ›
现在回车重绘时,提示符只会显示› ,不会再重复出现✘了。
内容的提问来源于stack exchange,提问作者Marián Černý
相关产品推荐
相关产品推荐

