This repository has no description
8.4 kB
286 lines
1{ pkgs, ... }:
2let
3 q-cal = let
4 # XXX 23 is the longest line of cal's output
5 pad = ''{
6 ${pkgs.gnused}/bin/sed '
7 # rtrim
8 s/ *$//
9
10 # delete last empty line
11 ''${/^$/d}
12 ' \
13 | ${pkgs.gawk}/bin/awk '{printf "%-23s\n", $0}' \
14 | ${pkgs.gnused}/bin/sed '
15 # colorize header
16 1,2s/.*/[38;5;238;1m&[39;22m/
17
18 # colorize week number
19 s/^[ 1-9][0-9]/[38;5;238;1m&[39;22m/
20 '
21 }'';
22 in ''
23 ${pkgs.coreutils}/bin/paste \
24 <(${pkgs.util-linux}/bin/cal -mw \
25 $(${pkgs.coreutils}/bin/date +'%m %Y' -d 'last month') \
26 | ${pad}
27 ) \
28 <(${pkgs.util-linux}/bin/cal -mw \
29 | ${pkgs.gnused}/bin/sed '
30 # colorize day of month
31 s/\(^\| \)'"$(${pkgs.coreutils}/bin/date +%e)"'\>/[31;1m&[39;22m/
32 ' \
33 | ${pad}
34 ) \
35 <(${pkgs.util-linux}/bin/cal -mw \
36 $(${pkgs.coreutils}/bin/date +'%m %Y' -d 'next month') \
37 | ${pad}
38 ) \
39 | ${pkgs.gnused}/bin/sed 's/\t/ /g'
40 '';
41
42 q-isodate = ''
43 ${pkgs.coreutils}/bin/date \
44 '+[1m%Y-%m-%d[;30mT[;38;5;085m%H:%M[m:%S%:z'
45 '';
46
47 q-gitdir = ''
48 if test -d .git; then
49 #git status --porcelain
50 branch=$(
51 ${pkgs.git}/bin/git branch \
52 | ${pkgs.gnused}/bin/sed -rn 's/^\* (.*)/\1/p'
53 )
54 echo "± $LOGNAME@''${HOSTNAME-$(${pkgs.nettools}/bin/hostname)}:$PWD .git $branch"
55 fi
56 '';
57
58 q-intel_backlight = ''
59 cd /sys/class/backlight/intel_backlight
60 </dev/null exec ${pkgs.gawk}/bin/awk '
61 END {
62 getline actual_brightness < "actual_brightness"
63 getline max_brightness < "max_brightness"
64 getline brightness < "brightness"
65 printf "intel_backlight %d%% %d/%d\n" \
66 , actual_brightness / max_brightness * 100 \
67 , actual_brightness \
68 , max_brightness
69 }
70 '
71 '';
72
73 q-power_supply = let
74 power_supply = pkgs.writeBash "power_supply" ''
75 set -efu
76 uevent=$1
77 eval "$(${pkgs.gnused}/bin/sed -n '
78 s/^\([A-Z_]\+=[0-9A-Za-z_-]*\)$/export \1/p
79 ' $uevent)"
80 case $POWER_SUPPLY_NAME in
81 AC)
82 exit # not battery
83 ;;
84 esac
85 exec </dev/null
86 exec ${pkgs.gawk}/bin/awk '
87 function die(s) {
88 printf "%s: %s\n", name, s
89 exit 1
90 }
91
92 function print_hm(h, m) {
93 m = (h - int(h)) * 60
94 return sprintf("%dh%dm", h, m)
95 }
96
97 function print_bar(n, r, t1, t2, t_col) {
98 t1 = int(r * n)
99 t2 = n - t1
100 if (r >= .42) t_col = "1;32"
101 else if (r >= 23) t_col = "1;33"
102 else if (r >= 11) t_col = "1;31"
103 else t_col = "5;1;31"
104 return sgr(t_col) strdup("■", t1) sgr(";30") strdup("■", t2) sgr()
105 }
106
107 function sgr(p) {
108 return "\x1b[" p "m"
109 }
110
111 function strdup(s,n,t) {
112 t = sprintf("%"n"s","")
113 gsub(/ /,s,t)
114 return t
115 }
116
117 END {
118 name = ENVIRON["POWER_SUPPLY_NAME"]
119
120 charge_unit = "Ah"
121 charge_now = ENVIRON["POWER_SUPPLY_CHARGE_NOW"] / 10^6
122 charge_full = ENVIRON["POWER_SUPPLY_CHARGE_FULL"] / 10^6
123
124 current_unit = "A"
125 current_now = ENVIRON["POWER_SUPPLY_CURRENT_NOW"] / 10^6
126
127 energy_unit = "Wh"
128 energy_now = ENVIRON["POWER_SUPPLY_ENERGY_NOW"] / 10^6
129 energy_full = ENVIRON["POWER_SUPPLY_ENERGY_FULL"] / 10^6
130
131 power_unit = "W"
132 power_now = ENVIRON["POWER_SUPPLY_POWER_NOW"] / 10^6
133
134 voltage_unit = "V"
135 voltage_now = ENVIRON["POWER_SUPPLY_VOLTAGE_NOW"] / 10^6
136 voltage_min_design = ENVIRON["POWER_SUPPLY_VOLTAGE_MIN_DESIGN"] / 10^6
137
138 #printf "charge_now: %s\n", charge_now
139 #printf "charge_full: %s\n", charge_full
140 #printf "current_now: %s\n", current_now
141 #printf "energy_now: %s\n", energy_now
142 #printf "energy_full: %s\n", energy_full
143 #printf "energy_full: %s\n", ENVIRON["POWER_SUPPLY_ENERGY_FULL"]
144 #printf "energy_full: %s\n", ENVIRON["POWER_SUPPLY_ENERGY_FULL"] / 10^6
145 #printf "power_now: %s\n", power_now
146 #printf "voltage_now: %s\n", voltage_now
147
148 if (current_now == 0 && voltage_now != 0) {
149 current_now = power_now / voltage_now
150 }
151 if (power_now == 0) {
152 power_now = current_now * voltage_now
153 }
154 if (charge_now == 0 && voltage_min_design != 0) {
155 charge_now = energy_now / voltage_min_design
156 }
157 if (energy_now == 0) {
158 energy_now = charge_now * voltage_min_design
159 }
160 if (charge_full == 0 && voltage_min_design != 0) {
161 charge_full = energy_full / voltage_min_design
162 }
163 if (energy_full == 0) {
164 energy_full = charge_full * voltage_min_design
165 }
166
167 if (charge_now == 0 || charge_full == 0) {
168 die("unknown charge")
169 }
170
171 charge_ratio = charge_now / charge_full
172
173 out = out name
174 out = out sprintf(" %s", print_bar(10, charge_ratio))
175 out = out sprintf(" %d%", charge_ratio * 100)
176 out = out sprintf(" %.2f%s", charge_now, charge_unit)
177 if (current_now != 0) {
178 out = out sprintf("/%.1f%s", current_now, current_unit)
179 }
180 out = out sprintf(" %d%s", energy_full, energy_unit)
181 if (power_now != 0) {
182 out = out sprintf("/%.1f%s", power_now, power_unit)
183 }
184 if (current_now != 0) {
185 out = out sprintf(" %s", print_hm(charge_now / current_now))
186 }
187
188 print out
189 }
190 '
191 '';
192 in ''
193 for uevent in /sys/class/power_supply/*/uevent; do
194 ${power_supply} "$uevent" || :
195 done
196 '';
197
198 q-virtualization = ''
199 echo "VT: $(${pkgs.systemd}/bin/systemd-detect-virt)"
200 '';
201
202 q-wireless = ''
203 for dev in $(
204 ${pkgs.iw}/bin/iw dev \
205 | ${pkgs.gnused}/bin/sed -n 's/^\s*Interface\s\+\([0-9a-z]\+\)$/\1/p'
206 ); do
207 inet=$(${pkgs.iproute2}/bin/ip addr show $dev \
208 | ${pkgs.gnused}/bin/sed -n '
209 s/.*inet \([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p
210 ') \
211 || unset inet
212 ssid=$(${pkgs.iw}/bin/iw dev $dev link \
213 | ${pkgs.gnused}/bin/sed -n '
214 s/.*\tSSID: \(.*\)/\1/p
215 ') \
216 || unset ssid
217 echo "$dev''${inet+ $inet}''${ssid+ $ssid}"
218 done
219 '';
220
221 q-online = ''
222 if ${pkgs.curl}/bin/curl -s google.com >/dev/null; then
223 echo '[32;1monline[m'
224 else
225 echo offline
226 fi
227 '';
228
229 q-thermal_zone = ''
230 for i in /sys/class/thermal/thermal_zone*; do
231 type=$(${pkgs.coreutils}/bin/cat $i/type)
232 temp=$(${pkgs.coreutils}/bin/cat $i/temp)
233 printf '%s %s°C\n' $type $(echo $temp / 1000 | ${pkgs.bc}/bin/bc)
234 done
235 '';
236
237 q-todo = ''
238 TODO_file=$HOME/TODO
239 if test -e "$TODO_file"; then
240 ${pkgs.coreutils}/bin/cat "$TODO_file" \
241 | ${pkgs.gawk}/bin/gawk -v now=$(${pkgs.coreutils}/bin/date +%s) '
242 BEGIN { print "remind=0" }
243 /^[0-9]/{
244 x = $1
245 gsub(".", "\\\\&", x)
246 rest = substr($0, index($0, " "))
247 rest = $0
248 sub(" *", "", rest)
249 gsub(".", "\\\\&", rest)
250 print "test $(${pkgs.coreutils}/bin/date +%s -d"x") -lt "now" && \
251 echo \"\x1b[38;5;208m\""rest esc "\"\x1b[m\" && \
252 (( remind++ ))"
253 }
254 END { print "test $remind = 0 && echo \"nothing to remind\"" }
255 ' \
256 | {
257 # bash needed for (( ... ))
258 ${pkgs.bash}/bin/bash
259 }
260 else
261 echo "$TODO_file: no such file or directory"
262 fi
263 '';
264
265in
266# bash needed for <(...)
267pkgs.writeBashBin "q" ''
268 set -eu
269 export PATH=/var/empty
270 (${q-todo}) || :
271 if [ "$PWD" != "$HOME" ]; then
272 (HOME=$PWD; ${q-todo}) || :
273 fi
274 echo
275 ${q-cal}
276 echo
277 ${q-isodate}
278 (${q-gitdir}) &
279 (${q-intel_backlight}) &
280 (${q-power_supply}) &
281 (${q-virtualization}) &
282 (${q-wireless}) &
283 (${q-online}) &
284 (${q-thermal_zone}) &
285 wait
286''