Zsh 提示自定义

Zsh Prompt Customization

您好,我知道您设置了提示变量来像这样编辑提示

export PROMPT="This is the date %d"

你如何执行命令并在提示加载时每次打印结果。

实际上有两种(主要)方法可以实现这一点:

  1. 使用命令替换 运行 命令作为提示的一部分

    setopt promptsubst
    PROMPT='Date %d Result $(a_command) '
    
    • promptsubst 必须启用,否则 zsh 将不会进行任何参数扩展、算术扩展或命令替换。
    • 另外,提示文字需要在设置PROMPT时用引号引起来,不要展开。所以要么把它放在单引号中,要么,如果你 have/want 使用双引号,在 $ 前面加上 \ 以在必要时单独引用它们:

      PROMPT="Date %d Result $(a_command) Const $(another_command)"
      

      这将在设置 PROMPT 时扩展 $(another_command)(因此它只是 运行 一次,其结果将永久替换)并且每次显示提示时 $(a_command) .

  2. 利用precmd函数(或钩子)和psvar数组:

    autoload -Uz add-zsh-hook
    a_function () {
        psvar[1]=$(a_command)
    }
    two_function () {
        psvar[2]=$(two_command)
    }
    add-zsh-hook precmd a_function
    add-zsh-hook precmd two_function
    PROMPT='Date %d Result1 %v Result2 %2v '
    
    • 如果设置,precmd 函数将在打印提示之前 运行。您还可以在 precmd_functions 数组中将函数列表设置为 运行。
    • add-zsh-hook 提供了一种向该数组添加函数的简单方法。
    • 提示中的
    • %Nvpsvar数组的第N个元素代替。如果 N 被遗漏 (%v),则假定 N==1(对于其他采用数字参数的提示标记也是如此)

乍一看,第二种方法可能比 promptsubst 复杂得多。但这只是非常简单的替换的情况。使用 precmd 允许使用更复杂的函数,而不会由于在 $( ).

中塞入几行代码而使 PROMPT 的定义不可读

您也可以结合这两种方法并在某些或所有情况下放弃使用 psvar

autoload -Uz add-zsh-hook
setopt promptsubst
a_function () {
    a_parameter=$(a_command)
}
two_function () {
    psvar[2]=$(two_command)
}
add-zsh-hook precmd a_function
add-zsh-hook precmd two_function
PROMPT='Date %d Result ${a_parameter} %2v'