Skip to content

shikhalev/xbash

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

60 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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:

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

    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 задано короткое имя 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. В них предполагаются следующие установки:

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

    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 — модули в первой отключаются полностью, во второй и третьей только функции формирования списка команд и приглашения соответственно. Важно: эти переменные — массивы и изменять их надо соответственно, например:

    xb_disable+=( 'git' );

TODO

До версии 0.1-alpha

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

До версии 0.9-beta

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

До релиза 1.0

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