Zsh提示自定义

时间:2016-03-24 02:58:34

标签: command-line zsh

嗨我知道你设置了提示变量来编辑这个提示

daemon

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

1 个答案:

答案 0 :(得分:5)

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

  1. 使用命令替换作为提示

    的一部分运行命令
    setopt promptsubst
    PROMPT='Date %d Result $(a_command) '
    
      必须启用
    • promptsubst,否则zsh将不执行任何参数扩展,算术扩展或命令替换。
    • 此外,需要引用提示文本,以便在设置PROMPT时不进行扩展。所以要么把它放在单引号中,要么如果你有/想要使用双引号,请在$之前添加\以在必要时单独引用它们:

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

      设置$(another_command)(因此只运行一次,结果只能永久替换)和PROMPT每次显示提示时,这将展开$(a_command)

      < / LI>
  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提供了一种向该数组添加函数的简便方法。
    • 提示中的
    • %Nv将替换为psvar数组的第N个元素。如果省略N%vN==1,则(对于采用数字参数的其他提示令牌也是如此)
  3. 乍一看,第二种方法可能看起来要复杂得多,只需使用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'