Zed IDE: обзор нового редактора от создателей Atom
Быстрый, красивый, производительный, но пока сырой.


Иллюстрация: Оля Ежак для Skillbox Media
15 декабря 2022 года GitHub закрыл проект Atom. Причиной стало то, что Atom уступал в популярности VS Code и другим продвинутым редакторам кода. Одного из создателей Atom, Нейтана Собо, это не устроило, и уже в 2023 году он представил бета-версию своего нового проекта — редактора Zed IDE.
Нейтан позиционирует Zed IDE как «редактор кода нового поколения, который создан для высокопроизводительной работы с людьми и искусственным интеллектом». Давайте это проверим: установим редактор Zed, рассмотрим его основные возможности и составим своё впечатление.
Содержание
Установка и первый запуск
В 2025 году редактор Zed можно установить на Linux и macOS. Для macOS есть поддержка чипов Apple Silicon и версия для более старых систем, начиная с macOS 10.15. А вот официальная версия для Windows пока находится в разработке, и когда она будет выпущена — неизвестно. Однако вы можете скомпилировать её по инструкции из исходников или присоединиться к бета-тестированию.
Поскольку Zed IDE считается высокопроизводительным редактором кода, мы решили проверить его на старом MacBook Air с предустановленной ОС Catalina. Для сравнения на этот же ноутбук мы установили и VS Code: он запускается, заметно подтормаживает и сразу предупреждает, что вскоре перестанет получать обновления. В случае с Zed таких ограничений пока нет, и, по идее, всё, кроме ИИ-функций, должно работать быстро и без сбоев.
После установки нас встречает приветственное окно с минималистичным интерфейсом и базовыми настройками редактора Zed. Здесь можно выбрать цветовую тему, назначить сочетания клавиш, включить режим Vim или просто нажать Skip All, чтобы продолжить и не тратить время на настройку.

На следующем шаге нас встречает стандартное окно приветствия: в нём можно создать новый файл или проект, клонировать репозиторий, открыть панель команд или перейти к дополнительным настройкам редактора. Для примера давайте создадим файл text_filter.py и вставим в него код из статьи про метод replace () в Python, где мы писали простой текстовый фильтр:
bad_words = [
"php лучше python",
"пишу код без тестов",
"Stack Overflow умер",
"люблю xml",
"верстаю на диванах",
"дебажу в проде",
"всё работает, не трогай",
"написал свой фреймворк",
"просто добавь AI",
"джава лучше всех",
"всё на jQuery",
"css — это просто",
"мне не нужен ваш git",
"главное — чтобы запускалось",
"типизация мешает творчеству"
]
user_text = input("Введите текст: ")
for word in bad_words:
stars = "*" * len(word)
user_text = user_text.replace(word, stars)
print("Результат:")
print(user_text)
Откроем терминал в Zed, запустим скрипт и посмотрим результат. Редактор работает очень быстро, и на старом ноутбуке всё происходит без зависаний.

Интерфейс выглядит очень чисто и соответствует философии, которую заложили разработчики проекта: «Редактор должен исчезнуть, чтобы не отвлекать вас от кода». Помимо минималистичного интерфейса, чувствуется, что Zed IDE специально заточен на работу с Vim и горячими клавишами, чтобы вы как можно меньше отрывали руки от клавиатуры.
Основные фишки
На стартовой странице Zed IDE разработчики выделяют три главных преимущества редактора: высокую скорость работы, встроенные инструменты для совместной разработки и интеграцию с LLM-моделями.
Высокая скорость. Zed написан на Rust и использует многопоточность вместе с GPU-рендерингом, что обеспечивает быстрый отклик даже на крупных проектах. На любом современном ноутбуке вы сможете практически мгновенно открывать файлы размером в несколько мегабайт и плавно прокручивать их без задержек. И чем больший по размеру репозиторий вам попадётся, тем заметнее разница с другими редакторами.

Скриншот: Zed / Skillbox Media
Совместная работа. Пожалуй, это единственная функция, которая доступна в Zed IDE из коробки и отличает его от других редакторов кода. Суть в том, что вы можете вместе с коллегами одновременно работать над одним файлом, переписываться, общаться и видеть экраны друг друга.
Режим совместной работы может быть полезен для обучения, парного программирования на удалёнке или код-ревью. Например, наставник может в реальном времени комментировать код стажёра, подсвечивать строки и предлагать правки, а несколько разработчиков — одновременно дебажить приложение и обсуждать логику работы в голосовом или текстовом чате.

Скриншот: Zed
Интеграция с LLM-моделями. Если вы пользовались ИИ-помощниками в VS Code или любом другом редакторе кода, то для вас не будет ничего нового. В Zed IDE нейросеть может объяснить выделенный фрагмент, сгенерировать тесты и многое другое. При этом можно использовать встроенный Zed AI или подключить провайдеров по API-ключам — есть поддержка OpenAI, GitHub Copilot, Google AI, Anthropic, Amazon Bedrock и других сервисов.
Бесплатный тарифный план Zed AI позволяет сделать до 50 запросов в чат и до 2000 подсказок в код. Pro-версия стоит 20 долларов в месяц, и если вы сможете привязать свою карту, то получите 14-дневный пробный период.
Мы взяли наш учебный проект и без уточнений попросили Zed AI отрефакторить код. На старом ноутбуке это заняло несколько минут, но результат оказался довольно неплохим: нейросеть переработала наш текстовый фильтр, вынесла логику в отдельные функции и классы, добавила обработку ошибок, сделала удобное интерактивное меню, расширила функциональность и зависла только при попытке сгенерировать автотесты.

Скриншот: Zed / Skillbox Media
Посмотреть код после рефакторинга
"""
Модуль для фильтрации текста от нежелательных слов и фраз.
"""
import re
from typing import List, Optional
from config import Config
class TextFilter:
"""Класс для фильтрации текста от нежелательных слов."""
def __init__(self, config: Optional[Config] = None, bad_words: Optional[List[str]] = None, replacement_char: Optional[str] = None):
"""
Инициализация фильтра.
Args:
config: Объект конфигурации (приоритет над остальными параметрами)
bad_words: Список нежелательных слов/фраз
replacement_char: Символ для замены
"""
self.config = config or Config()
self.bad_words = bad_words or self.config.get_bad_words()
self.replacement_char = replacement_char or self.config.get_replacement_char()
def _get_default_bad_words(self) -> List[str]:
"""Возвращает список нежелательных фраз по умолчанию."""
return [
"php лучше python",
"пишу код без тестов",
"Stack Overflow умер",
"люблю xml",
"верстаю на диванах",
"дебажу в проде",
"всё работает, не трогай",
"написал свой фреймворк",
"просто добавь AI",
"джава лучше всех",
"всё на jQuery",
"css — это просто",
"мне не нужен ваш git",
"главное — чтобы запускалось",
"типизация мешает творчеству"
]
def filter_text(self, text: str, case_sensitive: Optional[bool] = None) -> str:
"""
Фильтрует текст, заменяя нежелательные слова на символы замены.
Args:
text: Текст для фильтрации
case_sensitive: Учитывать ли регистр при поиске (None - использовать из конфига)
Returns:
Отфильтрованный текст
"""
if not text:
return text
# Определяем чувствительность к регистру
is_case_sensitive = case_sensitive if case_sensitive is not None else self.config.is_case_sensitive()
filtered_text = text
for bad_word in self.bad_words:
pattern = re.escape(bad_word)
replacement = self.replacement_char * len(bad_word)
if is_case_sensitive:
filtered_text = re.sub(pattern, replacement, filtered_text)
else:
filtered_text = re.sub(pattern, replacement, filtered_text, flags=re.IGNORECASE)
return filtered_text
def add_bad_word(self, word: str, category: Optional[str] = None, save_to_config: bool = True) -> None:
"""
Добавляет новое нежелательное слово в список.
Args:
word: Слово для добавления
category: Категория слова (опционально)
save_to_config: Сохранять ли изменения в конфиг
"""
if word and word not in self.bad_words:
self.bad_words.append(word)
if save_to_config:
self.config.add_bad_word(word, category)
def remove_bad_word(self, word: str, category: Optional[str] = None, save_to_config: bool = True) -> bool:
"""
Удаляет слово из списка нежелательных.
Args:
word: Слово для удаления
category: Категория слова (опционально)
save_to_config: Сохранять ли изменения в конфиг
Returns:
True если слово было удалено, False если его не было в списке
"""
try:1
self.bad_words.remove(word)
if save_to_config:
self.config.remove_bad_word(word, category)
return True
except ValueError:
return False
def get_bad_words(self) -> List[str]:
"""Возвращает копию списка нежелательных слов."""
return self.bad_words.copy()
def set_replacement_char(self, char: str, save_to_config: bool = True) -> None:
"""
Устанавливает новый символ замены.
Args:
char: Новый символ замены
save_to_config: Сохранять ли изменения в конфиг
"""
self.replacement_char = char
if save_to_config:
self.config.set_replacement_char(char)
def load_category_words(self, category: str) -> None:
"""Загружает слова из определённой категории."""
category_words = self.config.get_bad_words(category)
self.bad_words = category_words
def get_categories(self) -> List[str]:
"""Возвращает список доступных категорий."""
return self.config.get_categories()
def save_config(self) -> bool:
"""Сохраняет текущую конфигурацию."""
return self.config.save_config()
def get_user_input() -> str:
"""Получает ввод от пользователя."""
try:
return input("Введите текст: ")
except (KeyboardInterrupt, EOFError):
print("\nВвод отменён пользователем.")
return ""
def display_result(original_text: str, filtered_text: str) -> None:
"""Отображает результат фильтрации."""
print("\n" + "="*50)
print("РЕЗУЛЬТАТ ФИЛЬТРАЦИИ:")
print("="*50)
print(f"Исходный текст: {original_text}")
print(f"Отфильтрованный: {filtered_text}")
print("="*50)
def interactive_menu(text_filter: TextFilter) -> None:
"""Интерактивное меню для управления фильтром."""
while True:
print("\n" + "="*50)
print("МЕНЮ УПРАВЛЕНИЯ ФИЛЬТРОМ")
print("="*50)
print("1. Фильтровать текст")
print("2. Просмотреть нежелательные слова")
print("3. Добавить нежелательное слово")
print("4. Удалить нежелательное слово")
print("5. Изменить символ замены")
print("6. Просмотреть категории")
print("7. Загрузить слова категории")
print("8. Сохранить конфигурацию")
print("0. Выход")
print("-" * 50)
try:
choice = input("Выберите опцию (0-8): ").strip()
if choice == "0":
print("До свидания! ????")
break
elif choice == "1":
user_text = get_user_input()
if user_text:
filtered_text = text_filter.filter_text(user_text)
display_result(user_text, filtered_text)
elif choice == "2":
bad_words = text_filter.get_bad_words()
print(f"\nТекущие нежелательные слова ({len(bad_words)}):")
for i, word in enumerate(bad_words, 1):
print(f"{i}. {word}")
elif choice == "3":
word = input("Введите нежелательное слово: ").strip()
if word:
text_filter.add_bad_word(word)
print(f"✅ Слово '{word}' добавлено!")
elif choice == "4":
word = input("Введите слово для удаления: ").strip()
if text_filter.remove_bad_word(word):
print(f"✅ Слово '{word}' удалено!")
else:
print(f"❌ Слово '{word}' не найдено!")
elif choice == "5":
char = input("Введите новый символ замены: ").strip()
if char:
text_filter.set_replacement_char(char)
print(f"✅ Символ замены изменён на '{char}'!")
elif choice == "6":
categories = text_filter.get_categories()
print(f"\nДоступные категории ({len(categories)}):")
for i, cat in enumerate(categories, 1):
print(f"{i}. {cat}")
elif choice == "7":
categories = text_filter.get_categories()
if categories:
print("Доступные категории:")
for i, cat in enumerate(categories, 1):
print(f"{i}. {cat}")
try:
cat_index = int(input("Выберите номер категории: ")) - 1
if 0 <= cat_index < len(categories):
text_filter.load_category_words(categories[cat_index])
print(f"✅ Загружены слова категории '{categories[cat_index]}'!")
else:
print("❌ Неверный номер категории!")
except ValueError:
print("❌ Введите корректный номер!")
else:
print("❌ Категории не найдены!")
elif choice == "8":
if text_filter.save_config():
print("✅ Конфигурация сохранена!")
else:
print("❌ Ошибка сохранения конфигурации!")
else:
print("❌ Неверный выбор! Попробуйте снова.")
except (KeyboardInterrupt, EOFError):
print("\n\nДо свидания! ????")
break
except Exception as e:
print(f"❌ Произошла ошибка: {e}")
def main():
"""Основная функция программы."""
print("???? Фильтр нежелательных слов v2.0")
print("-" * 40)
try:
# Создаём экземпляр фильтра с конфигурацией
config = Config()
text_filter = TextFilter(config=config)
# Показываем краткую информацию
print(f"???? Загружено {len(text_filter.bad_words)} нежелательных слов")
print(f"???? Символ замены: '{text_filter.replacement_char}'")
# Запускаем интерактивное меню
interactive_menu(text_filter)
except Exception as e:
print(f"❌ Критическая ошибка: {e}")
print("Использование базовых настроек...")
# Fallback к базовому функционалу
text_filter = TextFilter()
user_text = get_user_input()
if user_text:
filtered_text = text_filter.filter_text(user_text)
display_result(user_text, filtered_text)
if __name__ == "__main__":
main()

Скриншот: Zed / Skillbox Media
Общее впечатление и отзывы пользователей
Когда мы впервые установили редактор Zed, нам сразу бросилась в глаза его минималистичность. Интерфейс чистый, без лишних элементов, и заметно, что создатели редактора делают ставку на горячие клавиши и Vim-режим.
Однако если вы привыкли к экосистеме VS Code или другой зрелой IDE, то скоро начнёте замечать недостатки. В Zed не хватает многих плагинов и привычных интеграций. При этом большинство остальных функций вполне стандартны: есть подсветка синтаксиса, работа с LSP, базовые настройки редактора. В целом, всё работает неплохо, но редактор пока кажется сырым.
Мы решили посмотреть отзывы других пользователей под обзорами редактора Zed, и многие из них совпали с нашим мнением. Ниже мы опубликуем некоторые из них. Читайте и делайте выводы: если у вас уже есть отлаженный инструмент, то нет смысла его менять. Однако если вам интересно пробовать новое — Zed может стать вполне неплохим выбором.
Ни туда, ни сюда:
«Если сократить до пары предложений, то Zed: слишком тупой для замены IDE, слишком жирный для замены Neovim и слишком бедный на плагины для замены VS Code. API для плагинов урезано до предела, кастомизация сведена к минимуму — меняются только цвета текста и фона».
Комментарий пользователя @sweetcapitan5690 под видео на канале ZProger [IT]
Не хватает плагинов:
«Месяц сидел на Zed, вернулся в VS Code. Чего не хватает для работы — это плагинов. Без них производительность редактора не спасает. Нет CSS autocomplete, Auto close, Color brackets, Dev containers, Git lens и других. Работа в VS Code с его лагами всё равно эффективнее, чем в Zed.
Сам редактор классный, но брать его на постоянку можно будет разве что через года три, когда появится тьма плагинов. Пока использую только для pet-проектов. Радует, что один и тот же проект в VS Code и Zed — разница 1,3 ГБ против 80 МБ потребления памяти. Короче, ждём плагинов и переезжаем.
P.S. Главный косяк — надо менять API для плагинов. Сейчас оно унылое, а без нормального API редактор не взлетит».
Комментарий пользователя @MrJloa под видео на канале ZProger [IT]
Проблемы со стабильностью:
«В Zed половина расширений не работает, нет даже банального Emmet. Что-то делать, конечно, можно, и на TypeScript писать тоже, но до удобства VS Code ещё далеко. Плюс куча багов, а производительность с последними обновлениями только падает: у меня он запускается всего на секунду быстрее, чем VS Code с сотней расширений. Автокомплит в Zed тоже платный, а бесплатный работает хуже, чем у VS Code, который хотя бы слабо, но понимает контекст».
Комментарий пользователя @DreamingDolphing под видео на канале Ayaz Sh.
Сырой и без экосистемы:
«Увы, но это пока сырое. Даже спустя почти год. Решил с нуля создать базовый Vue-проект, и там не работает автоимпорт компонентов — просто дичь какая-то. Сам редактор понравился: отзывчивее, чем VS Code. Но пока они не нарастят экосистему, он останется экзотикой».
Комментарий пользователя @aquinary под видео на канале PurpleSchool | Anton Larichev
Интерфейс — на любителя:
«Пробовал Zed. От интерфейса глаза вытекают».
Комментарий пользователя @IvanKleshinin под видео на канале ZProger [IT]
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!