An open API service indexing awesome lists of open source software.

https://github.com/shikhalev/xbash

bash-extensions for prompt and subcommands
https://github.com/shikhalev/xbash

bash command-line programming shell shell-extensions

Last synced: 2 months ago
JSON representation

bash-extensions for prompt and subcommands

Awesome Lists containing this project

README

          

# xbash

Расширение оболочки bash для удобства разработки.

-----


Скриншот

При разработке в Linux зачастую активно используется командная строка, причем значительную часть команд
составляют субкоманды системы управления версиями, такой как `git`, и системы сборки и управления
зависимостями, например `cargo` (для языка Rust), или `gem` (для Ruby).

Это расширение позволяет делать следующее:

* Использовать субкоманды напрямую, т.е. писать `commit` вместо `git commit` и `run` вместо `cargo run`.

При этом такая подстановка активна, только когда мы находимся внутри каталога проекта. И, соответственно,
не для всех возможных систем управления версиями и сборки, а для тех, которые задействованы в текущем
проекте.

* В приглашении командной строки отображать кратко некоторые элементы состояния проекта и репозитория.

## Текущая версия

**0.1.3-alpha** — глубокий пре-релиз, активная разработка. Хотя пользоваться уже можно.

*В пререлизе возможны несовместимые изменения даже между минорными версиями.*

## Установка и использование (пререлизной версии)

1. Сохранить куда-то каталог с исходниками (склонировать репозиторий, скачать и распаковать релиз — непринципиально).
Куда поместить, тоже непринципиально, пусть это будет, скажем — `$HOME/scripts/xbash/`.

2. Добавить загрузку в `$HOME/.bashrc`:

```bash
source $HOME/scripts/xbash/xbash.bash
```
3. Создать конфигурационный файл `$HOME/.config/xbash` с одной строчкой:

```bash
xb_user_dir=$HOME/scripts/xbash/xbash
```

4. Войти в shell, например, открыв заново любимый эмулятор терминала.

## Принцип работы и особенности реализации

### Организация кода

Основной код находится во включаемом файле xbash.bash, однако работа с конкретными системами определяется
в соответствующих модулях. Каждый такой модуль определяет функцию проверки применимости (обязательно) и
одну или обе из функций для формирования а) приглашения командной строки, б) списка алиасов команд.

Эти фунции, в случае применимости будут вызваны из `$PROMPT_COMMAND` и `command_not_found_handle()` соответственно.

Важно: обработка через `command_not_found_handle()` означает, что *субкоманды никогда не перекрывают команды
из `$PATH`, встроенные конструкции bash или синонимы заданные через `alias`*. Таким образом, мы не можем задать
перенаправление `diff => git diff` — будет вызвана `/usr/bin/diff` еще до нашей обработки; вместо этого
в модуле [`git.bash`](xbash/git.bash) задано короткое имя `g-diff`. Аналогично, префиксами устраняются конфликты
между разными системами сборки, так, например, `git clean` становится `g-clean`, чтобы не конфликтовать
с `clean => cargo clean`, и, с другой стороны, `cargo fetch` сокращено до `c-fetch`, поскольку `fetch => git fetch`
представляется куда более часто используемым. Запоминать редко используемые сокращения не обязательно, поскольку
а) есть функция `xb_info`, которая выводит их список; и б) всегда можно использовать полный вариант — `git clean`,
например.

### Конфигурационные файлы

Для управления настройками есть два файла: `/etc/xbash` и `$HOME/.config/xbash`. В них предполагаются следующие установки:

* Во-первых, пути к модулям. Это могут быть три каталога, задаваемые тремя переменными, по-умолчанию такие:

```bash
xb_vendor_dir=/usr/share/xbash;
xb_system_dir=/etc/xbash.d;
xb_user_dir=$HOME/.local/xbash;
```

* Во-вторых, отключения отдельных модулей, чтобы не удалять их из вышеуказанных каталогов. Для этого есть три переменные:
`xb_disable`, `xb_disable_commands` и `xb_disable_prompt` — модули в первой отключаются полностью, во второй и третьей
только функции формирования списка команд и приглашения соответственно. Важно: *эти переменные — массивы и изменять их
надо соответственно*, например:

```bash
xb_disable+=( 'git' );
```

## TODO

### До версии 0.1-alpha

- [x] Сформировать список команд `git` и отладить.
- [x] Сделать prompt для `git`.
- [x] Сделать функцию `xb_info()`.
- [x] Сделать определение репозитория, даже когда мы глубоко внутри.

### До версии 0.9-beta

- [ ] Аналогично предыдущему для
- [x] `cargo`,
- [ ] `jekyll`,
- [ ] `hg`,
- [ ] `bundle`,
- [ ] `gem`.
- [ ] Доработать `xb_info()` до визуальной ясности.
- [ ] Сделать инсталлятор (вероятнее всего — через `make install`).
- [ ] Языки и цветовые схемы.
- [ ] Написать полноценное README:
- [x] Для чего нужно,
- [x] Установка,
- [x] Коротко о настройке.
- [ ] По модулям.
- [ ] Английская версия (обязательно!)

### До релиза 1.0

- [ ] Отладить.
- [ ] Документировать.
- [ ] Подумать об опакечивании (под вопросом).
- [ ] Автодополнение (completion) — под вопросом.