Vuelva a cargar zsh al cambiar el tamaño de la ventana del terminador

Vuelva a cargar zsh al cambiar el tamaño de la ventana del terminador

Estoy usando terminator con zsh en combinación con antígeno. El tema (una versión modificada de af-magic) que estoy usando recupera el ancho de la ventana actual e imprime una barra que consta de =signos para separar las entradas.

# af-magic.zsh-theme
# Repo: https://github.com/andyfleming/oh-my-zsh
# Direct Link: https://github.com/andyfleming/oh-my-zsh/blob/master/themes/af-magic.zsh-theme

if [ $UID -eq 0 ]; then NCOLOR="red"; else NCOLOR="green"; fi
local return_code="%(?..%{$fg[red]%}%? ↵%{$reset_color%})"

# primary prompt

BAR=$(printf '=%.0s' {1..$(tput cols)})

PROMPT='$FG[237]$BAR%{$reset_color%}
$FG[032]%~\
$(git_prompt_info) \
$FG[105]%(!.#.»)%{$reset_color%} '
PROMPT2='%{$fg[red]%}\ %{$reset_color%}'
RPS1='${return_code}'


# color vars
eval my_gray='$FG[237]'
eval my_orange='$FG[214]'

# right prompt
if type "virtualenv_prompt_info" > /dev/null
then
    RPROMPT='$(virtualenv_prompt_info)$my_gray%n@%m%{$reset_color%}%'
else
    RPROMPT='$my_gray%n@%m%{$reset_color%}%'
fi

# git settings
ZSH_THEME_GIT_PROMPT_PREFIX="$FG[075](branch:"
ZSH_THEME_GIT_PROMPT_CLEAN=""
ZSH_THEME_GIT_PROMPT_DIRTY="$my_orange*%{$reset_color%}"
ZSH_THEME_GIT_PROMPT_SUFFIX="$FG[075])%{$reset_color%}"
# af-magic.zsh-theme
# Repo: https://github.com/andyfleming/oh-my-zsh
# Direct Link: https://github.com/andyfleming/oh-my-zsh/blob/master/themes/af-magic.zsh-theme

if [ $UID -eq 0 ]; then NCOLOR="red"; else NCOLOR="green"; fi
local return_code="%(?..%{$fg[red]%}%? ↵%{$reset_color%})"

# primary prompt

BAR=$(printf '=%.0s' {1..$(tput cols)})

PROMPT='$FG[237]$BAR%{$reset_color%}
$FG[032]%~\
$(git_prompt_info) \
$FG[105]%(!.#.»)%{$reset_color%} '
PROMPT2='%{$fg[red]%}\ %{$reset_color%}'
RPS1='${return_code}'


# color vars
eval my_gray='$FG[237]'
eval my_orange='$FG[214]'

# right prompt
if type "virtualenv_prompt_info" > /dev/null
then
    RPROMPT='$(virtualenv_prompt_info)$my_gray%n@%m%{$reset_color%}%'
else
    RPROMPT='$my_gray%n@%m%{$reset_color%}%'
fi

# git settings
ZSH_THEME_GIT_PROMPT_PREFIX="$FG[075](branch:"
ZSH_THEME_GIT_PROMPT_CLEAN=""
ZSH_THEME_GIT_PROMPT_DIRTY="$my_orange*%{$reset_color%}"
ZSH_THEME_GIT_PROMPT_SUFFIX="$FG[075])%{$reset_color%}"

Esto funciona bastante bien, pero al cambiar el tamaño de la ventana BARno se actualiza, por lo que es demasiado corta o demasiado larga y ocupa varias líneas. Ejemplo:

|==================================================================|
|~ »                                                               |

se convierte

|==================================================| 
|================                                  | <- window border
|~ »                                               |

¿Hay alguna manera de hacer que zsh o terminator recarguen el tema al cambiar el tamaño de la ventana?

Respuesta1

Cuando se cambia el tamaño del terminal, el shell recibe unCABRESTANTEseñal. Así que actualiza BARen una trampa. En zsh puedes definir el correspondientefunción de trampa:

TRAPWINCH () {
  BAR=$(printf '=%.0s' {1..$COLUMNS})
}

No es necesario llamar tputya que zsh rastrea el número de columnas de la terminal en elCOLUMNSvariable.

Asegúrese de encender elprompt_substopción ( setopt prompt_subst) para que $PROMPTse reevalúe cada vez que se muestre. Alternativamente, actualice PROMPTtambién TRAPWINCH.

En lugar de bifurcar para llamar printfde una manera extraña, puedes usarexpansión de parámetrospara conseguir una cuerda acolchada. La expansión de parámetros normalmente funciona a partir del valor de una variable, pero le permite trabajar a partir de una cadena, en este caso una cadena vacía. De esta manera no necesitas ninguna trampa.${:-STRING}

setopt prompt_subst
PROMPT='$FG[237]${(l:$COLUMNS::=:):-}%{$reset_color%}

Respuesta2

Citaresta respuesta:

Asegúrese de que elprompt_subst opciónestá prendido. Si es necesario, agregue la siguiente línea a su ~/.zshrc:

setopt prompt_subst

Esto le dice a zsh que reevalúe la cadena de mensaje cada vez que muestra un mensaje.

Respuesta3

Necesitas convertir $BAR en una función:

function bar {
    echo `printf '=%.0s' {1..$(tput cols)}`
}

información relacionada