我正在设置我的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端做的错误。
我做错了什么?
答案 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
文件。