]> src.twobees.de Git - dotfiles.git/blob - stow/oh-my-zsh/.oh-my-zsh/plugins/battery/battery.plugin.zsh
db5eeb93a700f8c099a05d2ac37d3df051df5cdb
[dotfiles.git] / stow / oh-my-zsh / .oh-my-zsh / plugins / battery / battery.plugin.zsh
1 ###########################################
2 # Battery plugin for oh-my-zsh            #
3 # Original Author: Peter hoeg (peterhoeg) #
4 # Email: peter@speartail.com              #
5 ###########################################
6 # Author: Sean Jones (neuralsandwich)     #
7 # Email: neuralsandwich@gmail.com         #
8 # Modified to add support for Apple Mac   #
9 ###########################################
10 # Author: J (927589452)                   #
11 # Modified to add support for FreeBSD     #
12 ###########################################
13 # Author: Avneet Singh (kalsi-avneet)     #
14 # Modified to add support for Android     #
15 ###########################################
16
17 if [[ "$OSTYPE" = darwin* ]]; then
18   function battery_is_charging() {
19     ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected"\ =\ Yes'
20   }
21   function battery_pct() {
22     pmset -g batt | grep -Eo "\d+%" | cut -d% -f1
23   }
24   function battery_pct_remaining() {
25     if battery_is_charging; then
26       echo "External Power"
27     else
28       battery_pct
29     fi
30   }
31   function battery_time_remaining() {
32     local smart_battery_status="$(ioreg -rc "AppleSmartBattery")"
33     if [[ $(echo $smart_battery_status | command grep -c '^.*"ExternalConnected"\ =\ No') -eq 1 ]]; then
34       timeremaining=$(echo $smart_battery_status | command grep '^.*"AvgTimeToEmpty"\ =\ ' | sed -e 's/^.*"AvgTimeToEmpty"\ =\ //')
35       if [ $timeremaining -gt 720 ]; then
36         echo "::"
37       else
38         echo "~$((timeremaining / 60)):$((timeremaining % 60))"
39       fi
40     else
41       echo "∞"
42     fi
43   }
44   function battery_pct_prompt () {
45     local battery_pct color
46     if ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected"\ =\ No'; then
47       battery_pct=$(battery_pct_remaining)
48       if [[ $battery_pct -gt 50 ]]; then
49         color='green'
50       elif [[ $battery_pct -gt 20 ]]; then
51         color='yellow'
52       else
53         color='red'
54       fi
55       echo "%{$fg[$color]%}[${battery_pct}%%]%{$reset_color%}"
56     else
57       echo "∞"
58     fi
59   }
60
61 elif [[ "$OSTYPE" = freebsd* ]]; then
62   function battery_is_charging() {
63     [[ $(sysctl -n hw.acpi.battery.state) -eq 2 ]]
64   }
65   function battery_pct() {
66     if (( $+commands[sysctl] )); then
67       sysctl -n hw.acpi.battery.life
68     fi
69   }
70   function battery_pct_remaining() {
71     if ! battery_is_charging; then
72       battery_pct
73     else
74       echo "External Power"
75     fi
76   }
77   function battery_time_remaining() {
78     local remaining_time
79     remaining_time=$(sysctl -n hw.acpi.battery.time)
80     if [[ $remaining_time -ge 0 ]]; then
81       ((hour = $remaining_time / 60 ))
82       ((minute = $remaining_time % 60 ))
83       printf %02d:%02d $hour $minute
84     fi
85   }
86   function battery_pct_prompt() {
87     local battery_pct color
88     battery_pct=$(battery_pct_remaining)
89     if battery_is_charging; then
90       echo "∞"
91     else
92       if [[ $battery_pct -gt 50 ]]; then
93         color='green'
94       elif [[ $battery_pct -gt 20 ]]; then
95         color='yellow'
96       else
97         color='red'
98       fi
99       echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}"
100     fi
101   }
102 elif [[ "$OSTYPE" = linux-android ]] && (( ${+commands[termux-battery-status]} )); then
103   function battery_is_charging() {
104     termux-battery-status 2>/dev/null | command awk '/status/ { exit ($0 ~ /DISCHARGING/) }'
105   }
106   function battery_pct() {
107     # Sample output:
108     # {
109     #   "health": "GOOD",
110     #   "percentage": 93,
111     #   "plugged": "UNPLUGGED",
112     #   "status": "DISCHARGING",
113     #   "temperature": 29.0,
114     #   "current": 361816
115     # }
116     termux-battery-status 2>/dev/null | command awk '/percentage/ { gsub(/[,]/,""); print $2}'
117   }
118   function battery_pct_remaining() {
119     if ! battery_is_charging; then
120       battery_pct
121     else
122       echo "External Power"
123     fi
124   }
125   function battery_time_remaining() { } # Not available on android
126   function battery_pct_prompt() {
127     local battery_pct color
128     battery_pct=$(battery_pct_remaining)
129     if battery_is_charging; then
130       echo "∞"
131     else
132       if [[ $battery_pct -gt 50 ]]; then
133         color='green'
134       elif [[ $battery_pct -gt 20 ]]; then
135         color='yellow'
136       else
137         color='red'
138       fi
139       echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}"
140     fi
141   }
142 elif [[ "$OSTYPE" = linux*  ]]; then
143   function battery_is_charging() {
144     if (( $+commands[acpitool] )); then
145       ! acpitool 2>/dev/null | command grep -qE '^\s+Battery.*Discharging'
146     elif (( $+commands[acpi] )); then
147       ! acpi 2>/dev/null | command grep -v "rate information unavailable" | command grep -q '^Battery.*Discharging'
148     fi
149   }
150   function battery_pct() {
151     if (( $+commands[acpitool] )); then
152       # Sample output:
153       #   Battery #1     : Unknown, 99.55%
154       #   Battery #2     : Discharging, 49.58%, 01:12:05
155       #   All batteries  : 62.60%, 02:03:03
156       local -i pct=$(acpitool 2>/dev/null | command awk -F, '
157         /^\s+All batteries/ {
158           gsub(/[^0-9.]/, "", $1)
159           pct=$1
160           exit
161         }
162         !pct && /^\s+Battery/ {
163           gsub(/[^0-9.]/, "", $2)
164           pct=$2
165         }
166         END { print pct }
167         ')
168       echo $pct
169     elif (( $+commands[acpi] )); then
170       # Sample output:
171       # Battery 0: Discharging, 0%, rate information unavailable
172       # Battery 1: Full, 100%
173       acpi 2>/dev/null | command awk -F, '
174         /rate information unavailable/ { next }
175         /^Battery.*: /{ gsub(/[^0-9]/, "", $2); print $2; exit }
176       '
177     fi
178   }
179   function battery_pct_remaining() {
180     if ! battery_is_charging; then
181       battery_pct
182     else
183       echo "External Power"
184     fi
185   }
186   function battery_time_remaining() {
187     if ! battery_is_charging; then
188       acpi 2>/dev/null | command grep -v "rate information unavailable" | cut -f3 -d ','
189     fi
190   }
191   function battery_pct_prompt() {
192     local battery_pct color
193     battery_pct=$(battery_pct_remaining)
194     if battery_is_charging; then
195       echo "∞"
196     else
197       if [[ $battery_pct -gt 50 ]]; then
198         color='green'
199       elif [[ $battery_pct -gt 20 ]]; then
200         color='yellow'
201       else
202         color='red'
203       fi
204       echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}"
205     fi
206   }
207 else
208   # Empty functions so we don't cause errors in prompts
209   function battery_is_charging { false }
210   function battery_pct \
211     battery_pct_remaining \
212     battery_time_remaining \
213     battery_pct_prompt { }
214 fi
215
216 function battery_level_gauge() {
217   local gauge_slots=${BATTERY_GAUGE_SLOTS:-10}
218   local green_threshold=${BATTERY_GREEN_THRESHOLD:-$(( gauge_slots * 0.6 ))}
219   local yellow_threshold=${BATTERY_YELLOW_THRESHOLD:-$(( gauge_slots * 0.4 ))}
220   local color_green=${BATTERY_COLOR_GREEN:-%F{green}}
221   local color_yellow=${BATTERY_COLOR_YELLOW:-%F{yellow}}
222   local color_red=${BATTERY_COLOR_RED:-%F{red}}
223   local color_reset=${BATTERY_COLOR_RESET:-%{%f%k%b%}}
224   local battery_prefix=${BATTERY_GAUGE_PREFIX:-'['}
225   local battery_suffix=${BATTERY_GAUGE_SUFFIX:-']'}
226   local filled_symbol=${BATTERY_GAUGE_FILLED_SYMBOL:-'▶'}
227   local empty_symbol=${BATTERY_GAUGE_EMPTY_SYMBOL:-'▷'}
228   local charging_color=${BATTERY_CHARGING_COLOR:-$color_yellow}
229   local charging_symbol=${BATTERY_CHARGING_SYMBOL:-'⚡'}
230
231   local -i battery_remaining_percentage=$(battery_pct)
232   local filled empty gauge_color
233
234   if [[ $battery_remaining_percentage =~ [0-9]+ ]]; then
235     filled=$(( ($battery_remaining_percentage * $gauge_slots) / 100 ))
236     empty=$(( $gauge_slots - $filled ))
237
238     if [[ $filled -gt $green_threshold ]]; then
239       gauge_color=$color_green
240     elif [[ $filled -gt $yellow_threshold ]]; then
241       gauge_color=$color_yellow
242     else
243       gauge_color=$color_red
244     fi
245   else
246     filled=$gauge_slots
247     empty=0
248     filled_symbol=${BATTERY_UNKNOWN_SYMBOL:-'.'}
249   fi
250
251   local charging=' '
252   battery_is_charging && charging=$charging_symbol
253
254   # Charging status and prefix
255   print -n ${charging_color}${charging}${color_reset}${battery_prefix}${gauge_color}
256   # Filled slots
257   [[ $filled -gt 0 ]] && printf ${filled_symbol//\%/\%\%}'%.0s' {1..$filled}
258   # Empty slots
259   [[ $filled -lt $gauge_slots ]] && printf ${empty_symbol//\%/\%\%}'%.0s' {1..$empty}
260   # Suffix
261   print -n ${color_reset}${battery_suffix}${color_reset}
262 }