每次执行命令时使 zsh 提示更新

Tyc*_*liz 1 zsh oh-my-zsh

TLDR;

我需要一种.zshrc在每次执行命令时自动获取源的方法。PROMPT每次执行命令时都需要更新,以便在提示中显示相关信息。

原因

我使用Watson cli来跟踪时间。在我之前的 bash 设置中,我在提示符 ( $PS1)前面加上了一个符号,指示计时器是否正在运行(红色/绿色)。我用 Oh My Zsh 模仿了这个功能,如下(在主题文件中):

WATSON_DIR="$HOME/Library/Application Support/watson"
watson_status() {
    local txtred="${fg_bold[red]}"
    local txtgrn="${fg_bold[green]}"
    local txtrst="${reset_color}"

    # Started
    local status_color="$txtgrn"

    # Stopped
    if [[ $(cat "$WATSON_DIR/state") == '{}' ]]; then
        status_color="$txtred"
    fi
    echo -e "$status_color""?""$txtrst"
}

PROMPT="??? %{$(watson_status) $fg_bold[green]%}%~%{$reset_color%}$(git_prompt_info) ? %{$FG[130]%}%*%{$reset_color%}
??? $ "
Run Code Online (Sandbox Code Playgroud)

当前的问题

该图标将指示 .zshrc 执行时状态的颜色。例如,如果计时器正在运行并且图标正确指示为绿色,则停止计时器不会导致图标变为红色。为了看到图标改变颜色,我必须获取 .zshrc。

这表示watson_status()每次执行命令时都需要运行该函数,以给出命令执行时的最新状态

zay*_*uan 5

我最近将一些提示代码从 bash 移植到 zsh - 在 OSX Big Sur 上 - 这对我来说是两个重要的“要知道的事情”:

  • 添加setopt PROMPT_SUBST到您的 .zshrc。这“允许在提示中使用功能”
  • 定义 PS1 / PROMPT 时使用单引号。如果使用双引号,则在终端启动时将评估整个字符串一次,然后每次命令更改时都会“重新执行”评估值。但是您希望重新评估函数,而不是创建终端时函数的输出。

我用来确认它工作的最简单的例子:

# print_epoch() { date '+%s' }

# this is what you want
# export PS1='$(print_epoch) > '

# this is not what you want
# export PS1="$(print_epoch) > "
Run Code Online (Sandbox Code Playgroud)

另外值得注意的是 PS1 和 PROMPT 是可以互换的

额外的:

虽然我们在这里分享的是我的用户、目录和 git 分支提示的相当少的回声,带有一些颜色和漂亮的叶子:

parse_git_branch() {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

setopt PROMPT_SUBST
autoload -U colors && colors
export PROMPT='%n %~ %F{blue}$(parse_git_branch)%f > '
Run Code Online (Sandbox Code Playgroud)

注意到:

  • %n打印名称
  • %~打印相对于 home 的目录
  • %F{blue}将文本更改为蓝色
  • %f重置颜色

文档:http: //zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Visual-effects