Zed, Sublime Text, Atom-подобные и новая волна редакторов
В предыдущей статье мы разобрали редактор, который забрал себе рынок. Логичный вопрос: если VS Code настолько хорош, зачем в 2026 году вообще существуют другие редакторы — и почему новые продолжают появляться?
Ответ не сводится к «на вкус и цвет». За последние пятнадцать лет индустрия прошла полный цикл: нативные редакторы на C++ (Sublime Text), затем веб-стек ради расширяемости (Atom, VS Code), затем возврат к нативному коду ради задержки (Zed, Helix, Lapce), а поверх всего этого — волна форков VS Code, продающих не редактор, а AI-агента внутри него. Каждый виток решал реальную боль предыдущего и заводил собственную.
Эта статья — про то, какие инженерные решения стоят за новой волной, чем за них платят и когда переход окупается. Много конфигов, немного истории и очень мало восторгов: у каждого героя здесь есть раздел «где он проигрывает», и он не декоративный.
Часть 1. Четыре поколения и что двигало каждым
Сначала карта. Она объясняет, почему одни и те же идеи всплывают заново под новыми именами.
Из этой карты видно главное: новая волна выросла из двух конкретных технических сдвигов, а не из моды.
Первый сдвиг — LSP и DAP. Пока язык понимал только сам редактор, новый редактор был
обречён: он стартовал с нулевой поддержкой языков, и никто им не пользовался, потому что
там нет автодополнения для TypeScript, и никто не писал автодополнение, потому что там нет
пользователей. LSP разорвал этот круг. Сегодня любой редактор получает приличную поддержку
двадцати языков за неделю работы: запусти gopls, rust-analyzer, tsserver — и всё.
Порог входа для нового редактора упал на порядок.
Второй сдвиг — Tree-sitter. Раньше подсветка синтаксиса писалась регулярками (TextMate-грамматики), работала плохо на больших файлах и не давала структуры. Tree-sitter даёт настоящее дерево разбора, обновляемое инкрементально за время, пропорциональное размеру правки, а не файла. Из дерева бесплатно получаются: подсветка, сворачивание блоков, структурные текстовые объекты, «умное» выделение, навигация по символам без языкового сервера. Ещё один кусок работы, который новому редактору больше не надо делать самому.
Третий, менее технический: у людей появились мониторы 120 Гц и привычка к отзывчивости. Задержка, которую в 2015 году никто не замечал, в 2026 воспринимается как «редактор тупит».
Часть 2. Про задержку — без религии
«Быстрый редактор» — самый заезженный маркетинговый тезис новой волны. Разберёмся, что за ним стоит физически, и где он честен.
Ключевое наблюдение: редактор контролирует не всю цепочку, а её середину. Клавиатура, ядро ОС и матрица монитора съедают десятки миллисекунд независимо от того, на чём написан редактор. Поэтому заявления вида «мы в 10 раз быстрее» почти всегда касаются одного звена, а воспринимаемая разница получается заметно скромнее.
Но есть свойство важнее среднего значения: предсказуемость. Редактор, который отвечает за стабильные 20 мс, ощущается лучше редактора со средними 15 мс и регулярными выбросами до 150 мс. Именно поэтому GC-паузы и синхронные плагины — главные враги: они бьют по хвосту распределения (p99), а не по среднему. Если вы измеряете отзывчивость, смотрите на p95/p99, среднее почти бесполезно.
Как замерить самому, а не верить блогам
Инструмент, ставший стандартом де-факто, — Typometer Павла Фатина, вместе с его статьёй Typing with Pleasure: он снимает экран, находит момент появления символа и строит распределение задержек. Читать её стоит целиком — там же разобрана психофизика восприятия задержки.
Быстрая проверка «на коленке», которая ловит 80 % проблем:
# 1. Найти реально тяжёлый файл в проекте — на маленьких разница не видна
find . -name '*.ts' -size +500k -o -name '*.json' -size +5M | head
# 2. Сгенерировать заведомо тяжёлый случай: одна строка на 5 МБ ломает
# почти любой наивный алгоритм переноса и подсветки
python3 -c "print('x' * 5_000_000)" > /tmp/one-long-line.txt
# 3. Файл с очень большим числом строк — проверяет структуру буфера
seq 1 3000000 | awk '{print \"line \" $1 \" :: value=\" $1*7}' > /tmp/many-lines.txt
Открывайте эти файлы в кандидатах и смотрите три вещи: время открытия, задержку при наборе
в середине файла и поведение при Ctrl+End. Результат обычно сильно расходится с рекламой
в обе стороны.
Где скорость правда решает, а где это фетиш
Честный список, по опыту:
| Скорость критична | Скорость почти не важна |
|---|---|
| Логи, дампы, CSV, миграции — файлы от 10 МБ | Обычный код: 90 % файлов меньше 2000 строк |
| Работа по SSH и на слабом железе | Локальная разработка на современном ноутбуке |
| Массовое редактирование мультикурсором | Работа, где основное время уходит на думание |
| Мониторы 120+ Гц: глаз замечает микрорывки | Внешний монитор 60 Гц |
| Огромные монорепозитории: поиск и индекс | Небольшой сервис на 200 файлов |
Если ваш рабочий день — это чтение чужого кода и вдумчивые правки по два десятка строк, выигрыш от смены редактора ради 15 мс будет околонулевым. Это нормально признать.
Часть 3. Zed — главный представитель новой волны
Zed делают выходцы из команды Atom (Натан Собо, Макс Брансфилд — автор Tree-sitter, Антонио Скандурра). Это важно: они уже один раз построили расширяемый редактор на веб-стеке, получили обратную связь про производительность и сознательно пошли другим путём.
Хронология на сегодня: исходники открыты в январе 2024 (анонс), редактор дошёл до версии 1.0 в конце апреля 2026, Windows стал полноценно поддерживаемой платформой, появился встроенный отладчик по DAP.
Архитектура: что именно сделано иначе
лицензия Apache-2.0"] GPU["Отрисовка через wgpu/Metal
текст и прямоугольники сразу на GPU"] GPUI --> GPU end subgraph CORE["Ядро текста"] ROPE["rope на базе SumTree
неизменяемая структура, чанки текста"] CRDT["CRDT-модель правок
совместное редактирование как базовая операция"] TS["Tree-sitter
инкрементальный разбор"] ROPE --> CRDT ROPE --> TS end subgraph EXT["Внешний мир"] LSP["Языковые серверы по LSP"] DAP["Отладчики по DAP"] WASM["Расширения в WebAssembly
изолированы от процесса UI"] ACP["Agent Client Protocol
внешние AI-агенты"] end CORE --> UI LSP -.->|асинхронно| CORE DAP -.->|асинхронно| CORE WASM -.->|песочница| CORE ACP -.->|отдельный процесс| CORE style GPUI fill:#2f6a5e,color:#fff style ROPE fill:#31506e,color:#fff style WASM fill:#6b4a2e,color:#fff
Три решения здесь принципиальны.
Собственный UI-фреймворк. GPUI не использует ни системные виджеты, ни браузерный движок: весь интерфейс — это прямоугольники и глифы, отправляемые на видеокарту. Плюс — полный контроль над кадром и отсутствие слоя DOM между нажатием и пикселем. Минус, который надо называть вслух: всё приходится писать самому. Доступность (screen readers), методы ввода для иероглифических языков, поведение выделения по правилам ОС, контекстные меню — то, что в Electron приходит бесплатно, здесь годами доводится руками. Часть претензий к Zed от пользователей вспомогательных технологий и от людей, пишущих на CJK-языках, растёт именно отсюда.
Rope на SumTree. Текст хранится не как массив строк, а как дерево кусков с агрегатами в узлах. Правка не мутирует структуру, а создаёт новую версию, переиспользуя всё, кроме пути от корня до изменённого листа.
Стоимость операций при n байт текста:
| Операция | Массив строк | Rope / SumTree |
|---|---|---|
| Вставка символа в середину | O(n) копирования | O(log n) |
| Позиция «строка/колонка» → смещение | O(строк) или отдельный индекс | O(log n) по агрегатам |
| Снапшот текущего состояния | O(n) копия | O(1), структурное разделение |
| Undo на 50 шагов назад | хранить дельты и накатывать | взять старую версию, она жива |
| Отдать текст фоновому потоку | нужен lock или копия | отдать неизменяемый снапшот |
Последние две строки важнее скорости вставки. Именно бесплатные снапшоты позволяют Zed считать подсветку, поиск, автоформатирование и синхронизацию с языковым сервером в фоне и без блокировок, зная, что текст под руками не изменится. Это архитектурная причина низкого p99, а не микрооптимизации.
Расширения в WebAssembly. Zed не даёт расширениям доступ к процессу UI. Расширение — это wasm-модуль с узким API: объявить язык, подтянуть грамматику Tree-sitter, скачать и запустить языковой сервер или отладчик, добавить тему или slash-команду для агента. Плюс — расширение почти не может подвесить редактор и не может незаметно читать что попало. Минус — потолок возможностей заметно ниже, чем у VS Code: полноценно нарисовать собственную панель или переопределить поведение редактора расширением, как правило, нельзя. Это осознанный размен «мощность плагинов ↔ гарантия отзывчивости», и он ровно противоположен выбору Emacs, который мы разбирали в статье про Emacs.
Конфигурация Zed: рабочий settings.json
Конфиг живёт в ~/.config/zed/settings.json (на macOS там же), проектный —
в <проект>/.zed/settings.json и мержится поверх пользовательского. Формат — JSON
с комментариями, как в VS Code, что сильно облегчает миграцию.
{
// ── Внешний вид и текст ─────────────────────────────────────────────
"theme": { "mode": "system", "light": "One Light", "dark": "One Dark" },
"buffer_font_family": "JetBrains Mono",
"buffer_font_size": 14,
"buffer_line_height": { "custom": 1.6 },
"ui_font_size": 15,
// Вертикальные направляющие вместо «догадайся, где 100 символов»
"wrap_guides": [88, 120],
"show_wrap_guides": true,
"relative_line_numbers": true, // осмысленно только вместе с vim_mode
// ── Модальное редактирование ────────────────────────────────────────
// Vim-режим в Zed встроен, а не является расширением: он знает про
// мультикурсоры и панели, чего эмуляторы обычно не умеют.
"vim_mode": true,
"cursor_blink": false,
// ── Поведение при сохранении ────────────────────────────────────────
"format_on_save": "on",
"remove_trailing_whitespace_on_save": true,
"ensure_final_newline_on_save": true,
"autosave": { "after_delay": { "milliseconds": 2000 } },
// ── Терминал ────────────────────────────────────────────────────────
"terminal": {
"font_family": "JetBrains Mono",
"font_size": 13,
"shell": { "program": "/bin/zsh" },
"working_directory": "current_project_directory",
"env": { "EDITOR": "zed --wait" } // git commit откроется в Zed
},
// ── Языки: настройки точечно, а не глобально ────────────────────────
"languages": {
"Rust": {
"tab_size": 4,
"language_servers": ["rust-analyzer"]
},
"Go": {
"tab_size": 4,
"hard_tabs": true,
"format_on_save": "on",
"code_actions_on_format": { "source.organizeImports": true }
},
"TypeScript": {
"tab_size": 2,
"formatter": {
// Внешний форматтер: prettier из node_modules проекта
"external": {
"command": "npx",
"arguments": ["prettier", "--stdin-filepath", "{buffer_path}"]
}
}
},
"Markdown": { "soft_wrap": "editor_width", "format_on_save": "off" }
},
// ── Настройки языковых серверов ─────────────────────────────────────
"lsp": {
"rust-analyzer": {
"initialization_options": {
"check": { "command": "clippy" },
"cargo": { "features": "all" },
"inlayHints": { "parameterHints": { "enable": false } }
}
},
"gopls": {
"initialization_options": {
"staticcheck": true,
"usePlaceholders": true
}
}
},
// ── Что не индексировать и не показывать ────────────────────────────
"file_scan_exclusions": [
"**/.git", "**/node_modules", "**/target", "**/dist",
"**/.venv", "**/__pycache__", "**/.terraform"
],
// ── Телеметрия: решение принимает пользователь, а не умолчание ──────
"telemetry": { "diagnostics": false, "metrics": false }
}
Проектный оверрайд — отдельный файл в репозитории, который стоит коммитить:
// .zed/settings.json — едет вместе с проектом
{
"languages": {
"Python": {
"language_servers": ["pyright", "ruff"],
"format_on_save": "on",
"formatter": [{ "language_server": { "name": "ruff" } }]
}
},
// Монорепозиторий: не сканируем чужие поддеревья
"file_scan_exclusions": ["**/vendor", "**/generated", "**/.next"]
}
Клавиши — ~/.config/zed/keymap.json. Механика похожа на VS Code, но контекст пишется
выражением, а не строкой when со своим синтаксисом:
[
{
// Действует везде
"bindings": {
"cmd-p": "file_finder::Toggle",
"cmd-shift-p": "command_palette::Toggle",
"cmd-shift-f": "pane::DeploySearch"
}
},
{
// Только в редакторе и только в normal-режиме Vim
"context": "Editor && vim_mode == normal",
"bindings": {
"space g s": "git_panel::ToggleFocus",
"space e": "project_panel::ToggleFocus",
"space t": "terminal_panel::ToggleFocus",
"] d": "editor::GoToDiagnostic",
"[ d": "editor::GoToPreviousDiagnostic",
// Многоклавишные последовательности пишутся через пробел —
// это полноценные аккорды, как leader-мэппинги в Neovim
"space c a": "editor::ToggleCodeActions"
}
},
{
"context": "Terminal",
"bindings": { "cmd-k": "terminal::Clear" }
}
]
Задачи (~/.config/zed/tasks.json или .zed/tasks.json) — аналог tasks.json из VS Code,
но заметно проще:
[
{
"label": "test: текущий файл",
"command": "cargo",
"args": ["test", "--", "$ZED_FILE_STEM"],
"use_new_terminal": false,
"allow_concurrent_runs": false
},
{
"label": "test: символ под курсором",
// ZED_SYMBOL подставляется из дерева Tree-sitter — не из регулярки
"command": "go",
"args": ["test", "-run", "$ZED_SYMBOL", "./..."],
"tags": ["go-test"]
}
]
Что в Zed действительно сделано хорошо
Мультибуфер. Результаты поиска по проекту, список диагностик, все места использования
символа открываются как один редактируемый буфер из фрагментов разных файлов. Правите
прямо там, сохраняете — изменения расходятся по исходникам. Это заметно удобнее, чем
переходить по списку найденного, и ближе всего к тому, что в Vim делают через quickfix и
:cdo (см. продвинутый Vim), только без ритуала.
Совместное редактирование. CRDT не прикручен сбоку, а лежит в основе буфера, поэтому парное программирование в Zed работает без отдельного «режима» — с общим терминалом и звуком. За это, впрочем, платят серверной инфраструктурой и аккаунтом.
AI как слой, а не как продукт. Помимо встроенной панели агента Zed продвигает Agent Client Protocol — попытку сделать для агентов то, что LSP сделал для языков: агент живёт отдельным процессом и говорит с редактором по открытому протоколу. Через ACP в Zed подключаются внешние агенты (Claude Code, Gemini CLI и другие). Это архитектурно честнее, чем зашивать одного вендора внутрь редактора, — и, что важнее для нас, это тот же принцип «редактор как оболочка вокруг протоколов», которым выиграл VS Code.
Где Zed проигрывает — без смягчений
- Экосистема расширений на порядки меньше. Специфический линтер, редкий фреймворк, корпоративный внутренний плагин — скорее всего, их просто нет, и написать аналог сложнее из-за узкого wasm-API.
- Доступность. Работа со screen reader в собственном UI-фреймворке — это годы работы, которые в Electron и нативных тулкитах уже сделаны кем-то другим.
- Аккаунт и облако. Часть функциональности (коллаборация, AI) завязана на сервисы Zed Industries. Для закрытых контуров это блокер, который надо проверять до миграции, а не после.
- Молодость. Даже после 1.0 частота изменений высокая; конфиги и названия действий иногда меняются между версиями. Для команды это означает регулярную правку общих dotfiles.
- Не «просто редактор». Zed весит как IDE и стартует как IDE. Для
git commitи правки/etc/hostsон не быстрее Vim и не легче.
Часть 4. Sublime Text — редактор, который просто продолжает работать
Sublime Text — контрпример ко всей моде. Разработка ведётся крошечной командой, продукт закрытый, платный, релизы редкие. И при этом он остаётся эталоном по одному параметру: он открывает и редактирует то, что остальные не открывают вообще.
Философия: C++ снизу, Python сверху
Ядро — нативный C++ с собственным рендерингом (в четвёртой версии добавили аппаратное ускорение, включаемое настройкой). Расширения — Python, исполняющийся в отдельном plugin host процессе. Это ровно та же идея изоляции, что у VS Code, только на пятнадцать лет раньше и без Electron.
Актуальная линия — Sublime Text 4. В сборке 4200 объявлен план миграции с Python 3.3 на 3.8 и далее (разбор от Sublime HQ), в dev-ветке идёт переход на более свежий Python. Ценообразование простое и старомодное: единовременные 99 $ за лицензию с тремя годами обновлений, лицензия на человека, работает на всех трёх ОС. Пробный период неограничен по времени, но с периодическим напоминанием о покупке.
Что стоит взять на вооружение даже не переходя
Три идеи Sublime разошлись по всей индустрии, но в оригинале они по-прежнему сделаны лучше:
- Goto Anything (
Ctrl+P) с составным синтаксисом. Не просто фаззи-поиск файла:src/mod@parse— файл плюс символ внутри,:180— строка,#todo— поиск по содержимому,@без файла — символы в текущем. Все команды комбинируются в одной строке. - Мультикурсор как основной способ массового редактирования.
Ctrl+Dдобавляет следующее вхождение слова,Alt+F3— все сразу,Ctrl+Shift+Lразбивает выделение на курсоры по строкам. Для перекладывания CSV, правки конфигов и переписывания списков это быстрее регулярок и точно нагляднее. .sublime-syntax— YAML-описание грамматики со стековым автоматом. Формат, который заменил регулярочные.tmLanguageи до сих пор остаётся образцом читаемости.
Конфигурация: всё это просто JSON-файлы
Настройки — Packages/User/Preferences.sublime-settings (открывается через
Preferences → Settings):
{
"font_face": "JetBrains Mono",
"font_size": 13,
"line_padding_bottom": 2,
// Хардварный рендер — по умолчанию выключен, на многих машинах даёт заметный прирост
"hardware_acceleration": "opengl",
"rulers": [88, 120],
"highlight_line": true,
"draw_white_space": ["selection", "trailing"],
"trim_trailing_white_space_on_save": "not_on_caret",
"ensure_newline_at_eof_on_save": true,
"translate_tabs_to_spaces": true,
"tab_size": 4,
// Не индексировать мусор — прямое влияние на скорость Goto Anything
"index_exclude_patterns": ["*.log", "*.min.js", "*.map"],
"folder_exclude_patterns": [".git", "node_modules", "target", "dist", ".venv"],
"binary_file_patterns": ["*.png", "*.jpg", "*.pdf", "*.zip", "*.woff2"],
// Мелочь, экономящая часы: не создавать «...» файлы рядом с исходниками
"atomic_save": false,
"hot_exit": "always",
"remember_open_files": true
}
Проект — файл .sublime-project, который стоит коммитить в репозиторий:
{
"folders": [
{
"path": "backend",
"folder_exclude_patterns": ["target", ".pytest_cache"]
},
{
"path": "frontend",
"file_exclude_patterns": ["*.lock"],
"folder_exclude_patterns": ["node_modules", ".next"]
}
],
"settings": {
"tab_size": 2,
"LSP": {
"pyright": { "enabled": true },
"rust-analyzer": { "enabled": true }
}
},
"build_systems": [
{
"name": "Тесты проекта",
"shell_cmd": "make test",
"working_dir": "$project_path",
// Парсер вывода: клик по ошибке открывает нужную строку
"file_regex": "^(...*?):([0-9]*):?([0-9]*)",
"variants": [
{ "name": "Только текущий файл", "shell_cmd": "pytest $file -q" }
]
}
]
}
Современная поддержка языков ставится пакетом
LSP через Package Control плюс пакеты-обёртки
(LSP-pyright, LSP-rust-analyzer, LSP-typescript). Работает это добротно, но честно:
на пару лет отстаёт от VS Code по полноте — inlay hints, некоторые code actions и
свежие возможности протокола появляются позже.
Плагин на Python за 20 строк
Здесь Sublime до сих пор приятнее всех: API синхронный, документация короткая, цикл правки —
сохранил файл, плагин перезагрузился. Никакой сборки, package.json и активационных событий.
# Packages/User/copy_github_link.py
# Копирует ссылку на текущую строку в GitHub — то, ради чего обычно ставят расширение.
import subprocess
import sublime
import sublime_plugin
class CopyGithubLinkCommand(sublime_plugin.TextCommand):
"""Команда уровня текста: имеет доступ к буферу, выделению и курсорам."""
def run(self, edit):
path = self.view.file_name()
if not path:
sublime.status_message("Файл не сохранён на диск")
return
folders = self.view.window().folders()
root = next((f for f in folders if path.startswith(f)), None)
if root is None:
sublime.status_message("Файл вне открытых папок проекта")
return
def git(*args: str) -> str:
# cwd=root — важно: иначе git отработает в каталоге запуска Sublime
return subprocess.check_output(("git",) + args, cwd=root).decode().strip()
try:
remote = git("remote", "get-url", "origin")
commit = git("rev-parse", "HEAD")
except subprocess.CalledProcessError:
sublime.status_message("Это не git-репозиторий")
return
# git@github.com:org/repo.git → https://github.com/org/repo
repo = remote.replace("git@github.com:", "https://github.com/")
repo = repo.removesuffix(".git")
rel = path[len(root):].lstrip("/")
# row() возвращает индекс с нуля, GitHub нумерует с единицы
row = self.view.rowcol(self.view.sel()[0].begin())[0] + 1
sublime.set_clipboard(f"{repo}/blob/{commit}/{rel}#L{row}")
sublime.status_message(f"Скопировано: {rel}#L{row}")
def is_enabled(self) -> bool:
# Пункт в меню будет серым, если условие ложно
return self.view.file_name() is not None
Привязка — в Packages/User/Default.sublime-keymap:
[
{ "keys": ["ctrl+alt+g"], "command": "copy_github_link" },
{
"keys": ["ctrl+shift+r"],
"command": "show_overlay",
"args": { "overlay": "goto", "text": "@" }
}
]
Обратите внимание на имя команды: класс CopyGithubLinkCommand автоматически становится
командой copy_github_link. Эта конвенция — весь «фреймворк», который нужно выучить.
Честно о минусах Sublime
- Закрытые исходники и единственная точка отказа — крошечная команда. Если разработка остановится, форкнуть будет нечего.
- Темп релизов. Между значимыми версиями проходят годы. Свежие возможности LSP, интеграция с AI, поддержка новых форматов приезжают заметно позже.
- Экосистема сжалась. Package Control жив, но многие пакеты не обновлялись с эпохи Sublime Text 3; часть авторов ушла в VS Code.
- Нет встроенной отладки. Есть сторонние обёртки, но опыт несравним с VS Code или JetBrains.
- Платно в мире, где два главных конкурента бесплатны. 99 $ — небольшая сумма для профессионала, но в компании это ещё и процедура закупки.
Практический вывод: Sublime Text сегодня чаще держат вторым редактором — для гигантских файлов, быстрых массовых правок и «просто посмотреть». Как основной он отлично работает у тех, кто ценит стабильность инструмента выше свежести возможностей.
Часть 5. Atom: что он дал миру и почему умер
Atom объявили «hackable text editor for the 21st Century» в 2014-м, а 15 декабря 2022 года GitHub его выключил. История поучительна не как некролог, а как разбор архитектурной ошибки.
тысячи пакетов, apm Рост --> Проблема: пакеты работают в том же
потоке, что и интерфейс Проблема --> Симптомы: подвисания при наборе,
секунды на старт, «тормозит» Симптомы --> Конкуренция: VS Code делает то же,
но с изоляцией расширений Конкуренция --> Отток: пользователи и авторы
пакетов уходят Отток --> Закрытие: GitHub объявляет sunset,
15 декабря 2022 Закрытие --> Наследие Закрытие --> Pulsar: сообщество форкает код Pulsar --> [*]: живёт, но нишево Наследие --> [*]: Electron, Tree-sitter,
идея «редактор = платформа» note right of Проблема Ключевая ошибка не в веб-стеке: VS Code на том же Electron оказался приемлемо быстрым. Ошибка в отсутствии границы между чужим кодом и вводом. end note
Наследие Atom больше, чем сам Atom:
- Electron родился как Atom Shell — и стал стандартом для десктопных приложений на вебе, включая VS Code, Slack, Discord, Figma Desktop.
- Tree-sitter написан Максом Брансфилдом в команде Atom. Сегодня им пользуются Neovim, Helix, Zed, GitHub, Emacs.
- Teletype — совместное редактирование на CRDT — прямой предок того, что делает Zed.
- Сама идея «редактор — это платформа, а не программа» вошла в мейнстрим именно оттуда.
Pulsar — общественный форк, pulsar-edit.dev. Команда сняла
проект с мёртвой инфраструктуры: свой реестр пакетов (ppm вместо отключённого apm),
обновление устаревших нативных модулей Node, современный Electron. Проект жив и выпускает
релизы. Когда его стоит рассматривать: у вас есть выстраданный набор Atom-пакетов или
внутренний плагин, переписывать который дороже, чем поддерживать форк. Во всех остальных
случаях это исторический интерес, а не инструмент выбора.
Что забирать из этой истории: производительность — свойство архитектуры, а не результат оптимизаций. Atom невозможно было «ускорить патчами», потому что модель исполнения плагинов была заложена в фундамент. Ровно этот же аргумент объясняет ставку Zed на wasm-песочницу и ставку VS Code на extension host.
Часть 6. Остальная новая волна: кто ещё есть и зачем
Помимо Zed и Sublime существует россыпь проектов, каждый со своей гипотезой.
Про два проекта стоит сказать подробнее, потому что они показательны.
Helix — самый интересный из модальных «новой школы». Главное отличие от Vim — обратный
порядок: сначала выделяешь, потом действуешь. В Vim вы пишете d2w («удали два слова») и
не видите, что удалится, пока не нажмёте. В Helix — 2wd: выделение подсвечивается, и
только потом вы решаете, что с ним сделать. Для новичка это заметно понятнее, а мультикурсор
становится естественным продолжением модели, а не отдельной механикой. Взамен: мышечная
память Vim не переносится, а системы плагинов до сих пор нет — она разрабатывается на
основе Scheme-подобного языка Steel силами энтузиастов и не имеет обещанных сроков. Всё,
что не встроено, дописать нельзя. Для одних это дисциплина, для других — блокер.
JetBrains Fleet — самый полезный отрицательный кейс. Лёгкий редактор с возможностью «включить умный режим» и получить бэкенд IntelliJ. Идея красивая, реализация — годы в превью, а в декабре 2025 JetBrains объявила о закрытии Fleet: две универсальные линейки IDE размывали фокус, а воспроизвести возможности IntelliJ внутри Fleet не удалось создать достаточной ценности. Платформа переиспользована в новом агентном продукте Air. Вывод для нас практический: редактор без ясной ниши и без экосистемы закрывается даже у компании с ресурсами JetBrains. Это стоит держать в голове, когда очередной проект обещает «заменить всё» — риск переноса рабочего процесса на молодой инструмент реален и измерим.
Часть 7. AI-волна: форки VS Code как отдельный класс
Отдельно стоит новый класс: Cursor, Windsurf, Trae и подобные. Технически это форки VS Code с переписанным AI-слоем; редакторская часть у них общая с оригиналом, конкуренция идёт по качеству агента и модели.
Как устроен цикл автодополнения-по-намерению («что вы будете править дальше»), который отличает их от классического автокомплита:
открытые буферы, диагностика LSP E->>I: поиск релевантных фрагментов
(эмбеддинги или обычный grep) I-->>E: 5–20 кусков кода E->>M: запрос: контекст + история правок Note over E,M: сюда уезжает исходный код —
ключевой пункт для политики безопасности M-->>E: предсказание следующей правки E->>U: показ призрачным текстом U->>E: Tab — принять, Esc — отклонить E->>E: принятое становится частью
контекста следующего запроса
Что здесь важно понимать инженерно, без хайпа:
- Задержка и приватность — один и тот же вопрос. Хорошее предсказание требует контекста; контекст — это ваш код, уезжающий на чужие серверы. Локальные модели снимают вопрос приватности, но качество и скорость на ноутбуке заметно ниже. Компромисс выбирается политикой компании, а не вкусом разработчика.
- Форк — это долг. Форк VS Code обязан вечно подтягивать изменения upstream. Отставание копится, а доступ к официальному Marketplace для сторонних сборок ограничен условиями Microsoft — форки живут на Open VSX, где часть расширений отсутствует или отстаёт по версиям. Проверяйте наличие критичных для вас расширений до миграции.
- Цены живые и меняются. На середину 2026 года типичный индивидуальный тариф у Cursor и Windsurf — около 20 $ в месяц, у Zed — дешевле, но с лимитом токенов; везде есть бесплатные уровни разной щедрости. Любые конкретные цифры в статьях устаревают за квартал — сверяйтесь с прайсом вендора.
- Альтернатива форку — протокол. ACP и обычные расширения-агенты позволяют получить тот же результат, не меняя редактор. Если ваша команда уже стандартизована на VS Code или JetBrains, это дешевле, чем переезд.
Честный итог по классу: AI-возможности перестали быть причиной менять редактор. В 2023-м они были эксклюзивом форков, к 2026-му они есть у всех — встроенные, через расширения или через протокол. Меняйте редактор ради редактора, а агента подбирайте отдельно.
Часть 8. Сравнение: где что уместно
Сводная таблица по критериям, которые реально влияют на работу. Оценки — по опыту практического использования, а не по бенчмаркам вендоров.
| Критерий | Zed | Sublime Text 4 | Pulsar | Helix | VS Code (для сравнения) |
|---|---|---|---|---|---|
| Реализация | Rust, GPUI, свой рендер | C++, свой рендер | Electron | Rust, TUI в терминале | Electron |
| Лицензия | GPL-3.0 (ядро), открытый код | закрытая, 99 $ | MIT | MPL-2.0 | MIT-ядро, сборка под своей лицензией |
| Старт «холодный» | быстро | очень быстро | медленно | мгновенно | средне |
| Файл 100 МБ | справляется | справляется лучше всех | не открывает | справляется | предупреждает и урезает |
| Экосистема расширений | небольшая, растёт | средняя, стагнирует | наследие Atom | отсутствует | огромная |
| Отладчик | есть, DAP | практически нет | слабый | нет | эталон |
| Удалённая работа | есть | нет (только SSHFS/сеть) | нет | по SSH тривиально | эталон |
| Vim-режим | встроенный, хороший | сторонний, средний | сторонний | сам модальный | расширение, хорошее |
| Совместное редактирование | встроено, CRDT | нет | нет | нет | Live Share |
| Доступность (a11y) | слабое место | среднее | наследует браузер | зависит от терминала | лучшее в классе |
| Работа офлайн/закрытый контур | требует проверки | полностью офлайн | офлайн | офлайн | офлайн |
Тот же выбор в осях «сколько получаешь из коробки» и «насколько можно достроить под себя» — именно здесь видно, что редакторы не конкуренты, а разные точки компромисса:
Часть 9. Стоимость перехода — считаем честно
Самая частая ошибка при смене редактора — считать только приобретения. Считать надо баланс.
Что вы теряете при переходе на молодой редактор:
| Статья | Типичная величина |
|---|---|
| Мышечная память горячих клавиш | 2–6 недель до возврата к прежней скорости |
| Настройка окружения с нуля | 4–10 часов на первую версию конфига, потом хвост из мелких правок |
| Отсутствующие расширения | от 0 до «блокер» — считается заранее, поимённо |
| Отладка и профилирование | часто главный регресс: возврат к printf и внешним инструментам |
| Общие командные конфиги | линтеры, форматтеры, задачи, devcontainer — перенастраиваются заново |
| Хвост нестабильности | 1–2 часа в месяц на поломки после обновлений первый год |
Проверка, экономящая недели, — недельный пилот по правилам:
# 1. Не мигрируйте конфиг. Соберите новый с нуля — 80 % старых настроек были компенсацией
# проблем старого редактора и в новом не нужны.
# 2. Заведите отдельный профиль/каталог конфигурации, чтобы откат был мгновенным
cp -r ~/.config/zed ~/.config/zed.backup
# 3. Целую неделю работайте только в новом редакторе — включая неприятные задачи:
# ребейз с конфликтами, отладка падающего теста, правка YAML на 4000 строк,
# работа по SSH на стенде, разбор 200-мегабайтного лога.
# 4. Ведите файл-дневник. Ровно два столбца, без эмоций.
$EDITOR ~/editor-trial.md # "что стало лучше" / "что стало хуже или невозможно"
Решение принимайте по столбцу «невозможно», а не по ощущению новизны: приятность спадает за две недели, а отсутствующий отладчик остаётся навсегда.
Когда переход на новую волну оправдан:
- вы упираетесь в отзывчивость на конкретных задачах и это подтверждено замерами, а не ощущением;
- ваш набор расширений маленький и легко воспроизводимый;
- вы много работаете с большими файлами;
- вам нужна конкретная возможность, которой у текущего инструмента нет (например, совместное редактирование без сервисов Microsoft).
Когда не оправдан:
- вы много отлаживаете и рефакторите — здесь связка JetBrains/VS Code пока сильнее (см. статью о JetBrains);
- у команды общая конфигурация редактора и devcontainer’ы;
- вы работаете в закрытом контуре и не можете проверить сетевую активность инструмента;
- вам нужны вспомогательные технологии доступности;
- вы просто устали от текущего инструмента — тогда сначала попробуйте вычистить его конфиг и снести половину расширений, это дешевле и часто помогает.
Часть 10. Практика: как это выглядит у людей в проде
Три работающие схемы, которые встречаются чаще всего.
Схема «два редактора». Основной — тот, где отладчик и рефакторинги (VS Code или
JetBrains). Второй — быстрый, для чтения, логов и массовых правок (Zed, Sublime, Helix).
Это не признак нерешительности, а разделение задач: одна программа не обязана быть лучшей
во всём. Ключ к тому, чтобы схема не превратилась в мучение, — единый набор внешних
инструментов: линтеры, форматтеры и языковые серверы конфигурируются файлами в репозитории
(.editorconfig, rustfmt.toml, .prettierrc, ruff.toml), а не настройками редактора.
Тогда любой редактор форматирует код одинаково, и в pull request не приезжает шум.
# Минимальный общий знаменатель, который понимают все редакторы этой статьи
cat > .editorconfig <<'EOF'
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 4
[*.{js,ts,tsx,json,yml,yaml}]
indent_size = 2
[*.go]
indent_style = tab
[Makefile]
indent_style = tab
EOF
Схема «редактор как клиент к окружению». Всё тяжёлое — сборка, тесты, языковые серверы — живёт на удалённой машине или в контейнере, локально остаётся только интерфейс. VS Code делает это через Remote, Zed — через свой удалённый режим, Helix и Neovim — просто через SSH, потому что живут в терминале. Побочный, но крайне ценный эффект: ноутбук перестаёт быть узким местом, а окружение становится воспроизводимым.
Схема «редактор-невидимка». Конфигурация целиком в dotfiles под git, новая машина поднимается одной командой, редактор перестаёт быть местом, где живут ваши настройки. Как это устроено на практике — тема следующей статьи.
Типичные ошибки
- Мигрировать конфиг один-в-один. Перенос всех 200 настроек VS Code в Zed воспроизводит старые компромиссы в новом месте. Начинайте с пустого файла.
- Судить редактор по первому дню. Первый день — это борьба с клавишами. Судить надо по третьей неделе, когда клавиши уже в пальцах.
- Верить бенчмаркам вендора. Замеряйте на своих файлах и своём железе; разница между «в 10 раз быстрее» на демо и «на 20 % отзывчивее» на вашем монорепозитории — обычное дело.
- Игнорировать сетевую активность. Молодые редакторы охотно ходят в сеть: телеметрия,
обновления, AI, синхронизация. В закрытом контуре это проверяется до установки —
lsof -i, прокси-лог или сетевые правила. - Ставить всё подряд из каталога расширений. Все уроки VS Code про цену расширений применимы и здесь: каждое расширение — это чужой код в вашем цикле правки.
- Менять инструмент вместо изменения процесса. Если больно от долгой сборки и плохих тестов, новый редактор не поможет ни на минуту.
- Переводить команду волевым решением. Редактор — личный инструмент. Стандартизируйте форматтеры, линтеры и devcontainer’ы, а не редакторы.
Мини-итог
- Новая волна выросла не из моды, а из двух сдвигов: LSP снял барьер входа для новых редакторов, Tree-sitter решил задачу разбора. Всё остальное — конкуренция на уровне интерфейса и производительности.
- Zed — самая цельная попытка сделать быстрый редактор с нуля: Rust, собственный GPU-рендер, rope на SumTree, CRDT в основе буфера, расширения в wasm-песочнице. Платит за это малой экосистемой, слабой доступностью и молодостью.
- Sublime Text — доказательство, что нативный редактор с изолированными Python-плагинами живёт десятилетиями. Лучший в классе на огромных файлах, отстаёт по свежим возможностям и стоит 99 $.
- Atom умер не из-за веб-стека, а из-за отсутствия границы между чужим кодом и вводом пользователя. Его наследие — Electron, Tree-sitter и сама идея редактора-платформы — живёт в конкурентах. Pulsar поддерживает код для тех, кому нужна совместимость.
- Helix, Lapce, Lite XL, Nova — разные точки компромисса; закрытие Fleet напоминает, что молодой редактор без ниши и экосистемы — реальный риск.
- AI-форки VS Code перестали быть отдельной причиной менять редактор: агенты стали слоем поверх любого инструмента, в том числе по открытым протоколам.
- Производительность — свойство архитектуры, и она измеряется хвостом распределения (p95/p99), а не средним. Замеряйте на своих задачах.
- Стоимость перехода считается в неделях мышечной памяти и в отсутствующих возможностях, а не только в приобретениях. Недельный пилот с дневником отвечает на вопрос надёжнее любого обзора.
Источники
- Zed: официальная документация — настройки, keymap, задачи, расширения, удалённая работа
- Zed is now open source — объяснение лицензионной модели: GPL для редактора, AGPL для серверной части, Apache-2.0 для GPUI
- zed-industries/zed — монорепозиторий; отдельные
крейты
gpui,rope,sum_treeполезно читать как учебник по структурам данных - Zed Decoded — серия разборов внутреннего устройства от авторов
- Agent Client Protocol — протокол связи редактора с внешними AI-агентами
- Sublime Text: документация и API Reference
- Sublime Text 4200 и будущее плагинов — план миграции на новые версии Python
- LSP для Sublime Text — как получить современную поддержку языков
- Sunsetting Atom — официальное объяснение от GitHub
- Pulsar Edit — форк Atom и его реестр пакетов
- Tree-sitter — документация и список грамматик
- Typing with Pleasure, Павел Фатин — измерение задержки ввода, психофизика и Typometer
- Xi-editor: Rope science — серия заметок Рафа Левина о структурах данных для текста; проект закрыт, тексты по-прежнему лучшие в теме
- Helix — документация; модель «выделение → действие»
- The Future of Fleet — объяснение JetBrains, почему проект закрыт
- Open VSX Registry — реестр расширений для сборок, не имеющих доступа к Marketplace
- EditorConfig — общий знаменатель настроек для команды с разными редакторами
Что дальше
Мы прошли по редакторам как по отдельным программам. Но настоящий рабочий инструмент программиста — это не окно с текстом, а связка: оболочка, мультиплексор, история команд, навигация по файловой системе и конфигурация, которая переживает смену машины. Следующая статья — про то, как собрать это окружение так, чтобы редактор внутри него можно было менять без боли.
Терминальный рабочий процесс: tmux, оболочка, dotfiles, синхронизация окружения