ninja - редактор (IDE) в стиле Smalltalk, но для разных языков программирования
0.0.0-prealpha
Ментальная карта проекта находится по адресу: https://www.mindmeister.com/ru/map/2103949991.
ninja рекурсивно обходит список включений (INC) проекта, и определяет по расширению или первой строке (которая #!/bin/<интерпретатор>) язык на котором написан файл, и, тут же, парсит его, определяя неймспейсы, классы, категории и методы, которые в нём содержатся.
Данная информация кешируется в ~/.cache/ninja-editor/<проект>/<включение>/<путь к файлу относительно включения>.
При переходе по секциям информация будет обновляться.
Парсинг файлов подсчитывает фигурные скобки (или их аналоги, например, do..end для Ruby или begin..end для Pascal-я), однако если в скобках будут ошибки, то парсер восстановится основываясь на отступах.
- perl-common-sense
- perl-data-printer
- perl-json-xs
- perl-tk
$ git clone https://github.com/darviarush/ninja.git
$ cd ninja
$ perl ninja.plДля установки библиотек perl использующихся редактором выполните (только для дистрибутивов на основе archlinux):
$ sudo pacman -S perl-common-sense perl-json-xs perl-tk
$ sudo pikaur -S perl-data-printerДля запуска редактора:
$ ninja
При этом откроется окно со списком проектов в котором нужно будет выбрать проект для программирования или создать новый.
Так же открыть проект можно, запустив ninja в базовом каталоге c опцией ".".
$ cd my-project-repository
$ ninja .-
Включениями называется список каталогов в которых производится рекурсивный поиск файлов.
-
Проект состоит из:
- Базового каталога. Этот каталог является базовым для .
- Списка включений. Такой список может содержать каталоги
src,libили вообще . - Списка исключений для включений - предотвращает поиск в указанных каталогах, например,
.git. - Списка исключений расширений - файлы с указанными расширениями не будут парсится.
-
Секциями называются списки пакетов (неймспейсов), классов, категорий и методов.
- Секция пакетов служит для отображения неймспейсов для классов. Если же неймспейс не указан, то наименование пакета будет браться из части пути между включением и файлом. Например,
Ninja/tk. - Секция классов - отображает классы, но в смешанных и не ООП языках программирования, это будут так же модули. Например, для C, это будет название файла в котором находятся функции.
- Секция категорий содержит категории методов. Категория указывается специальным комментарием, например:
#@category Инициализация. - Секция методов показывает методы в выбранной категории. Методами так же считаются функции, макросы (
#defineв С/С++), процедуры и подпрограммы.
На самом деле, что именно считать пакетами, классами, категориями и методами, зависит от монитора и гения (парсера) конкретного языка программирования.
- Секция пакетов служит для отображения неймспейсов для классов. Если же неймспейс не указан, то наименование пакета будет браться из части пути между включением и файлом. Например,
Архитектура ninja состоит из трёх основных элементов:
- Отображения - то есть самого редактора.
- Наблюдателя, который наблюдает за изменениями в дереве файловой системы от включений проекта.
- Гениев - когда наблюдатель обнаруживает новый или изменённый файл, он определяет его тип и парсит соответствующим парсером (гением).
Отображение запрашивает у наблюдателя списки или изменение файлов. Наблюдатель поддерживает базу в соответствии с исходными текстами программы.
Мониторы, которые можно выбрать для проекта:
-
Sector - считает за класс название файла, а за пакет - часть пути файла от включения до файла.
Так же классы, имя файла которых совпадает с подкаталогом в этом же каталоге, . Например:
Достоинства:
- Нагружает систему только во время считывания пакетов.
- Нет кеша - значит информация всегда актуальна.
Недостатки:
- Не учитывает неймспейсы.
- Если в файле несколько классов, то они принимаются за категории.
-
TODO:Space - периодически обходит все включения и перечитывает изменившиеся файлы.Достоинства:
- В качестве пакетов используются неймспейсы.
- Учитываются все классы, в том числе разделяющие один файл и вложенные.
Недостатки:
- Постоянно напрягает систему, так как должен всегда обходить дерево каталогов: изменились ли они или нет.
🌍 GPLv3
© Yaroslav O. Kosmina dart@cpan.org, 2021
