shikhalev.org
Скриншот командной строки с xbash

Давно собирался и таки стартанул пет-проект — https://github.com/shikhalev/xbash.

Навеяно gitsh, который я когда-то активно использовал, но у него были проблемы с русской локалью, новыми версиями Git и так далее. При этом, на мой взгляд, gitsh сильно переусложнен, да и использование Ruby, при всей моей любви к этому языку, тут лишнее. Посему я решил сделать что-то подобное, но попроще, на чистом bash, и более универсальное.

Что делает?

Итак, что этот скрипт (набор скриптов) делает?

  1. Позволяет использовать субкоманды того же git, как непосредственные команды. Помимо git, так же можно коротким образом вводить субкоманды cargo1.

  2. Отображает в приглашении командной строки репозиторий, ветку, путь внутри репозитория и значок статуса (звездочка разных цветов на данный момент). Кроме того, вместо имени локального пользователя показывается e-mail пользователя, под которым идет запись в репозиторий2.

  3. Другие системы управления версиями, сборки и управления зависимостями могут быть добавлены просто и единообразно. Для Mer­cu­ri­al и Ruby­gems планирую сделать, как только руки дойдут.

Стадия разработки пока самая ранняя (хотя я уже пользуюсь и отлаживаю «наживую»), поэтому инсталлятора нет, есть инструкция по ус­та­нов­ке в фай­ле README.md.

Что не делает?

Вообще, список недоделок и планов имеется в разделе TODO файла README.md репозитория… Тут, пожалуй, напишу о проб­лем­ных моментах, а не прос­то недоделках:

  • Автодополнение, то есть completion. С ним я пока не разбирался вообще и понятия не имею, сколько времени у меня это займет. Если что, буду крайне благожелателен к пулл-ре­к­вес­там на эту тему.

  • Спорный момент о приоритетах: сейчас используется command_not_found_handle() и, соответственно, нужные субкоманды вызываются только если нет ничего с тем же именем. Возможно, стоило бы поиграться с алиасами, чтобы наоборот — субкоманды имели наивысший приоритет. Правда, это не решит проблему с конфликтами между системами — так, у git и cargo, например, у обоих имеются субкоманды clean, config и fetch, как минимум.

    А в идеале сделать бы все эти приоритеты настраиваемыми… Но это сложно, буду думать.

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

Что я узнал?

Наверное, много чего, особенно относительно чистого bash… Из интересного:

  • Если хотите парсить статус git, нужно использовать не просто git status, и даже не git status -s, а git status --porcelain — он выдает более консервативный результат, да еще и независимый от ло­ка­ли.

  • Ну, про command_not_found_handle() я уже упоминал.

  • Массивы и ассоциативные массивы в bash не могут быть вложенными. Печаль.

  1. Если кто не знает, cargo — это система сборки и управления зависимостями языка Rust. 

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