¿Cómo puedo mantener mi último comando de salida-estado, mientras que restablecer mi petición en ZSH?

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

  •  12-11-2019
  •  | 
  •  

Pregunta

Estoy tratando de hacer un über-simple (un solo carácter) mensaje que me da tanta información como sea posible.He aquí lo que tengo en este momento (tenido por edades, no puede recordar donde he encontrado el 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

Esto es bastante simple;inicializa el símbolo del sistema en modo de comando en la representación, y muestra una : preguntar cuando en la vi del "comando", y un > prompt (por el cambio de psvar[1]) cuando vi la de "insertar" de modo.Además, el : se sustituye con # si usted está actuando como root, y el color del personaje exhibe el estado de salida del último comando.

Mi problema:

Cuando el mapa de teclado cambios (es decir, cuando me alternar a través de la "comando" y "insertar" modos de uso, como ejemplo, a y, a continuación, la tecla de escape, el $? la salida de estado es overtrodden con un éxito 0 estado, lo que provoca el mensaje que se muestra en verde en lugar de rojo (incluso si el comando anterior no se pudo).¿Cómo puedo guardar o establecer el mensaje de que la %(?|…|…) partes de $PS1 mostrará correctamente el estado de salida de la último comando enviado a la shell?

¿Fue útil?

Solución

Recibí la siguiente respuesta de Bart Schaefer en la zsh-users lista de correo.Funciona!

Esto fue corregido en julio de 2010, por lo que finalmente usted no tiene que hacer nada:

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

Mientras tanto, intente esto:

función zle-mapa-seleccione { local P=$?psvar[1]="${${mapa de TECLADO/(principal|viins)/>}/vicmd/}" (return $Q) zle reset del indicador de psvar[1]="" }

Si su zsh es lo suficientemente reciente para tener funciones anónimas, usted puede reemplazar la subshell (return $Q) con (){ return $Q }.

Otros consejos

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top