0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>17 сен 2025</li>
2
<ul><li>17 сен 2025</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Быстрый, красивый, производительный, но пока сырой.</p>
4
</ul><p>Быстрый, красивый, производительный, но пока сырой.</p>
5
<p>Иллюстрация: Оля Ежак для Skillbox Media</p>
5
<p>Иллюстрация: Оля Ежак для Skillbox Media</p>
6
<p>Филолог и технарь, пишет об IT так, что поймут даже новички. Коммерческий редактор, автор технических статей для vc.ru и "Хабра".</p>
6
<p>Филолог и технарь, пишет об IT так, что поймут даже новички. Коммерческий редактор, автор технических статей для vc.ru и "Хабра".</p>
7
<p>15 декабря 2022 года GitHub<a>закрыл</a>проект Atom. Причиной стало то, что Atom уступал в популярности VS Code и другим продвинутым редакторам кода. Одного из создателей Atom, Нейтана Собо, это не устроило, и уже в 2023 году он <a>представил</a>бета-версию своего нового проекта - редактора Zed IDE.</p>
7
<p>15 декабря 2022 года GitHub<a>закрыл</a>проект Atom. Причиной стало то, что Atom уступал в популярности VS Code и другим продвинутым редакторам кода. Одного из создателей Atom, Нейтана Собо, это не устроило, и уже в 2023 году он <a>представил</a>бета-версию своего нового проекта - редактора Zed IDE.</p>
8
<p>Нейтан позиционирует Zed IDE как "редактор кода нового поколения, который создан для высокопроизводительной работы с людьми и искусственным интеллектом". Давайте это проверим: установим редактор Zed, рассмотрим его основные возможности и составим своё впечатление.</p>
8
<p>Нейтан позиционирует Zed IDE как "редактор кода нового поколения, который создан для высокопроизводительной работы с людьми и искусственным интеллектом". Давайте это проверим: установим редактор Zed, рассмотрим его основные возможности и составим своё впечатление.</p>
9
<p><strong>Содержание</strong></p>
9
<p><strong>Содержание</strong></p>
10
<ul><li><a>Установка и первый запуск</a></li>
10
<ul><li><a>Установка и первый запуск</a></li>
11
<li><a>Основные фишки</a></li>
11
<li><a>Основные фишки</a></li>
12
<li><a>Общее впечатление и отзывы пользователей</a></li>
12
<li><a>Общее впечатление и отзывы пользователей</a></li>
13
</ul><p>В 2025 году редактор Zed можно<a>установить</a>на Linux и macOS. Для macOS есть поддержка чипов Apple Silicon и версия для более старых систем, начиная с macOS 10.15. А вот официальная версия для Windows<a>пока находится в разработке</a>, и когда она будет выпущена - неизвестно. Однако вы можете<a>скомпилировать</a>её по инструкции из исходников или<a>присоединиться</a>к бета-тестированию.</p>
13
</ul><p>В 2025 году редактор Zed можно<a>установить</a>на Linux и macOS. Для macOS есть поддержка чипов Apple Silicon и версия для более старых систем, начиная с macOS 10.15. А вот официальная версия для Windows<a>пока находится в разработке</a>, и когда она будет выпущена - неизвестно. Однако вы можете<a>скомпилировать</a>её по инструкции из исходников или<a>присоединиться</a>к бета-тестированию.</p>
14
<p>Поскольку Zed IDE считается высокопроизводительным редактором кода, мы решили проверить его на старом MacBook Air с предустановленной ОС Catalina. Для сравнения на этот же ноутбук мы установили и VS Code: он запускается, заметно подтормаживает и сразу<a>предупреждает</a>, что вскоре перестанет получать обновления. В случае с Zed таких ограничений пока нет, и, по идее, всё, кроме ИИ-функций, должно работать быстро и без сбоев.</p>
14
<p>Поскольку Zed IDE считается высокопроизводительным редактором кода, мы решили проверить его на старом MacBook Air с предустановленной ОС Catalina. Для сравнения на этот же ноутбук мы установили и VS Code: он запускается, заметно подтормаживает и сразу<a>предупреждает</a>, что вскоре перестанет получать обновления. В случае с Zed таких ограничений пока нет, и, по идее, всё, кроме ИИ-функций, должно работать быстро и без сбоев.</p>
15
<p>После установки нас встречает приветственное окно с минималистичным интерфейсом и базовыми настройками редактора Zed. Здесь можно выбрать цветовую тему, назначить сочетания клавиш, включить режим Vim или просто нажать Skip All, чтобы продолжить и не тратить время на настройку.</p>
15
<p>После установки нас встречает приветственное окно с минималистичным интерфейсом и базовыми настройками редактора Zed. Здесь можно выбрать цветовую тему, назначить сочетания клавиш, включить режим Vim или просто нажать Skip All, чтобы продолжить и не тратить время на настройку.</p>
16
<em>Скриншот:<a>Zed</a>/ Skillbox Media</em><p>На следующем шаге нас встречает стандартное окно приветствия: в нём можно создать новый файл или проект, клонировать репозиторий, открыть панель команд или перейти к дополнительным настройкам редактора. Для примера давайте создадим файл text_filter.py и вставим в него код из статьи про<a>метод replace () в Python</a>, где мы писали простой текстовый фильтр:</p>
16
<em>Скриншот:<a>Zed</a>/ Skillbox Media</em><p>На следующем шаге нас встречает стандартное окно приветствия: в нём можно создать новый файл или проект, клонировать репозиторий, открыть панель команд или перейти к дополнительным настройкам редактора. Для примера давайте создадим файл text_filter.py и вставим в него код из статьи про<a>метод replace () в Python</a>, где мы писали простой текстовый фильтр:</p>
17
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)<p>Откроем терминал в Zed, запустим скрипт и посмотрим результат. Редактор работает очень быстро, и на старом ноутбуке всё происходит без зависаний.</p>
17
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)<p>Откроем терминал в Zed, запустим скрипт и посмотрим результат. Редактор работает очень быстро, и на старом ноутбуке всё происходит без зависаний.</p>
18
<em>Скриншот:<a>Zed</a>/ Skillbox Media</em><p>Интерфейс выглядит очень чисто и соответствует философии, которую<a>заложили</a>разработчики проекта: "Редактор должен исчезнуть, чтобы не отвлекать вас от кода". Помимо минималистичного интерфейса, чувствуется, что Zed IDE специально заточен на работу с Vim и горячими клавишами, чтобы вы как можно меньше отрывали руки от клавиатуры.</p>
18
<em>Скриншот:<a>Zed</a>/ Skillbox Media</em><p>Интерфейс выглядит очень чисто и соответствует философии, которую<a>заложили</a>разработчики проекта: "Редактор должен исчезнуть, чтобы не отвлекать вас от кода". Помимо минималистичного интерфейса, чувствуется, что Zed IDE специально заточен на работу с Vim и горячими клавишами, чтобы вы как можно меньше отрывали руки от клавиатуры.</p>
19
<p>На <a>стартовой странице</a>Zed IDE разработчики выделяют три главных преимущества редактора: высокую скорость работы, встроенные инструменты для совместной разработки и интеграцию с LLM-моделями.</p>
19
<p>На <a>стартовой странице</a>Zed IDE разработчики выделяют три главных преимущества редактора: высокую скорость работы, встроенные инструменты для совместной разработки и интеграцию с LLM-моделями.</p>
20
<p><strong>Высокая скорость.</strong>Zed написан на <a>Rust</a>и использует многопоточность вместе с GPU-рендерингом, что обеспечивает быстрый отклик даже на крупных проектах. На любом современном ноутбуке вы сможете практически мгновенно открывать файлы размером в несколько мегабайт и плавно прокручивать их без задержек. И чем больший по размеру репозиторий вам попадётся, тем заметнее разница с другими редакторами.</p>
20
<p><strong>Высокая скорость.</strong>Zed написан на <a>Rust</a>и использует многопоточность вместе с GPU-рендерингом, что обеспечивает быстрый отклик даже на крупных проектах. На любом современном ноутбуке вы сможете практически мгновенно открывать файлы размером в несколько мегабайт и плавно прокручивать их без задержек. И чем больший по размеру репозиторий вам попадётся, тем заметнее разница с другими редакторами.</p>
21
Сравнение скорости загрузки Zed с другими редакторами - Sublime Text, VS Code и CLion<em>Скриншот:<a>Zed</a>/ Skillbox Media</em><p><strong>Совместная работа.</strong>Пожалуй, это единственная функция, которая<a>доступна</a>в Zed IDE из коробки и отличает его от других редакторов кода. Суть в том, что вы можете вместе с коллегами одновременно работать над одним файлом, переписываться, общаться и видеть экраны друг друга.</p>
21
Сравнение скорости загрузки Zed с другими редакторами - Sublime Text, VS Code и CLion<em>Скриншот:<a>Zed</a>/ Skillbox Media</em><p><strong>Совместная работа.</strong>Пожалуй, это единственная функция, которая<a>доступна</a>в Zed IDE из коробки и отличает его от других редакторов кода. Суть в том, что вы можете вместе с коллегами одновременно работать над одним файлом, переписываться, общаться и видеть экраны друг друга.</p>
22
<p>Режим совместной работы может быть полезен для обучения,<a>парного программирования</a>на удалёнке или код-ревью. Например, наставник может в реальном времени комментировать код стажёра, подсвечивать строки и предлагать правки, а несколько разработчиков - одновременно дебажить приложение и обсуждать логику работы в голосовом или текстовом чате.</p>
22
<p>Режим совместной работы может быть полезен для обучения,<a>парного программирования</a>на удалёнке или код-ревью. Например, наставник может в реальном времени комментировать код стажёра, подсвечивать строки и предлагать правки, а несколько разработчиков - одновременно дебажить приложение и обсуждать логику работы в голосовом или текстовом чате.</p>
23
Интерфейс Zed IDE с несколькими разработчиками, которые одновременно работают над одним файлом - гибрид Zoom и Google Документов<em>Скриншот:<a>Zed</a></em><p><strong>Интеграция с LLM-моделями.</strong>Если вы пользовались ИИ-помощниками в VS Code или любом другом редакторе кода, то для вас не будет ничего нового. В Zed IDE нейросеть может объяснить выделенный фрагмент, сгенерировать тесты и многое другое. При этом можно использовать встроенный Zed AI или подключить провайдеров по API-ключам - есть поддержка OpenAI, GitHub Copilot, Google AI, Anthropic, Amazon Bedrock и других сервисов.</p>
23
Интерфейс Zed IDE с несколькими разработчиками, которые одновременно работают над одним файлом - гибрид Zoom и Google Документов<em>Скриншот:<a>Zed</a></em><p><strong>Интеграция с LLM-моделями.</strong>Если вы пользовались ИИ-помощниками в VS Code или любом другом редакторе кода, то для вас не будет ничего нового. В Zed IDE нейросеть может объяснить выделенный фрагмент, сгенерировать тесты и многое другое. При этом можно использовать встроенный Zed AI или подключить провайдеров по API-ключам - есть поддержка OpenAI, GitHub Copilot, Google AI, Anthropic, Amazon Bedrock и других сервисов.</p>
24
<p>Бесплатный тарифный план Zed AI позволяет сделать до 50 запросов в чат и до 2000 подсказок в код. Pro-версия стоит 20 долларов в месяц, и если вы сможете привязать свою карту, то получите 14-дневный пробный период.</p>
24
<p>Бесплатный тарифный план Zed AI позволяет сделать до 50 запросов в чат и до 2000 подсказок в код. Pro-версия стоит 20 долларов в месяц, и если вы сможете привязать свою карту, то получите 14-дневный пробный период.</p>
25
<p>Мы взяли наш учебный проект и без уточнений попросили Zed AI <a>отрефакторить код</a>. На старом ноутбуке это заняло несколько минут, но результат оказался довольно неплохим: нейросеть переработала наш текстовый фильтр, вынесла логику в отдельные функции и классы, добавила обработку ошибок, сделала удобное интерактивное меню, расширила функциональность и зависла только при попытке сгенерировать автотесты.</p>
25
<p>Мы взяли наш учебный проект и без уточнений попросили Zed AI <a>отрефакторить код</a>. На старом ноутбуке это заняло несколько минут, но результат оказался довольно неплохим: нейросеть переработала наш текстовый фильтр, вынесла логику в отдельные функции и классы, добавила обработку ошибок, сделала удобное интерактивное меню, расширила функциональность и зависла только при попытке сгенерировать автотесты.</p>
26
Интерфейс редактора Zed с включённым ИИ-ассистентом<em>Скриншот:<a>Zed</a>/ Skillbox Media</em><p><strong>Посмотреть код после рефакторинга</strong></p>
26
Интерфейс редактора Zed с включённым ИИ-ассистентом<em>Скриншот:<a>Zed</a>/ Skillbox Media</em><p><strong>Посмотреть код после рефакторинга</strong></p>
27
""" Модуль для фильтрации текста от нежелательных слов и фраз. """ 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 AI<em>Скриншот:<a>Zed</a>/ Skillbox Media</em><p>Когда мы впервые установили редактор Zed, нам сразу бросилась в глаза его минималистичность. Интерфейс чистый, без лишних элементов, и заметно, что создатели редактора делают ставку на горячие клавиши и Vim-режим.</p>
27
""" Модуль для фильтрации текста от нежелательных слов и фраз. """ 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 AI<em>Скриншот:<a>Zed</a>/ Skillbox Media</em><p>Когда мы впервые установили редактор Zed, нам сразу бросилась в глаза его минималистичность. Интерфейс чистый, без лишних элементов, и заметно, что создатели редактора делают ставку на горячие клавиши и Vim-режим.</p>
28
<p>Однако если вы привыкли к экосистеме VS Code или другой зрелой IDE, то скоро начнёте замечать недостатки. В Zed не хватает многих плагинов и привычных интеграций. При этом большинство остальных функций вполне стандартны: есть подсветка синтаксиса, работа с LSP, базовые настройки редактора. В целом, всё работает неплохо, но редактор пока кажется сырым.</p>
28
<p>Однако если вы привыкли к экосистеме VS Code или другой зрелой IDE, то скоро начнёте замечать недостатки. В Zed не хватает многих плагинов и привычных интеграций. При этом большинство остальных функций вполне стандартны: есть подсветка синтаксиса, работа с LSP, базовые настройки редактора. В целом, всё работает неплохо, но редактор пока кажется сырым.</p>
29
<p>Мы решили посмотреть отзывы других пользователей под обзорами редактора Zed, и многие из них совпали с нашим мнением. Ниже мы опубликуем некоторые из них. Читайте и делайте выводы: если у вас уже есть отлаженный инструмент, то нет смысла его менять. Однако если вам интересно пробовать новое - Zed может стать вполне неплохим выбором.</p>
29
<p>Мы решили посмотреть отзывы других пользователей под обзорами редактора Zed, и многие из них совпали с нашим мнением. Ниже мы опубликуем некоторые из них. Читайте и делайте выводы: если у вас уже есть отлаженный инструмент, то нет смысла его менять. Однако если вам интересно пробовать новое - Zed может стать вполне неплохим выбором.</p>
30
<p><strong>Ни туда, ни сюда:</strong></p>
30
<p><strong>Ни туда, ни сюда:</strong></p>
31
<p>"Если сократить до пары предложений, то Zed: слишком тупой для замены IDE, слишком жирный для замены Neovim и слишком бедный на плагины для замены VS Code. API для плагинов урезано до предела, кастомизация сведена к минимуму - меняются только цвета текста и фона".</p>
31
<p>"Если сократить до пары предложений, то Zed: слишком тупой для замены IDE, слишком жирный для замены Neovim и слишком бедный на плагины для замены VS Code. API для плагинов урезано до предела, кастомизация сведена к минимуму - меняются только цвета текста и фона".</p>
32
<p><strong>Комментарий пользователя @sweetcapitan5690 под видео на канале</strong><a><strong>ZProger [IT]</strong></a></p>
32
<p><strong>Комментарий пользователя @sweetcapitan5690 под видео на канале</strong><a><strong>ZProger [IT]</strong></a></p>
33
<p><strong>Не хватает плагинов:</strong></p>
33
<p><strong>Не хватает плагинов:</strong></p>
34
<p>"Месяц сидел на Zed, вернулся в VS Code. Чего не хватает для работы - это плагинов. Без них производительность редактора не спасает. Нет CSS autocomplete, Auto close, Color brackets, Dev containers, Git lens и других. Работа в VS Code с его лагами всё равно эффективнее, чем в Zed.</p>
34
<p>"Месяц сидел на Zed, вернулся в VS Code. Чего не хватает для работы - это плагинов. Без них производительность редактора не спасает. Нет CSS autocomplete, Auto close, Color brackets, Dev containers, Git lens и других. Работа в VS Code с его лагами всё равно эффективнее, чем в Zed.</p>
35
<p>Сам редактор классный, но брать его на постоянку можно будет разве что через года три, когда появится тьма плагинов. Пока использую только для pet-проектов. Радует, что один и тот же проект в VS Code и Zed - разница 1,3 ГБ против 80 МБ потребления памяти. Короче, ждём плагинов и переезжаем.</p>
35
<p>Сам редактор классный, но брать его на постоянку можно будет разве что через года три, когда появится тьма плагинов. Пока использую только для pet-проектов. Радует, что один и тот же проект в VS Code и Zed - разница 1,3 ГБ против 80 МБ потребления памяти. Короче, ждём плагинов и переезжаем.</p>
36
<p>P.S. Главный косяк - надо менять API для плагинов. Сейчас оно унылое, а без нормального API редактор не взлетит".</p>
36
<p>P.S. Главный косяк - надо менять API для плагинов. Сейчас оно унылое, а без нормального API редактор не взлетит".</p>
37
<p><strong>Комментарий пользователя @MrJloa под видео на канале</strong><a><strong></strong><strong>ZProger [IT]</strong></a></p>
37
<p><strong>Комментарий пользователя @MrJloa под видео на канале</strong><a><strong></strong><strong>ZProger [IT]</strong></a></p>
38
<p><strong>Проблемы со стабильностью:</strong></p>
38
<p><strong>Проблемы со стабильностью:</strong></p>
39
<p>"В Zed половина расширений не работает, нет даже банального Emmet. Что-то делать, конечно, можно, и на TypeScript писать тоже, но до удобства VS Code ещё далеко. Плюс куча багов, а производительность с последними обновлениями только падает: у меня он запускается всего на секунду быстрее, чем VS Code с сотней расширений. Автокомплит в Zed тоже платный, а бесплатный работает хуже, чем у VS Code, который хотя бы слабо, но понимает контекст".</p>
39
<p>"В Zed половина расширений не работает, нет даже банального Emmet. Что-то делать, конечно, можно, и на TypeScript писать тоже, но до удобства VS Code ещё далеко. Плюс куча багов, а производительность с последними обновлениями только падает: у меня он запускается всего на секунду быстрее, чем VS Code с сотней расширений. Автокомплит в Zed тоже платный, а бесплатный работает хуже, чем у VS Code, который хотя бы слабо, но понимает контекст".</p>
40
<p><strong>Комментарий пользователя @DreamingDolphing под видео на канале</strong><a><strong>Ayaz Sh.</strong></a></p>
40
<p><strong>Комментарий пользователя @DreamingDolphing под видео на канале</strong><a><strong>Ayaz Sh.</strong></a></p>
41
<p><strong>Сырой и без экосистемы:</strong></p>
41
<p><strong>Сырой и без экосистемы:</strong></p>
42
<p>"Увы, но это пока сырое. Даже спустя почти год. Решил с нуля создать базовый Vue-проект, и там не работает автоимпорт компонентов - просто дичь какая-то. Сам редактор понравился: отзывчивее, чем VS Code. Но пока они не нарастят экосистему, он останется экзотикой".</p>
42
<p>"Увы, но это пока сырое. Даже спустя почти год. Решил с нуля создать базовый Vue-проект, и там не работает автоимпорт компонентов - просто дичь какая-то. Сам редактор понравился: отзывчивее, чем VS Code. Но пока они не нарастят экосистему, он останется экзотикой".</p>
43
<p><strong>Комментарий пользователя @aquinary под видео на канале</strong><a><strong>PurpleSchool | Anton Larichev</strong></a></p>
43
<p><strong>Комментарий пользователя @aquinary под видео на канале</strong><a><strong>PurpleSchool | Anton Larichev</strong></a></p>
44
<p><strong>Интерфейс - на любителя:</strong></p>
44
<p><strong>Интерфейс - на любителя:</strong></p>
45
<p>"Пробовал Zed. От интерфейса глаза вытекают".</p>
45
<p>"Пробовал Zed. От интерфейса глаза вытекают".</p>
46
<p><strong>Комментарий пользователя @IvanKleshinin под видео на канале</strong><a><strong>ZProger [IT]</strong></a></p>
46
<p><strong>Комментарий пользователя @IvanKleshinin под видео на канале</strong><a><strong>ZProger [IT]</strong></a></p>
47
<p>Python для всех</p>
47
<p>Python для всех</p>
48
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
48
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
49
<p><a>Пройти бесплатно</a></p>
49
<p><a>Пройти бесплатно</a></p>
50
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>
50
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>