Esto podría ser un poco marginal, pero recientemente me mudé a zsh y tengo problemas para personalizar el intérprete de comandos de mi shell.zsh no vuelve a calcular el intérprete de comandos de shell
Parte de mi .zshrc se ve así:
# keeping this simple right now by just printing the date, but imagine this function would look for something specific when moving to a new directory each time
function parse_special {
print $(date)
}
autoload -U colors && colors
PS1="%{$fg[green]%}%[email protected]%m %{$fg[blue]%}%c %{$fg[yellow]%}%{$(parse_special)%} %{$reset_color%}%# "
Cuando inicio terminal, todo se ve bien; mi petición de orden es lo que espero:
[email protected] ~ Wed Aug 8 22:56:22 PDT 2012 %
Pero cuando cd I a otro directorio, parece que mi función parse_special no se llama de nuevo para volver a calcular mi mensaje personalizado (nótese la fecha no está cambiando):
[email protected] ~ Wed Aug 8 22:56:22 PDT 2012 % cd .ssh
[email protected] .ssh Wed Aug 8 22:56:22 PDT 2012 % cd ../workspace
[email protected] workspace Wed Aug 8 22:56:22 PDT 2012 %
¿Hay alguna manera en que pueda decirle a zsh que recalcule el aviso cada vez que se lo muestre?
muchas gracias por cualquier sugerencia.
respuesta a cjhveal
Parece que PS1 no le gusta para ponerse por valores entre comillas sencillas. He intentado lo siguiente:
local tp1="%{$fg[green]%}%[email protected]%m%{$reset_color%}"
PS1="${tp1}"
print "PS1 set by tp1: ${PS1}"
local tp2='%{$fg[green]%}%[email protected]%m%{$reset_color%}'
PS1="${tp2}"
print "PS1 set by tp2: ${PS1}"
Y tengo esta salida
#inner stuff was green
PS1 set by tp1: %{%}%[email protected]%m%{%}
#everything was uncolored
PS1 set by tp2: %{$fg[green]%}%[email protected]%m%{$reset_color%}
También me gustaría añadir, en base a la sugerencia de cjhveal, esto es lo que literalmente intentado. Una vez más, las comillas simples parecen estar ensuciar las cosas
function parse_special {
print $(date)
}
autoload -U colors && colors
local prompt_user='%{$fg[green]%}%[email protected]%m%{$reset_color%}'
local prompt_root='%{$fg[red]%}%[email protected]%m%{$reset_color%}'
local prompt_dir='%{$fg[blue]%}%c%{$reset_color%}'
local prompt_special='%{$fg[yellow]%}%{$(parse_special)%}%{$reset_color%}'
PS1="${prompt_user} ${prompt_dir}${prompt_special}%# "
gracias por la respuesta. Siento que esta es la solución correcta, pero todavía debo estar haciendo algo mal (ver la edición que hice en mi publicación original). Parece que no puedo usar comillas simples aquí. También puede explicar por qué es importante el uso de comillas simples en su respuesta? ¿var = "$ (do_stuff)" se trata de manera diferente que var = '$ (do_stuff)'? –
Intenta eliminar el% {%} envuelto alrededor de la subcadena. No sé por qué, pero funciona para mí sin ellos. La diferencia entre comillas simples y dobles está en cómo la consola realiza la interpolación. var = "$ (do_stuff)" ejecuta inmediatamente la subshell e interpola el resultado una vez. Cuando utiliza comillas simples, esa subshell no se interpreta, y se mantiene como una constante literal hasta el momento en que se interpola en una cadena con comillas dobles. Luego se ejecuta. Básicamente, espera hasta que se renueve el indicador para ejecutar las subcapas. – cjhveal
@cjhveal '% {' '%}' encierre el texto que zsh debería considerar de ancho cero (normalmente secuencias que le dicen al terminal que haga algo con el siguiente texto, como cambiar su color). Si encierra un texto de ancho distinto de cero, seguirá mostrándolo, pero con varios errores (por ejemplo, cuando completa zsh le dice al terminal que quiere cursor en cierta posición y coloca texto allí). non-zero-width-text%} 'hará que esta posición sea incorrecta y obtendrá un texto que sobrescribe el prompt y se colorea en el color de prompt). – ZyX