Recarregue o zsh ao redimensionar a janela do terminador

Recarregue o zsh ao redimensionar a janela do terminador

Estou usando o terminator com zsh em combinação com o antígeno. O tema (uma versão modificada do af-magic) que estou usando recupera a largura atual da janela e imprime uma barra que consiste em =sinais para separar as 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%}"

Isso funciona muito bem, mas ao redimensionar a janela ela BARnão é atualizada e fica muito curta ou muito longa, ocupando várias linhas. Exemplo:

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

torna-se

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

Existe uma maneira de fazer com que o zsh ou o terminator recarreguem o tema ao redimensionar a janela?

Responder1

Quando o terminal é redimensionado, o shell recebe umSIGWINCHsinal. Então atualize BARem uma armadilha. No zsh você pode definir o correspondentefunção de armadilha:

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

Você não precisa ligar, tputpois o zsh rastreia o número de colunas do terminal noCOLUMNSvariável.

Certifique-se de ligar oprompt_substopção ( setopt prompt_subst) para que $PROMPTseja reavaliado cada vez que for exibido. Como alternativa, atualize PROMPTtambém TRAPWINCH.

Em vez de bifurcar para ligar printfde uma forma estranha, você pode usarexpansão de parâmetrospara obter uma string acolchoada. A expansão de parâmetros normalmente funciona a partir do valor de uma variável, mas permite trabalhar a partir de uma string, neste caso uma string vazia. Dessa forma, você não precisa de nenhuma armadilha.${:-STRING}

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

Responder2

Citaresta resposta:

Certifique-se de que oprompt_subst opçãoestá ativado. Se necessário, adicione a seguinte linha ao seu ~/.zshrc:

setopt prompt_subst

Isso diz ao zsh para reavaliar a string do prompt cada vez que estiver exibindo um prompt.

Responder3

Você precisa transformar $BAR em uma função:

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

informação relacionada