Перезагрузить zsh при изменении размера окна терминатора

Перезагрузить zsh при изменении размера окна терминатора

Я использую терминатор с zsh в сочетании с антигеном. Тема (модифицированная версия af-magic), которую я использую, извлекает текущую ширину окна и выводит полосу, состоящую из =знаков для разделения входов.

# 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%}"

Это работает довольно хорошо, но при изменении размера окна BARне обновляется и поэтому оно либо слишком короткое, либо слишком длинное, занимая несколько строк. Пример:

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

становится

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

Есть ли способ заставить zsh или terminator перезагружать тему при изменении размера окна?

решение1

При изменении размера терминала оболочка получаетСИГВИНЧсигнал. Так что обновление BARв ловушке. В zsh вы можете определить соответствующийфункция ловушки:

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

Вам не нужно вызывать, tputтак как zsh отслеживает количество столбцов терминала вCOLUMNSпеременная.

Обязательно включитеprompt_substoption ( setopt prompt_subst), чтобы он $PROMPTпереоценивался каждый раз, когда отображается. В качестве альтернативы, также обновите PROMPTв .TRAPWINCH

Вместо того, чтобы разветвляться для вызова printfстранным образом, вы можете использоватьрасширение параметрадля получения заполненной строки. Расширение параметров обычно работает со значением переменной, но позволяет работать со строкой, в данном случае с пустой строкой. Таким образом, вам вообще не нужна ловушка.${:-STRING}

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

решение2

Цитироватьэтот ответ:

Убедитесь, чтоprompt_subst вариантвключен. При необходимости добавьте следующую строку в ваш ~/.zshrc:

setopt prompt_subst

Это сообщает zsh о необходимости переоценки строки приглашения каждый раз, когда оно отображается..

решение3

Вам нужно превратить $BAR в функцию:

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

Связанный контент