Emacs — это не просто текстовый редактор, а целая экосистема, среда разработки и образ жизни для многих программистов. Его главная сила — практически безграничная кастомизация. Однако именно это может стать проблемой для новичков и даже опытных пользователей: настройки накапливаются, инициализация замедляется, а некоторые пакеты конфликтуют друг с другом. Оптимизация Emacs — это процесс превращения его из просто мощного инструмента в идеально отлаженное продолжение вашей мысли. Вот пошаговый план, основанный на опыте экспертов сообщества.
Шаг 0: Основа — профилирование. Нельзя оптимизировать то, что не измерено. Первым делом используйте встроенные инструменты для замера времени загрузки. Добавьте в начало вашего `~/.emacs.d/init.el` строки: `(setq use-package-verbose t)` и `(setq use-package-compute-statistics t)`. После запуска выполните команду `M-x report-emacs-init-time`. Вы увидите детальный отчет о том, какие пакеты и секции кода грузятся дольше всего. Альтернативно, используйте пакет `benchmark-init`. Это отправная точка для всех дальнейших действий.
Шаг 1: Структуризация конфига и использование `use-package`. Хаотичный `init.el` — корень всех зол. Эксперты настоятельно рекомендуют перейти на декларативный менеджер пакетов `use-package`. Он не только упрощает загрузку и настройку пакетов, но и предоставляет ключи для отложенной (lazy) загрузки, что критично для скорости. Разбейте ваш конфиг на логические модули (например, `init-ui.el`, `init-programming.el`, `init-org.el`) и загружайте их из основного файла с помощью `load` или `require`. Используйте `:defer t` в `use-package`, чтобы загружать пакеты только когда они действительно нужны (например, загружать `magit` только при вызове команды `magit-status`).
Шаг 2: Отложенная загрузка (Lazy Loading) — главный секрет скорости. `use-package` предоставляет несколько механизмов для этого. `:defer t` — простейшая отложка на несколько секунд после старта. `:mode` — загрузка при открытии файла с определенным расширением. `:hook` — загрузка при срабатывании определенного хука (например, `:hook (python-mode . lsp-mode)`). `:bind` — загрузка при первом нажатии назначенной клавиши. `:commands` — загрузка при вызове указанной команды. Комбинируя эти методы, вы можете сделать так, что тяжелые пакеты вроде `lsp-mode`, `org` или `magit` вообще не будут касаться времени старта Emacs.
Шаг 3: Оптимизация графического интерфейса (GUI) и шрифтов. Рендеринг интерфейса может быть «бутылочным горлышком». Отключите ненужные элементы: `(tool-bar-mode -1)`, `(scroll-bar-mode -1)`, `(menu-bar-mode -1)` (если вы не используете). Безопасно можно отключить `blink-cursor-mode`. Загрузка кастомных шрифтов, особенно с патчами для программирования (Iosevka, Fira Code), может тормозить старт. Убедитесь, что вы загружаете их правильно, и рассмотрите возможность использования `:if (display-graphic-p)` для применения настроек шрифтов только в графическом режиме, а не в терминальном (`-nw`).
Шаг 4: Управление сборкой мусора (Garbage Collection). Emacs, как и любое Lisp-приложение, активно использует сборку мусора. Во время загрузки инициализационного файла создается множество временных объектов. Эксперты советуют временно увеличивать порог GC в начале инита, а затем возвращать его к нормальному значению. Добавьте в начало `init.el`: `(setq gc-cons-threshold (* 50 1000 1000))` (например, 50 МБ), а в конце: `(setq gc-cons-threshold (* 2 1000 1000))` (вернуть к 2 МБ). Это предотвращает многократные микро-паузы на сборку мусора во время загрузки пакетов.
Шаг 5: Анализ и чистка пакетов. Регулярно проводите ревизию установленных пакетов. Удалите те, которыми не пользуетесь. Помните, что каждый пакет — это не только место на диске, но и потенциальный источник конфликтов и код, который может выполняться в фоне. Используйте `list-packages` (`M-x list-packages`), отсортируйте по версии или статусу и удаляйте (клавиша `D`). Для пакетов, которые нужны редко, рассмотрите возможность установки «по требованию» без автозагрузки.
Шаг 6: Компиляция конфига и пакетов. Emacs может компилировать ваш Elisp-код в байт-код (файлы с расширением `.elc`), что ускоряет его выполнение. Убедитесь, что у вас включена компиляция. Пакет `use-package` по умолчанию старается загружать скомпилированные версии. Вы можете вручную скомпилировать весь конфиг командой `M-x byte-recompile-directory`. Также многие пакеты из MELPA поставляются уже скомпилированными.
Шаг 7: Использование серверного режима (Server Mode). Если вы часто перезапускаете Emacs, самый радикальный способ оптимизации — вообще этого не делать. Запустите Emacs в режиме демона: `emacs --daemon`, а затем подключайтесь к нему клиентами: `emacsclient -c` (для создания нового графического фрейма) или `emacsclient -t` (для терминала). Все ваши сессии работают в одном процессе Emacs, что означает мгновенное открытие «нового окна» и полное сохранение состояния между сеансами. Это меняет парадигму работы.
После выполнения этих шагов ваш Emacs должен запускаться за считанные секунды, а не десятки, и работать плавно. Помните, что оптимизация — итеративный процесс. После каждого крупного изменения возвращайтесь к Шагу 0 (профилированию), чтобы оценить эффект. Итогом станет не просто быстрый редактор, а глубоко персонализированная и отзывчивая среда, которая максимально эффективно помогает в решении профессиональных задач.
Как оптимизировать Emacs пошагово: опыт экспертов
Пошаговое руководство от экспертов по ускорению и оптимизации Emacs, от профилирования времени загрузки до продвинутых техник отложенной загрузки и управления памятью.
43
3
Комментарии (11)