调整终结器窗口大小时重新加载 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

当调整终端大小时,shell 会收到一个信号绞车信号。所以更新BAR就陷入了陷阱。在zsh中可以定义相应的陷阱功能

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

您不需要调用,tput因为 zsh 会跟踪终端中的列数COLUMNS多变的

确保打开prompt_subst选项 ( 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)}`
}

相关内容