如何在 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 中重置提示时保持上一个命令的退出状态?的主要内容,如果未能解决你的问题,请参考以下文章

退出 zsh,但让正在运行的作业保持打开状态?

ZSH:提示扩展返回码大于

如何检查之前的 Zsh 提示符中是不是没有输入任何内容

如何更改 zsh 中提示的颜色(不同于普通文本)?

zsh 命令提示符 PROMPT

在 zsh 上找不到命令 [关闭]