Helix Editor, популярный модальный текстовый редактор с поддержкой множества современных функций, выпустил долгожданное обновление версии 25.07, которое принесло масштабные изменения и нововведения. В центре внимания данной версии — замена одного из ключевых компонентов Helix, связанного с интеграцией Tree-sitter, а также множество новых возможностей, упрощающих рабочие процессы разработчиков и пользователей редактора в целом. Helix изначально позиционируется как мощный редактор с поддержкой множественного выделения, интеграции протоколов Language Server Protocol (LSP) и экспериментальной поддержки Debug Adapter Protocol (DAP). В версии 25.
07 команда разработчиков сделала серьезный шаг вперед, пересмотрев подход к использованию Tree-sitter — инструмента для создания высокопроизводительных парсеров с поддержкой инкрементального разбора. Одним из ключевых нововведений стал релиз нового набора связок с Tree-sitter под названием Tree-house. Новый компонент заменил устаревшие официальные биндинги и снял с Helix огромный пласт устаревшего кода. Tree-house разработан с нуля, учитывая все недостатки прежнего решения, и открывает новые горизонты для улучшения производительности и функциональности редактора. Tree-sitter — это фреймворк, позволяющий создавать быстрые и устойчивые к ошибкам парсеры, основанные на грамматическом описании языка программирования.
Эти парсеры разбирают текст не целиком заново, а только измененные участки (инкрементально), что позволяет значительно ускорить работу редакторов и инструментов анализа кода. В Helix Tree-sitter применяется для синтаксической подсветки, распознавания текстовых объектов и отступов. Старый механизм подсветки, основанный на crate tree-sitter-highlight, показал себя недостаточно эффективным при работе с большими и сложными документами. Он создавал полные итераторы по подсветке заново при каждом изменении, не пользуясь преимуществами инкрементального парсинга. Helix ранее даже использовал форк этого хранилища, но код стал слишком сложным и трудно поддерживаемым.
Tree-house отличается модульной архитектурой, улучшенной логикой инъекций и поддержкой параллельного разбора в будущем. Инъекции — это технология, позволяющая переключаться между языками в пределах одного документа. Например, Markdown-документ может содержать фрагменты кода на Rust, которые анализируются и подсвечиваются отдельно, сохраняя контекст и позволяя работать с ними на уровне синтаксиса настоящего языка программирования. Интересной особенностью Tree-house является продвинутая работа с локальными определениями (locals). В традиционных решениях локальные переменные и параметры функции подсвечивались только если попадали в видимую область редактора, что вызывало проблемы при большом объеме кода.
Новая система хранит информацию о таких определениях на уровне парсинга и позволяет точно подсвечивать их ссылки по всему документу, даже если оригинальный блок уже не отображается на экране. Помимо абсолютного ядра, в 25.07 была добавлена удобная система навигации с помощью нового файлового проводника, доступного по сочетанию клавиш <space>e. В отличие от стандартного файлового браузера, который рекурсивно показывает содержимое каталогов, новый проводник представляет собой многоуровневое меню с возможностью точечного анализа структуры проекта, что помогает быстрее находить нужные файлы и исследовать иерархию каталогов. Для пользователей, активно использующих возможности Language Server Protocol, стала доступна повышенная визуальная информативность.
Теперь Helix запрашивает данные о цветах из поддерживаемых серверов (например, tailwindcss-language-server или vscode-css-language-server) и отображает небольшие цветовые индикаторы прямо в тексте. Эта функция работает аналогично подсказкам типа inlay hints для типов данных, делая редактирование тем и стилей более удобным и наглядным. Командный режим в Helix (доступный по ключу :) подвергся полной переработке — была изменена система разбора и автодополнения команд и их аргументов, что решило давно существующие проблемы, например, с обработкой файлов с пробелами в именах. Нововведения включают поддержку флагов, похожих на удобные ключи в shell-командах, и расширений, которые позволяют динамически подставлять переменные и запускать внешние shell-команды без трудностей с экранированием. Флаги стали доступны в ряде команд, включая семейство :write и команду :sort, улучшая гибкость и упрощая синтаксис.
Теперь для обратной сортировки нет необходимости использовать отдельную команду :rsort — вместо этого применяется :sort с флагом --reverse или -r. Аналогично, при сохранении файла с помощью :write можно отключить автоматическое форматирование через --no-format, что полезно в специфичных сценариях. Расширения или expansions позволяют использовать внутри команд переменные, основанные на состоянии редактора, такие как имя текущего файла (%{buffer_name}) или номер курсора (%{cursor_line}), а также выполнять shell-скрипты прямо из командной строки с помощью синтаксиса %sh{...
}. Благодаря этому команда вроде :echo %sh{git blame -L %{cursor_line},+1 %{buffer_name}} выведет информацию о последнем изменении строки прямо в статусную строку, что значительно повышает удобство работы с историей изменений. Кроме того, расширенный парсер командной строки получил модулярность, что позволило создавать более сложные и специфичные конструкции, заложив основу для дальнейшего расширения функционала Helix. Команды вроде :set-option и :toggle-option теперь могут надежно обрабатывать сложные конфигурационные значения в формате JSON, а shell-команды не конфликтуют с внутренними правилами интерпретации командной строки. Возвращаясь к Tree-house, стоит отметить, что новая система инъекций грамматик реализует концепцию дерева слоёв, где каждый уровень представляет собой отдельный синтаксический разбор с возможностью гибкого переключения между языками.
Это особенно важно при работе с многоязыковыми файлами, такими как Markdown с встроенными блоками кода, где вложенность уровней может быть очень глубокой, включая встроенный Markdown внутри комментариев Rust-кода. Обновленная реализация инкрементальных инъекций оптимизирует переработку только тех слоёв документа, которые изменились, что значительно ускоряет отображение и минимизирует нагрузку на процессор. Это особенно важно для проектов с большими документами и множеством языков. Еще одна полезная инновация — интегрированная поддержка поиска и обработки инъекционных слоёв посредством новых API-типов Syntax, TreeCursor и QueryIter, которые позволяют без дополнительного сканирования обходить и применять запросы ко всем слоям документа. Это даст возможность в будущем унифицировать работу со структурами кода, улучшить автоматическую расстановку отступов, навигацию и другие Tree-sitter базированные функции.
Обновление Helix 25.07 — это не только технический прорыв с практическими выгодами, но и смелый шаг к построению масштабируемой и гибкой архитектуры редактора, которая выведет возможности текстовой обработки и подсветки на новый уровень. Пользователи получат более быструю, отзывчивую и умную среду, с расширенными возможностями навигации и анализа кода. Отдельно хочется отметить вовлеченность большого сообщества — обновление собрало изменения от 195 различных участников, что подчёркивает активное развитие и высокий интерес к проекту. Подытоживая, релиз 25.
07 в Helix Editor можно считать эпохальным событием в эволюции редактора. Новые возможности, улучшения интерфейса и глубокие изменения в ядре дают надежду на перспективное будущее проекта и положительный опыт для всех пользователей, будь то разработчики, технари или просто любители эффективной работы с текстом.