Como posso manter o meu último comando de saída do estado, enquanto a reposição de minha linha de comandos no ZSH?
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?
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 )