
Я использую терминатор с 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_subst
option ( 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)}`
}