Como posso manter o meu último comando de saída do estado, enquanto a reposição de minha linha de comandos no ZSH?

StackOverflow https://stackoverflow.com/questions/4965994

  •  12-11-2019
  •  | 
  •  

Pergunta

Eu estou tentando fazer um über-simples (um único caractere) solicitar que me dá o máximo de informação possível.Aqui está o que eu tenho no momento (tinha que por as idades, não consegue se lembrar onde eu encontrei o original):

# 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

Isto é relativamente simples;ele inicializa a linha de comandos em modo de comando na renderização, e apresenta um : linha de comandos quando a vi do "comando", e um modo > prompt (alterando psvar[1]) quando vi "inserir" modo.Além disso, o : é substituído com # se você está agindo como root, e a cor do personagem exibe o status de saída do último comando.

Meu problema:

Quando o keymap alterações (isto é, quando eu alternância através do "comando" e "inserir" modos de usar, como exemplo, a e, em seguida, a tecla escape, o $? sair do estado é overtrodden com sucesso 0 estado, fazendo com que o prompt para exibir em verde, em vez de vermelho (mesmo que o comando anterior falhou).Como posso salvar ou definir o prompt de tal forma que a %(?|…|…) partes $PS1 irá apresentar correctamente o estado de saída do último comando enviado para o shell?

Foi útil?

Solução

Eu recebi a seguinte resposta do Bart Schaefer no zsh-users lista de discussão.Ele funciona!

Isso foi corrigido em julho de 2010, de modo a, eventualmente, você não precisará fazer qualquer coisa:

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

Entretanto, tente este:

função zle-keymap select { local Q=$?psvar[1]="${${KEYMAP/(principal|viins)/>}/vicmd/}" (retorno $Q) zle reset-comandos psvar[1]="" }

Se o seu zsh é recente o suficiente para ter funções anônimas, você pode substituir o sub-shell (return $Q) com (){ return $Q }.

Outras dicas

function zle-keymap-select {
  local saved_exitcode=$?
  psvar[1]="${${KEYMAP/(main|viins)/>}/vicmd/}"
  zle reset-prompt
  psvar[1]=""
  return $saved_exitcode
}
oldexitcode=$?
∶
# do stuff...
∶
( exit $oldexitcode )
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top