【问题标题】:ZSH setopt PROMPT_SUBST not workingZSH setopt PROMPT_SUBST 不工作
【发布时间】:2016-09-25 17:33:46
【问题描述】:

我正在尝试自定义我的 zsh 提示,并希望在每次生成提示时使用 git 命令评估一个函数。我正在使用setopt PROMPT_SUBST,但它似乎不起作用。这是我的 zshrc:

setopt PROMPT_SUBST
autoload -U colors && colors # Enable colors

# Show Git branch/tag, or name-rev if on detached head
parse_git_branch() {
  echo "PARSING GIT BRANCH"
  (git symbolic-ref -q HEAD || git name-rev --name-only --no-undefined --always HEAD) 2> /dev/null
}

prompt() {
    echo -n "%/"
    echo "$(git status)"
}

PS1="$(prompt)"

这是我对setopt 的输出:

interactive
login
monitor
nonomatch
promptsubst
shinstdin
zle

【问题讨论】:

  • 纯粹是一个 zsh 问题。 bash 在标题或标记中都没有位置。请不要标记其他外壳,除非您完全确定您的问题适用于两者(针对两者的测试代码,得到相同的结果)——直接引用错误适用于 bash,但您的复制器由于其他原因无法在那里工作.
  • 顺便说一句——使用括号进行分组是非常低效的。最好使用大括号:{ git symbolic-ref -q HEAD || git name-rev --name-only --no-undefined --always HEAD; } 2>/dev/null - 这样您就不会产生子外壳开销。

标签: zsh


【解决方案1】:

您需要延迟调用prompt,直到出现提示;通过使用单引号来做到这一点:

PS1='$(prompt)'

不过,更好的办法是定义一个设置PS1 的函数,然后将该函数添加到precmd_functions 数组中,以便在显示每个提示之前执行它。

prompt () {
    PS1="%/$(git status)"
}

precmd_functions+=(prompt)

【讨论】:

  • 您能否详细说明'和"之间的区别。延迟调用某事究竟是什么意思?
  • @George,单引号抑制 shell 扩展,因此 $() 成为存储在 PS1 中的值的一部分。相比之下,在双引号内,实际存储在 PS1 中的是立即运行一次命令的输出。
  • 使用单引号,PS1 设置为文字字符串$(prompt),而不是调用prompt 的结果。不过,提示变量很特殊;当它们显示时,它们会进行另一轮评估,因此每次显示提示时都会扩展$(prompt)
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
相关资源
最近更新 更多