zsh:使用python脚本设置RPROMPT。 RPROMPT没有更新

时间:2014-07-24 18:28:41

标签: shell python-2.7 zsh

我正在设置我的zsh RPROMPT以显示this guide中的当前电池状态。

我编写了以下python脚本来查找当前的电池状态并打印出格式化的电池状态,以便我的.zshrc读取。

# Outputs current battery status formatted for use in zsh prompt.
#! /usr/bin/python2.7
# coding=UTF-8

import sys

def main():

    file = open('/sys/class/power_supply/BAT0/capacity', 'r')
    data = file.read()
    file.close()

    charge = int(data)

    if charge >= 75:
    prompt = '%{$fg[green]%} * * * *'

    elif charge < 75 and charge >= 50:
        prompt = '%{$fg[green]%}   * * *'

    elif charge < 50 and charge >= 25:
        prompt = '%{$fg[yellow]%}     * *'

    elif charge < 25:
        prompt = '%{$fg[red]%}       *'


    file = open('/sys/class/power_supply/BAT0/status', 'r')
    status = file.read()
    file.close()

    if status == 'Charging\n':
        prompt = prompt + '%{$fg[green]%} (+)'

    elif status == 'Unknown\n':
        prompt = prompt + '%{$fg[yellow]%} (?)'

    else:
        prompt = prompt + '%{$fg[red]%} (-)'


    sys.stdout.write(prompt)


if __name__ == '__main__':
    main()

我将此脚本放在我的路径中,以便只需输入“电池”即可运行。这是我的.zshrc:

# The following lines were added by compinstall

zstyle ':completion:*' completer _expand _complete _ignored _correct _approximate
zstyle ':completion:*' matcher-list '' ''
zstyle :compinstall filename '/home/jav/.zshrc'

autoload -Uz compinit promptinit
compinit
promptinit

# End of lines added by compinstall
# Lines configured by zsh-newuser-install
HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
setopt autocd
bindkey -v
# End of lines configured by zsh-newuser-install


function prompt {
    echo
    echo '$ '
}


function battery_status {
    echo `battery`
}


autoload -U colors && colors
setopt promptsubst

PROMPT='%{$fg[white]%}[%n @ %M in %~]$(prompt)'
RPROMPT=$(battery_status)%{$reset_color%}

它总共显示类似于以下内容的内容。

[username @ hostname in ~]                                                       * * * * (-)
$

星号表示当前的电池电量和&#39;( - )&#39;表示是否正在充电。问题是&#39; * * * *( - )&#39;插入交流电源适配器或电池电量变化时应自动更新,但不是。我必须来源.zshrc&#39;为了更新电池状态。

我知道RPROMPT=$(battery_status)%{$reset_color%}应该用这样的RPROMPT='$(battery_status)%{$reset_color%}'这样的单引号包围,但是当我这样做时,而不是我的提示显示&#39; * * * *( - )&#39;它显示python程序的文字输出:&#34;%{$ fg [green]%} * * * *%{$ fg [red]%}( - )&#34;

只有在我的.zshrc中使用shell函数中的python程序时才会出现此问题。 RPROMPT中使用的Shell脚本正确更新。

每次运行时我都会将python电池程序记录到文件中。根据日志文件,电池程序仅在.zshrc来源时运行,而不是每次向终端打印新提示时都会运行。

因为它只出现在python程序中,这让我觉得我打印输出的方式是个问题。但是看到每次在终端显示提示时都没有运行电池脚本,我觉得这可能是我在zsh端做的错误。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您只需设置一次提示值。您需要在显示每个新提示之前重置它。最简单的方法是使用

之类的东西
set_prompt () {
    PROMPT='%{$fg[white]%}[%n @ %M in %~]$(prompt)'
    RPROMPT=$(battery_status)%{$reset_color%}
}
autoload add-zsh-hook
add-zsh-hook precmd set_prompt

到您的.zshrc文件。