Recarregar zsh ao redimensionar a janela do terminador

1

Estou usando o terminador com zsh em combinação com o antígeno. O tema (uma versão modificada de af-magic) que estou usando recupera a largura da janela atual e imprime uma barra que consiste em = sinais para separar 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, o BAR não é atualizado e, portanto, é muito curto ou muito longo, 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?

    
por herhuf 22.04.2017 / 13:56

3 respostas

2

Quando o terminal é redimensionado, o shell recebe um SIGWINCH BAR em uma armadilha. Em zsh, você pode definir a função de interceptação correspondente:

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

Você não precisa chamar tput , já que zsh rastreia o número de colunas do terminal no COLUMNS variable .

Certifique-se de ativar a opção prompt_subst ( setopt prompt_subst ) para que $PROMPT seja reavaliado sempre que for exibido. Como alternativa, atualize PROMPT em TRAPWINCH também.

Em vez de bifurcar para chamar printf de uma maneira estranha, você pode usar o parâmetro expansão para obter uma string acolchoada. A expansão de parâmetro normalmente funciona a partir do valor de uma variável, mas ${:-STRING} permite que você trabalhe a partir de uma string, neste caso, uma string vazia. Desta forma, você não precisa de uma armadilha.

setopt prompt_subst
PROMPT='$FG[237]${(l:$COLUMNS::=:):-}%{$reset_color%}
    
por 23.04.2017 / 01:55
1

Para citar responder :

Verifique se a opção prompt_subst está ativada. Se necessário, adicione a seguinte linha ao seu ~/.zshrc :

setopt prompt_subst

Isso diz ao zsh para reavaliar a string de prompt sempre que estiver exibindo um prompt .

    
por 22.04.2017 / 14:37
0

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

function bar {
    echo 'printf '=%.0s' {1..$(tput cols)}'
}
    
por 22.04.2017 / 15:08