Linux для всех

индекс
246,80

zsh :: настраиваем «правое» приглашение командной строки

Ковыряясь с настройками zsh, наткнулся на весьма интересное решение для приглашения командной строки, которое размещается в этом шелле справа. Обычно туда принято помещать часы, но мне весьма приглянулась идея разместить там также нотификатор заряда батареи. В зависимости от уровня заряда, нотификатор показывается зеленым, желтым или красным цветом. Автор идеи зачем-то приплел к решению python, я все переписал на родном шелле.
Выглядит это как-то вот так:
Command line prompt, zsh

Приведенный ниже код тестировался на ubuntu, кроме цветов (%F{…}) все обязано работать на любых дистрибутивах под zsh. Итак, приступим.
Правое приглашение командной строки в zsh задается переменной среды окружения RPROMPT. Вот кусок кода, который имеет смысл разместить в ~/.zshrc (или в ~/.oh-my-zsh/themes/ВАША_ТЕМА, если вы уже знаете про oh-my-zsh):
function battery_charge {
  # Battery 0: Discharging, 94%, 03:46:34 remaining
  bat_percent=`acpi | awk -F ':' {'print $2;'} | awk -F ',' {'print $2;'} | sed -e "s/\s//" -e "s/%.*//"`

  if [ $bat_percent -lt 20 ]; then cl='%F{red}'
  elif [ $bat_percent -lt 50 ]; then cl='%F{yellow}'
  else cl='%F{green}'
  fi

  filled=${(l:`expr $bat_percent / 10`::▸:)}
  empty=${(l:`expr 10 - $bat_percent / 10`::▹:)}
  echo $cl$filled$empty'%F{default}'
}
RPROMPT='[%*] $(battery_charge)'

Алгоритм работы прост, как амеба во внебрачный период:
— получили и распарсили заряд батареи от acpi (может потребоваться установить sudo apt-get install acpi);
— определили цвет отображения (красный, если меньше 20%, желтый — до 50%, иначе — зеленый);
— нарисовали сколько нужно закрашенных треугольников, потом остаток — незакрашенными;
— вывели в правое приглашение командной строки.

Эта заметка — просто иллюстрация принципа «потрать три минуты и сделай себе жизнь навсегда удобнее». Если вы, конечно, являетесь таким же адептом консоли, как я. Я знаю, что код не вылизан до состояния «можно на выставку» — но зачем мне это?

В качестве еще одного примера — выведем справа код возврата предыдущей команды:
RPROMPT='%{$fg[red]%} ⏎ $? %{$reset_color%} '$RPROMPT
+45
15 ноября 2011, 00:47
78

комментарии (23)

0
qrick #
А как ведет себя ваш промпт, когда команда не умещается в отведенное ей пустое место?
+3
weirdan #
когда набранный текст его достигает, промпт исчезает. тут все хорошо. неудобно при копировании из консоли, правый промпт тоже копируется.
+2
qrick #
Не думали о том, чтобы сделать многострочный промпт?
0
weirdan #
а как это спасет от копирования ненужной информации при, скажем, копировании серии команд с их выводом?
+1
nekt #
А кому мешает эта ненужная информация?
Хотя если промпт многострочен, то вывод проще редактировать убирая ненужную информацию целыми строками.
+1
matiouchkine #
Левый тоже копируется, причем во всех шеллах :-)

Если речь идет про многострочные команды, то можно начинать их с комментария, если предполагаешь, что будешь копировать мышью (нахрена, о великий Пикабит?):
am@am $ # \                               [5:41:01] ▸▸▸▸▸▸▸▸▸▹
ls -la \
~/.oh-my-zsh/themes
0
weirdan #
Левый тоже копируется, причем во всех шеллах :-)

не вопрос, копируется. вот только так исторически сложилось, что информация в нем более интересна для копирования (пользователь, хост, текущая папка) нежели в том, что справа, так как дает некоторый контекст выполнения команды. заряд батарейки (у вас) или текущая ветка и ревизия (у меня) вряд ли заинтересуют кого-либо, кроме нас самих.
0
matiouchkine #
Да ну, вы всерьез полагаете, что мировое сообщество заинтересует, что я работаю под аккаунтом am и держу проект в папке ~/Projects/Shit/BloodyAccounting/Ghgh?

:-)
+1
weirdan #
мировое сообщество вполне может обратить внимание на то, от какого пользователя что выполняется (рут? не рут? отдельный пользователь какого-то известного демона?).

кроме того, основной трафик шелловой копипасты у меня наблюдается при общении с коллегами, а не с мировым сообществом. их уже заинтересует и хост, и путь.
0
matiouchkine #
Дык а коллег и номер ревизии тогда заинтересует. И мои треугольнички, как визуальный маркер, по которому просто найти предыдущую команду, скользя глазами по длинному копипасту.
Кроме того, коллеги — люди с пониманием, они перетерпят неаккуратность в копипасте моего шелла.
0
matiouchkine #
Это не «мой» промпт, это zsh-ный промпт. Я лишь показал, как засунуть туда что-нибудь посерьезнее часов.

Пример многострочного промпта можно увидеть по приведенной ссылке. Также в упомянутой мной библиотеке «oh-my-zsh» есть куча тем с многострочными промптами. Чтобы увидеть, достаточно установить
ZSH_THEME="random"

в ~/.zshrc и поработать чутка.
0
muhas #
использую схожую инфу выводя её в GNU Screen что избавляет от перевода коретки при желании посмотреть текущий расклад по зарядке, а не тот что был после выполнения последней команды, ну и не напрягает когда видно сразу несколько консолей и в каждой отображается зарядка)
+1
Scrill #
Чтобы не было проблем с отображением цветов в более старых версиях Zsh, лучше везде использовать конструкцию типа: %{$fg[red]%}
+3
muhas #
и не забыть подключить модуль color)
0
matiouchkine #
Ой, а вы застали дефолтные конфиги зэда, в которых он по умолчанию выключен?

:-)
0
muhas #
я застал zsh 4.3.12 в примерах конфига из исходников которого нету упоминания о этом модуле ^_^
ну и в арче у меня по дефолту вроде как нету конфига zsh, так что даже клава не корректно работает
0
matiouchkine #
Я, наверное, просто всегда сразу oh-my-zsh накатываю, который все приносит за собой. А как раньше было, при больших деревьях, похоже уже не вспомню :-)
0
muhas #
а я о oh-my-zsh только на днях из чьего-то твиттера узнал) а на хабре узнал подробнее что это такое. а то приходилось свой конфиг юзать, боюсь что потеряю и так удобно для себя в жизни никогда так не на строю)
0
matiouchkine #
Да, согласен, я в конце (пример вывода статуса последней исполненной команды) им как раз и пользуюсь. Там эти %F, чтобы людей не пугать новыми переменными среды, взявшимися неизвестно откуда.
Возможно, зря. Исправить, как думаете?
+2
bliznezz #
Если бы доковырять utf-8 символы FULL BLOCK, LEFT SEVEN EIGHTHS BLOCK и т.д. до LEFT ONE EIGHTH BLOCK
то можно эффектно выразить градацию от 1 до 32 буквально в 4 символа.
for i in {8,9,a,b,c,d,e,f}; do echo -e "\xE2\x96\x8${i}" ; done
0
matiouchkine #
Изящно, но несчитываемо :-)
–7
zagppua #
Большое спасибо, очень интересное решение! Жаль только, что Адольф не застал этот топик.

+2
matiouchkine #
А вот и задроты подошли. Мальчик, сосни хуйца.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.