Динамически использовать цвета в командной строке в зависимости от состояния батареи, времени, процента - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь создать динамическое приглашение, которое использует цветовые кодировки для предоставления визуальных подсказок о состоянии батареи.

Я буду использовать pmset -g batt для получения всей этой информации.

Пока я работаю с получением

  1. Процент батареи
  2. Аккумулятор заряжается, разряжается, заряжается - состояние
  3. Расчетное время работы от батареи до заряда или до разряда (= оставшееся время)

Номер 1 можно получить по pmset -g batt | egrep '([0-9]+\%).*' -o --colour=auto | cut -f1 -d';', и результат будет 100% (ну, в настоящее время, так как моя батарея полностью заряжена).

Номер 2 можно получить с помощью pmset -g batt | awk '/charging|discharging|charged/ {print $4}' | cut -f1 -d';', но для его корректной работы в приглашении вам нужно изменить его на pmset -g batt | awk '/charging|discharging|charged/ {print $4}' | cut -f2 -d';' - который будет показывать неловкое пустое место перед словом. поэтому " charged" вместо "charged", " discharging" вместо "discharging" и " charging" вместо "charging". Это нормально, я думаю, но я думаю, что это может быть продолжено.

Номер 3 можно получить по pmset -g batt | grep -Eo '([0-9][0-9]|[0-9]):[0-5][0-9]' - но если ваша батарея полностью заряжена, вы получите крутой 0:00, что не имеет смысла.

Хорошо, мы установили, что такая информация может быть извлечена и может отображаться, по крайней мере, в самом терминале, как насчет проблемы с динамическим запросом?


Ну, вот что у меня сейчас есть:

[100%] [] [ charged] [Sat Nov 10 21:24:34] [~] >>

Это не совсем идеально. Например, [] вообще не нужно показывать, учитывая, что информация будет отображаться 0:00. [ charged] также немного ненужен.

Итак, вот что я предлагаю спросить, как это сделать:

  1. Когда батарея полностью заряжена, просто покажите процент, без "[time left / time to charge]" и без "[ charged]
  2. Когда батарея разряжается, покажите процент и "[time left] (цвет в процентах может быть изменен?).
  3. Когда батарея заряжается, укажите процент и "[time left] (процент может быть желтым).
  4. Когда батарея критична (скажем, 15%) (процент может быть красным)

Теперь я дошел до этого:

export PS1="[\$(pmset -g batt | egrep '([0-9]+\%).*' -o --colour=auto | cut -f1 -d';')] [\$(pmset -g batt | grep -Eo '([0-9][0-9]|[0-9]):[0-5][0-9]')] [\$(pmset -g batt | awk '/charging|discharging|charged/ {print $4}' | cut -f2 -d';')] [\d \t]"

что дает мне [100%] [0:00] [ charged] [Sat Nov 10 21:32:38]

В любом случае, вернемся к этой странной cut -f1 против cut -f2 разницы между терминалом и подсказкой. Если я введу cut -f1 в приглашение export PS1, я получу это:

[100%] [0:00] [ -InternalBattery-0 (id=4194403) 100%] [Sat Nov 10 21:34:44]

Во всяком случае, я думаю, что должен быть способ: "О, 0:00? Вообще не отображать этот сегмент приглашения" - но я не уверен, как это сделать.

Итак, резюмируя, я пытаюсь использовать «Заряженный, Зарядка, Разряд» для установки цвета батареи в процентах, заряженный = обычный цвет, зарядка = желтый, разрядка = ... зеленый ?, менее 20% = паника красный цвет. 5% мигать? : D

Я также пытаюсь использовать время, оставшееся до зарядки, и время, оставшееся до зарядки, чтобы оно отображалось в самой подсказке, динамически.

Любой совет будет высоко ценится.

p.s. дополнительные бонусные баллы за показ [оценки], если pmset -g batt приводит к (no estimate) в оставшееся время заряда

p.p.s. дополнительные бонусные баллы № 2 для выяснения, что делать с (т. е. это состояние, которое не (no estimate), но иногда будет происходить.

Now drawing from 'AC Power' -InternalBattery-0 (id=4194403) 89%; AC attached; not charging present: true

1 Ответ

0 голосов
/ 09 ноября 2018

Ваш вопрос действительно о том, как обрабатывать сложные запросы. Действительно сложный вопрос заключается в том, как обрабатывать условное использование цветов ANSI в приглашении.

Подвопросами являются «нормальное» сжатие строк, условный код и код ANSI. Все это я обрабатываю в моих точечных файлах , в profile и functions_colors.sh.

То, что вы действительно хотите, это

export PS1="[\$(__batt_pct)]\$(__batt_time) [\$(__batt_state)] [\d \t] "

, а затем

yellow=$(tput setaf 184)
green=$(tput setaf 120)
red=$(tput setaf 160)
reset=$(tput init)

function __batt_pct() {
  bpct=$(pmset -g batt | egrep '([0-9]+)%.*' -o | cut -f1 -d';')
  bpct=${bpct%?} # remove last char (%)
  case 1 in
    $(($bpct <= 15))) echo "$red$bpct%$reset" ;;
    $(($bpct <= 65))) echo "$yellow$bpct%$reset" ;;
                   *) echo "$green$bpct%$reset" ;;
  esac
}

# now, as a function, we can easily handle a conditional
function __batt_time() {
  btime=$(pmset -g batt | grep -Eo '([0-9][0-9]|[0-9]):[0-5][0-9]')
  if [[ "$btime" == "0:00" ]]; then echo ''; else echo " [$btime]"; fi
}

# I need to cut field-1 for this to trim evenly
function __batt_state() {
  bstate=$(pmset -g batt | awk '/charging|discharging|charged/ {print $4}' | cut -f1 -d';')
}

Мы используем __, потому что следуем соглашению Unix для имен функций, которые не нужно использовать вручную в CLI.

Для цветов просто следуйте указаниям ANSI по цветам , например, те, которые я связал в моих точечных файлах. Затем измените эту __batt_state функцию

# I need to cut field-1 for this to trim evenly
function __batt_state() {
  bstate=$(pmset -g batt | awk '/charging|discharging|charged/ {print $4}' | cut -f1 -d';')
  case "$bstate" in
    charged)
      echo "$green$bstate$reset"
      ;;
    charging)
      echo "$yellow$bstate$reset"
      ;;
    discharging)
      echo "$red$bstate$reset"
      ;;
    *)
      echo $bstate
      exit
  esac
}

Я решил бросить все это в репо , чтобы мне было проще его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...