如何在Zsh提示符中显示电池状态

9
我认为答案已经很清楚了。
我一直在寻找一个已经实现这个功能的软件,但是我一直没有找到。它要么不是用Zsh编写的,要么是为另一个应用程序编写的,比如tmux。重点是我没能找到它。
所以我的问题是,是否已经有预制脚本可以执行此操作?如果有,请给我一个链接。
如果没有,那么我应该研究哪些内容来制作这个脚本?请注意,我是Zsh脚本的新手。
这个想法的实现结果应该类似于67%。你懂的。;)
6个回答

8

其他答案 在Mac OS X上无法运行(缺少apci)。

我已经在我的提示符中使用了Steve Losh的zsh提示符的部分内容。 它不完全是您想要的 - 箭头▸▸▸▸▸▸▸▸▸▸显示当前电池状态,并在电池电量低时更改颜色。 这种方法使用Python脚本,为了完整起见,我将在下面添加。 这是我提示符运行的屏幕截图:

My zsh prompt

在 OS X 上,另一种方法是使用另一个简短的脚本on Reddit

ioreg -n AppleSmartBattery -r | awk '$1~/Capacity/{c[$1]=$3} END{OFMT="%.2f%%"; max=c["\"MaxCapacity\""]; print (max>0? 100*c["\"CurrentCapacity\""]/max: "?")}'
ioreg -n AppleSmartBattery -r | awk '$1~/ExternalConnected/{gsub("Yes", "+");gsub("No", "%"); print substr($0, length, 1)}'

假设这个脚本保存在 ~/bin/battery.sh 中:
function battery {
    ~/bin/battery.sh
}
setopt promptsubst
PROMPT='$(battery) $'

看起来像这样:

Reddit-based battery charge.


要使用Steve Losh的脚本,请先保存脚本,然后在上面的battery()函数中使用。

供OS X使用的电池充电Python脚本

#!/usr/bin/env python
# coding=UTF-8

import math, subprocess

p = subprocess.Popen(["ioreg", "-rc", "AppleSmartBattery"], stdout=subprocess.PIPE)
output = p.communicate()[0]

o_max = [l for l in output.splitlines() if 'MaxCapacity' in l][0]
o_cur = [l for l in output.splitlines() if 'CurrentCapacity' in l][0]

b_max = float(o_max.rpartition('=')[-1].strip())
b_cur = float(o_cur.rpartition('=')[-1].strip())

charge = b_cur / b_max
charge_threshold = int(math.ceil(10 * charge))

# Output

total_slots, slots = 10, []
filled = int(math.ceil(charge_threshold * (total_slots / 10.0))) * u'▸'
empty = (total_slots - len(filled)) * u'▹'

out = (filled + empty).encode('utf-8')
import sys

color_green = '%{[32m%}'
color_yellow = '%{[1;33m%}'
color_red = '%{[31m%}'
color_reset = '%{[00m%}'
color_out = (
    color_green if len(filled) > 6
    else color_yellow if len(filled) > 4
    else color_red
)

out = color_out + out + color_reset
sys.stdout.write(out)

谢谢!虽然这并不算数,因为我在使用Linux而不是Mac,但这是一个非常周到和出色的答案。已经投了个有用的票。 :) - greduan

7
一种非常简单的解决方案:
setopt promptsubst
PROMPT='$(acpi | grep -o "[0-9]*%)% '

2
这样做不行:它只会设置一次提示符就结束了。使用单引号和 setopt promptsubst - ZyX

5
尽管这个线程很旧,但我想在这里发布我的版本:

我使用了 steve losh's 的电池提示的基本概念,但首先改用了shell而不是python,这样更快,也将电池路径更改为我的arch linux发行版。此外,如果我的笔记本正在充电,我会在末尾添加一个绿色的粗体“+”:

This is how my prompt looks with the battery status

我的电池功能如下:

    function battery_charge {
      b_now=$(cat /sys/class/power_supply/BAT1/energy_now)
      b_full=$(cat /sys/class/power_supply/BAT1/energy_full)
      b_status=$(cat /sys/class/power_supply/BAT1/status)
      # I am displaying 10 chars -> charge is in {0..9}
      charge=$(expr $(expr $b_now \* 10) / $b_full)

      # choose the color according the charge or if we are charging then always green
      if [[ charge -gt 5 || "Charging" == $b_status ]]; then
        echo -n "%{$fg[green]%}"
      elif [[ charge -gt 2 ]]; then
        echo -n "%{$fg[yellow]%}"
      else
        echo -n "%{$fg[red]%}"
      fi

      # display charge * '▸' and (10 - charge) * '▹'
      i=0;
      while [[ i -lt $charge ]]
      do
        i=$(expr $i + 1)
        echo -n "▸"
      done
      while [[ i -lt 10 ]]
      do
        i=$(expr $i + 1)
        echo -n "▹"
      done

      # display a plus if we are charging
      if [[ "Charging" == $b_status ]]; then
        echo -n "%{$fg_bold[green]%} +"
      fi
      # and reset the color
      echo -n "%{$reset_color%} "
    }

2

这里是彩色版本,使用ZSH编写。

在您的.zshrc文件中:

function battery {
    batprompt.sh
}
setopt promptsubst
PROMPT='$(battery) >'

以下是适用于Linux的batprompt.sh脚本。您可以根据需要适配其他读取电池数据的方法,也可以从早期帖子中适配acpi版本:

#!/bin/zsh
# BATDIR is the folder with your battery characteristics
BATDIR="/sys/class/power_supply/BAT0"
max=`cat $BATDIR/charge_full`
current=`cat $BATDIR/charge_now`
percent=$(( 100 * $current / $max ))

color_green="%{^[[32m%}"
color_yellow="%{^[[34m%}"
color_red="%{^[[31m%}"
color_reset="%{^[[00m%}"

if [ $percent -ge 80 ] ; then
    color=$color_green;
elif [ $percent -ge 40 ] ; then
    color=$color_yellow;
else
    color=$color_red;
fi
echo $color$percent$color_reset

请注意,颜色定义中看到的“^ [”是转义字符。如果复制和粘贴无法正常工作,则需要将“^ [”转换为转义字符。在VI / Vim中,您可以删除字符,然后插入control-v,然后按Esc键。


在Korora(Fedora)上它不起作用。 它找不到/sys/class/power_supply/BAT0/charge_full/sys/class/power_supply/BAT0/charge_now - phaberest
好的,它在/sys/class/power_supply/BAT1/energy_full/sys/class/power_supply/BAT1/energy_now中。谢谢! - phaberest

1
这帮助了我解决了我的Mac问题。
pmset -g batt | grep -Eo "\d+%" | cut -d% -f1

0
Zsh自2011年起就有一个内置插件battery,可以显示电池状态。要激活插件,请在您喜欢的文本编辑器中打开~/.zshrc并将battery添加到插件设置中:
plugins=(git battery)

保存更改并重新加载Zsh会话:

source ~/.zshrc

列出的插件现在已激活。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接