Всем привет!
В мае я опубликовал на Хабре первую статью о MarkMello.

Сайт · GitHub · Telegram · Поддержать проект
Изначальная задача была простой: сделать лёгкое приложение, которое быстро открывает локальный Markdown-файл сразу в режиме чтения.
Без запуска IDE, обязательного workspace, облачного аккаунта, базы данных и прочего лишнего для этого сценария.
После публикации мне начали писать пользователи. В основном благодарили за программу, сообщали об ошибках и предлагали функции, которых им не хватало. Появились issues и внешние pull request’ы.
Некоторые предложения я сначала не хотел принимать. Любой небольшой viewer довольно легко превратить в тяжёлый редактор, который умеет всё, но перестаёт нормально выполнять исходную задачу.
При этом часть предложенных функций действительно была нужна. В том числе мне самому.
Поэтому в версии 0.4.0 MarkMello получил поддержку папок, вкладок, файловых операций и поиска. Основной single-file сценарий при этом остался отдельным и быстрым.
Что изменилось

Открытие папок
Теперь можно открыть не только отдельный файл, но и папку с документами:
-
через меню;
-
сочетанием
Ctrl+Shift+O; -
перетаскиванием папки в окно.
Слева появляется файловое дерево. Поддерживаемые документы открываются в MarkMello, остальные файлы видны, но отображаются приглушёнными и остаются инертными.
Дерево загружается лениво. При открытии папки читается только её корень, содержимое подкаталогов — при первом раскрытии. Предварительного рекурсивного обхода и индексирования нет.
Служебные каталоги .git, node_modules, bin и obj скрываются.

Вкладки
Документы из папки открываются во вкладках.
У каждой вкладки сохраняются:
-
позиция прокрутки;
-
режим редактирования;
-
несохранённые изменения;
-
текущее состояние документа.
Переключение вкладки не приводит к повторному чтению файла и пересборке документа. Есть Ctrl+W, Ctrl+Tab, обратное переключение и меню переполнения для вкладок, которые не помещаются в окно.
Вторая папка открывается в отдельном окне. У каждого окна свой набор вкладок и своя сессия.
При повторном открытии папки восстанавливаются открытые вкладки и раскрытые каталоги. При обычном запуске MarkMello последнюю папку автоматически не открывает.

Файловые операции
Из дерева можно:
-
создать файл или папку;
-
переименовать;
-
дублировать;
-
показать файл в системном файловом менеджере;
-
удалить.
Удаление отправляет объект в корзину ОС.
Если переименовать открытый файл, его вкладка обновит путь и продолжит работать. При удалении закрываются связанные вкладки, но несохранённые изменения не теряются молча.

Отслеживание внешних изменений
После открытия папки запускается файловый watcher.
Если файл изменён другой программой, MarkMello обновляет дерево и открытый документ. Чистая вкладка перезагружается автоматически.
Если во вкладке есть несохранённые изменения, приложение предлагает выбрать: загрузить внешнюю версию или оставить текущие правки.
Переименование и удаление файлов на диске также обрабатываются.
Watcher создаётся только для открытой папки. В обычном single-file запуске его нет.

Поиск файлов по имени
В сайдбаре появился поиск по именам файлов внутри открытой папки.
Это не полнотекстовый поиск и не индексатор. Содержимое документов не читается.
Поиск работает в фоне, предыдущий запрос отменяется при изменении строки. Количество просматриваемых файлов и результатов ограничено, чтобы большая директория не блокировала интерфейс.
Esc очищает строку поиска.

Поиск внутри документа
Добавлен обычный Ctrl+F.
Совпадения подсвечиваются в документе, между ними можно перемещаться вперёд и назад. Поиск работает как в режиме чтения, так и в редакторе.
Функцию реализовал mjalalimanesh в PR #29.
Отдельно благодарю его за полноценную реализацию с локализацией, тестами, навигацией и корректной работой при перестроении документа.

Работа с буфером обмена
У блоков кода появилась кнопка Copy, которая копирует исходный код без fence-маркеров и названия языка.
Для выделенного фрагмента доступны дополнительные действия:
-
скопировать ссылку;
-
скопировать несколько ссылок списком;
-
скопировать выделение для Telegram Desktop с сохранением форматирования и кликабельных ссылок.

Mermaid и локальные ссылки
MarkMello отображает Mermaid-диаграммы внутри документа.
Рендер выполняется локально, внутри процесса, без WebView, Node.js и сетевых запросов. Дополнительная обработка запускается только при наличии Mermaid-блока.
Также работают относительные ссылки между локальными Markdown-файлами. Теперь папку с документацией можно использовать как связанный набор документов, не открывая IDE.
Что со скоростью
Workspace-подсистема не создаётся при открытии отдельного файла. Сайдбар, вкладки, watcher и файловые операции не входят в single-file startup path.
Производительность измерялась на AOT-сборках после основных этапов реализации.
В финальном парном прогоне:
|
Метрика |
До финального этапа |
После |
|---|---|---|
|
Документ готов к чтению |
472,2 мс |
479,5 мс |
|
Рабочее множество |
202,4 МБ |
199,4 МБ |
Разница по времени находится в пределах измерительного шума. Потребление памяти не выросло.
Дополнительная инициализация перенесена в момент открытия папки. Для меня это принципиальное ограничение: если работа с папками начинает замедлять обычное открытие одного файла, такая реализация в релиз не идёт.
Контрибьюторы
Благодарю разработчиков, чьи изменения вошли в MarkMello:
-
Alex-ok2005 — исправления Windows shell, запуск без лишней консоли и двойной клик по заголовку окна;
-
DemchaAV — корректное разворачивание окна на текущем мониторе в сложных многомониторных конфигурациях;
-
romanilyin — работа с буфером обмена, копирование для Telegram, встроенные
data:image, autolinks, клавиатурная навигация и исправления выделения; -
mjalalimanesh — поиск внутри документа.
Нужны ли MarkMello плагины
Мне предложили добавить поддержку плагинов.
Идея понятная: оставить ядро MarkMello небольшим, а специфические функции вынести в расширения. Тогда каждый сможет реализовать нужный ему сценарий, не добавляя его в основное приложение.
Но plugin runtime — это отдельная подсистема: API, жизненный цикл, совместимость версий, интеграция с интерфейсом, изоляция ошибок и контроль влияния на производительность.
Я пока не решил, нужна ли MarkMello такая система.
Интересно мнение пользователей и разработчиков. Нужны ли плагины в подобном приложении? Какие расширения вы бы установили или написали сами? Пишите в комментариях.
Заключение
MarkMello остаётся viewer-first приложением. Новые функции возможны, если они решают реальную задачу и не ухудшают основной сценарий.
Если у вас есть идеи или конкретные проблемы, создавайте issue на GitHub или пишите в Telegram.
Также я открыт к новым проектам и задачам по разработке и архитектуре. Связаться со мной можно в Telegram: @g2a_2.
Актуальный релиз: MarkMello 0.4.0
Тем, кто ждет сбросов лимитов Codex и Claude Code, есть мой открытый проект и канал в тг — https://t.me/quotaradar.
Сайт · GitHub · Telegram · Поддержать проект
Всем продуктивного кодинга!
P.S. Казанцев и жителей Татарстана с днем города и республики! Сау булыгыз!
ссылка на оригинал статьи https://habr.com/ru/articles/1076414/