0

我正在尝试制作一个 ü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 的最后一个命令的退出状态?

4

3 回答 3

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/}" (return $Q) zle reset-prompt psvar[1]="" }

如果您的 zsh 足够新,可以使用匿名函数,则可以将子 shell 替换(return $Q)(){ return $Q }.

于 2011-02-11T16:45:20.710 回答
0
function zle-keymap-select {
  local saved_exitcode=$?
  psvar[1]="${${KEYMAP/(main|viins)/>}/vicmd/}"
  zle reset-prompt
  psvar[1]=""
  return $saved_exitcode
}
于 2011-02-11T06:34:43.007 回答
0
oldexitcode=$?
∶
# do stuff...
∶
( exit $oldexitcode )
于 2011-02-11T11:21:37.153 回答