如何在 ZSH 中重置提示时保持上一个命令的退出状态?
Posted
技术标签:
【中文标题】如何在 ZSH 中重置提示时保持上一个命令的退出状态?【英文标题】:How can I maintain my last command’s exit-status while resetting my prompt in ZSH? 【发布时间】:2011-02-11 05:42:27 【问题描述】:我正在尝试制作一个 über-simple(单字符)提示符,以便为我提供尽可能多的信息。这是我目前拥有的(拥有很久了,不记得我在哪里找到了原版):
# RPS1="['%1v', '%2v', '%3v', '%4v', '%5v', '%6v', '%7v', '%8v', '%9v']" # debug
PS1=" %(?|%2F|%1F)%1(V|%1v|%(#|#|:))%(?|%2f|%1f) "
function zle-line-init
zle -K vicmd
zle -N zle-line-init
function zle-keymap-select
psvar[1]="$$KEYMAP/(main|viins)/>/vicmd/"
zle reset-prompt
psvar[1]=""
zle -N zle-keymap-select
这很简单;它在渲染时将提示初始化为命令模式,并在 vi 的“命令”模式下显示:
提示,在 vi 的“插入”模式下显示>
提示(通过更改psvar[1]
)。另外,如果你是root用户,:
会被替换成#
,并且字符的颜色代表最后一个命令的退出状态。
我的问题:
当键盘映射发生变化时(即,当我使用例如a
然后使用转义键切换“命令”和“插入”模式时,$?
退出状态被覆盖成功0
状态,从而导致提示显示为绿色而不是红色(即使上一个命令失败)。如何保存或设置提示,以便$PS1
的%(?|…|…)
部分正确显示退出发送到 shell 的最后一条命令的状态?
【问题讨论】:
【参考方案1】:我在zsh-users
邮件列表上收到了 Bart Schaefer 的以下答复。有效!
此问题已在 2010 年 7 月修复,因此最终您无需执行任何操作:
* users/15217: Src/Zle/zle_main.c: use top-level status when redrawing prompt.
同时,试试这个:
功能 zle-keymap-select 本地 Q=$? psvar[1]="$$KEYMAP/(main|viins)/>/vicmd/" (返回 $Q) zle 重置提示 psvar[1]=""
如果您的 zsh 足够新,可以使用匿名函数,您可以将子 shell
(return $Q)
替换为() return $Q
。
【讨论】:
【参考方案2】:function zle-keymap-select
local saved_exitcode=$?
psvar[1]="$$KEYMAP/(main|viins)/>/vicmd/"
zle reset-prompt
psvar[1]=""
return $saved_exitcode
【讨论】:
这是我尝试的第一件事! ;D 不过,它实际上并没有解决问题。钩子函数本身的返回值似乎无关紧要。【参考方案3】:oldexitcode=$?
∶
# do stuff...
∶
( exit $oldexitcode )
【讨论】:
查看我对 Phil P 的回答“以上”的评论。也不行。 )-:以上是关于如何在 ZSH 中重置提示时保持上一个命令的退出状态?的主要内容,如果未能解决你的问题,请参考以下文章