
Давно собирался и таки стартанул пет-проект — https://github.com/shikhalev/xbash.
Навеяно gitsh, который я когда-то активно использовал, но у него были проблемы с русской локалью, новыми версиями Git и так далее. При этом, на мой взгляд, gitsh сильно переусложнен, да и использование Ruby, при всей моей любви к этому языку, тут лишнее. Посему я решил сделать что-то подобное, но попроще, на чистом bash, и более универсальное.
Что делает?
Итак, что этот скрипт (набор скриптов) делает?
-
Позволяет использовать субкоманды того же
git
, как непосредственные команды. Помимоgit
, так же можно коротким образом вводить субкомандыcargo
1. -
Отображает в приглашении командной строки репозиторий, ветку, путь внутри репозитория и значок статуса (звездочка разных цветов на данный момент). Кроме того, вместо имени локального пользователя показывается e-mail пользователя, под которым идет запись в репозиторий2.
-
Другие системы управления версиями, сборки и управления зависимостями могут быть добавлены просто и единообразно. Для Mercurial и Rubygems планирую сделать, как только руки дойдут.
Стадия разработки пока самая ранняя (хотя я уже пользуюсь и отлаживаю «наживую»), поэтому инсталлятора нет, есть инструкция по установке в файле 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 не могут быть вложенными. Печаль.
-
Если кто не знает,
cargo
— это система сборки и управления зависимостями языка Rust. ↩ -
Для меня отображение именно пользователя репозитория, а не локального, довольно существенно, поскольку на данный момент я работаю из дома и у меня имеются как личные, так и рабочие проекты, которые нужно вести под разными аккаунтами. ↩