Как мне сохранить состояние выхода моей последней команды при сбросе приглашения в ZSH? - PullRequest
0 голосов
/ 11 февраля 2011

Я пытаюсь сделать очень простой (односимвольный) запрос, который дает мне как можно больше информации. Вот что у меня есть на данный момент (было целую вечность, не помню, где я нашел оригинал):

# 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 и приглашение > (путем изменения psvar[1]) в режиме «вставки» vi. Кроме того, : заменяется на #, если вы выступаете в роли пользователя root, а цвет символа показывает состояние выхода последней команды.

Моя проблема:

При изменении раскладки клавиатуры (то есть, когда я переключаюсь в режимах «команда» и «вставка», используя, например, a, а затем клавишу Escape, состояние выхода $? перекрывается успешное состояние 0, в результате чего приглашение отображается зеленым, а не красным (даже если предыдущая команда не выполнена). Как сохранить или настроить приглашение таким образом, чтобы части %(?|…|…) $PS1 правильно отображали выход статус последней команды, отправленной в оболочку ?

Ответы [ 3 ]

1 голос
/ 11 февраля 2011

Я получил следующий ответ от Барта Шефера в списке рассылки zsh-users.Это работает!

Это было исправлено в июле 2010 года, поэтому в конечном итоге вам не нужно ничего делать:

   * users/15217: Src/Zle/zle_main.c: use top-level status when redrawing prompt.

А пока попробуйте это:

функция zle-keymap-select {local Q = $?psvar [1] = "$ {$ {KEYMAP / (main | viins) />} / vicmd /}" (вернуть $ Q) zle-приглашение для сброса psvar [1] = ""}

Если вашzsh достаточно недавний, чтобы иметь анонимные функции, вы можете заменить подоболочку (return $Q) на (){ return $Q }.

0 голосов
/ 11 февраля 2011
oldexitcode=$?
∶
# do stuff...
∶
( exit $oldexitcode )
0 голосов
/ 11 февраля 2011
function zle-keymap-select {
  local saved_exitcode=$?
  psvar[1]="${${KEYMAP/(main|viins)/>}/vicmd/}"
  zle reset-prompt
  psvar[1]=""
  return $saved_exitcode
}
...