MarkMello v0.4.0: развитие MD-редактора

от автора

Всем привет!

В мае я опубликовал на Хабре первую статью о 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/