June 30

Радикальная осознанность: почему я собрал свой Neovim с нуля

Я давно удалил все графические редакторы кода и перешёл на Neovim. Ранее я уже писал об этом «нишевом» редакторе и почему он не является «одним из». На этот раз речь пойдет о моём конфиге и его философии.

Современные IDE — готовый продукт, который в большинстве своём навязывает определённое видение рабочего процесса. Neovim ломает эту парадигму. Он вынуждает пользователя адаптировать систему под себя и даёт полное понимание её устройства.

На просторах интернета существует достаточно большое количество готовых сборок, которые предлагают решение «из коробки». Подобные решения являются духовными аналогами IDE. Они изначально навязывают готовую форму мышления. Мой путь — это эволюция от чистого листа, где каждый плагин и строчка настроек появляются только тогда, когда в них возникает реальная необходимость.

Анатомия модульной структуры

Мой конфиг построен по принципу модульности, и в общих чертах его структура выглядит так:

Весь кастомный функционал вынесен в отдельные файлы и сгруппирован по директориям. Это позволяет полностью контролировать конфиг, точечно вносить изменения и максимально быстро фиксить ошибки.

Точка входа — init.lua. Здесь нет нагромождения кода — файл служит исключительно для подключения созданных модулей и их инициализации.

Каждая директория внутри lua/ — это отдельный слой абстракции, который решает свою изолированную задачу:

  • appearance/ — визуальная составляющая. Слой, отвечающий за интерфейс и тему оформления. Вынесение UI в отдельный модуль позволяет гибко настраивать внешний вид, не затрагивая основную логику.
  • config/ — базовая конфигурация. Сюда вынесены настройки самого редактора, которые делают Vim удобным еще до установки каких-либо плагинов.
    Внутри этого слоя определяются табы, индентация, переназначаются клавиши, прописываются автокоманды.
  • plugins/ — точечное расширение возможностей. Здесь каждый сторонний плагин изолирован в собственном файле. Это позволяет внедрять новые инструменты осознанно, а в случае нестабильности или ненадобности — безболезненно вырезать их, не рискуя сломать остальной конфиг.

Слой Appearance: Цветовая палитра как фундамент фокуса

Разбор структуры я хочу начать именно с папки appearance. В моём конфиге этот слой отвечает за цветовую схему — то, с чем наши глаза взаимодействуют каждую секунду.

Внешний вид редактора часто недооценивают, считая чистой эстетикой, но в моем подходе правильная палитра — это фундамент для фокуса. Грамотно подобранные цвета работают незаметно: они убирают лишний визуальный шум, снижают нагрузку на зрение при долгих сессиях и помогают подсвечивать в коде только то, что действительно важно в данный момент.

Свой выбор я остановил на достаточно популярной, но от этого не менее прекрасной теме — sainnhe/gruvbox-material. Именно она задаёт общую атмосферу, в которой мне действительно приятно находиться во время работы. Для меня эстетическое удовольствие от процесса стоит на одном уровне с эффективностью рабочих инструментов. Одно неотделимо от другого.

При этом все остальные технические настройки интерфейса (вроде отображения строк или табов) у меня вынесены в базовый слой config/options.lua — папка appearance изолирована исключительно под цветовую схему. На мой взгляд, такой подход обеспечивает строгое разделение встроенных возможностей редактора и внешнего, привносимого извне оформления.

Слой Config: Внутренняя механика ядра

Следующий логический слой — директория config/. Здесь сосредоточена вся внутренняя механика и логика поведения редактора. Это ядро конфигурации, которое делает Neovim удобным лично для меня ещё до того, как в систему установится хотя бы один плагин.

Наполнение этой директории у меня разделено на четыре изолированных файла, каждый из которых отвечает за строго определённую задачу:

options.lua — базовые параметры

Здесь настраивается всё, что связано с текстом и поведением интерфейса «из коробки». Из интересного у меня тут:

  • Полное отключение дефолтного проводника netrw, чтобы он не конфликтовал со сторонними плагинами.
  • Гибридная нумерация строк (number + relativenumber) — незаменимая вещь для Vim-навигации, когда ты видишь точное расстояние до нужной строки.
  • Опция scrolloff = 8, которая удерживает курсор по центру экрана, оставляя 8 строк сверху и снизу при скроллинге.
  • Включение undofile — Neovim сохраняет историю изменений между перезапусками редактора. Даже если закрыть файл и открыть его через день, можно отменить последнее действие.

keymaps.lua — анатомия управления

Это один из самых больших файлов слоя, ведь управление в Neovim — это своего рода религия. Чтобы код не превращался в кашу, я написал кастомную функцию-обёртку map(), которая делает синтаксис чистым, автоматически скрывает вывод команд (silent) и позволяет вешать понятные описания (desc) на каждый бинд:

Эта обёртка позволяет мне объявлять бинды одной чистой строкой, передавая описание прямо строковым аргументом. Весь файл я приводить не буду, но вот лишь пара ключевых примеров, которые наглядно отражают мой подход к управлению:

  • На роль лидера (leader key) назначен Пробел — самая большая и доступная клавиша.
  • Выход из инсерт-режима через jk или kj. Больше не нужно тянуться к Esc — пальцы всегда остаются на домашнем ряду клавиатуры.
  • Навигация между сплитами (окнами) заведена на Ctrl + h/j/k/l, что превращает перемещение по рабочей области в единый интуитивный процесс.
  • Быстрое перемещение выделенных строк вверх-вниз в визуальном режиме по нажатию J и K — прямо как в тяжеловесных IDE, но нативно и молниеносно.
  • Поскольку я часто пишу текст прямо в редакторе, вечной болью было отсутствие длинного тире на стандартной раскладке. Я решил это на уровне insert-mode: бинд map("i", "---", "—", "Insert em-dash") мгновенно схлопывает три дефиса в красивое длинное тире. Удобная мелочь.
  • Маппинги для сторонних плагинов я намеренно оставил здесь же. На мой взгляд, централизованное управление всеми сочетаниями клавиш в одном файле гораздо осознаннее, чем если бы эти бинды были размазаны по настройкам самих плагинов. Если инструмент изменится или удалится, мне не придётся искать его привязки по всему конфигу.

autocmds.lua — автоматизация рутины

Сюда вынесены автокоманды — триггеры, которые реагируют на определённые события в редакторе. Это позволяет заставить систему подстраиваться под текущий контекст.

lazy.lua — фундамент для расширений

Этот файл закрывает конфигурацию слоя config/. По сути, это чистый скрипт инициализации современного менеджера плагинов Lazy.nvim. Он проверяет, установлен ли менеджер в системе, при необходимости сам скачивает его стабильную ветку с GitHub и, что самое главное, подключает наши кастомные слои:

Этот короткий вызов связывает всю систему воедино. Он подготавливает почву для ленивой (отложенной) загрузки и передаёт управление следующему, самому масштабному и технологичному слою абстракции — директории plugins/. Именно туда вынесен каждый сторонний инструмент, превращающий минималистичный текстовый редактор в мощную, но при этом полностью подконтрольную инженерную среду.

Слой Plugins: Слаженные функциональные блоки

Описывать каждый из полутора десятков файлов по отдельности — скучно и уверен, что никому не интересно. Мой подход к плагинам такой же модульный, как и сам конфиг, поэтому гораздо интереснее взглянуть на них не как на разрозненные скрипты, а как на слаженные функциональные блоки, каждый из которых закрывает свою глобальную задачу.

Архитектурный каркас (Инфраструктура редактора)

Сюда уходят инструменты, которые превращают Neovim в полноценную рабочую экосистему, связывая воедино код, файлы и сессии:

  • mason.lua — наш внутренний менеджер пакетов. Он изолированно от системы управляет внешними бинарниками: скачивает, обновляет и держит в актуальном состоянии LSP-серверы, линтеры и форматтеры.
  • neo-tree.lua — проектный контекст. Умное и отзывчивое файловое дерево, которое даёт наглядную структуру директории.
  • auto-session.lua — сохранение непрерывности. Плагин, который автоматически сохраняет состояние рабочей области, позволяя одной командой вернуться ровно туда, где ты закончил, восстановив все открытые сплиты и табы.

Органы чувств и навигация (Сбор и перемещение)

  • telescope.lua — ультимативный поисковый движок по всему проекту. Через Пробел (leader key) у меня заведены бинды на быстрый поиск файлов (<leader>ff), живой поиск по тексту через live_grep (<leader>fg), поиск по открытым буферам или недавним файлам. Он работает молниеносно и полностью заменяет любые громоздкие интерфейсы поиска из IDE.
  • flash.lua — тактическое микро-перемещение курсора. Вместо того чтобы скроллить экран или отсчитывать строки, я нажимаю s. Плагин подсвечивает уникальные маркеры для каждого слова на экране: одно нажатие по клавише — и курсор мгновенно прыгает в нужную точку. Это кардинально меняет скорость слепой печати и навигации в коде.

Интеллектуальная подсистема (Контекст и анализ)

Именно она делает редактор по-настоящему «умным», обеспечивая понимание синтаксиса и отказ от компромиссов с тяжеловесными IDE:

  • treesitter.lua — честное абстрактное синтаксическое дерево (AST) для идеальной подсветки кода и умного выделения объектов. Благодаря ему редактор «понимает» структуру языка изнутри, а не просто красит регулярками ключевые слова.
  • lsp.lua — ядро контекстного анализа. Подключение протокола языковых серверов для навигации по коду, автодополнения, рефакторинга и вывода диагностических ошибок, о которых я писал в автокомандах.
  • blink.lua — новое поколение движков автодополнения. Невероятно быстрый, написанный на Rust компилятор контекстных подсказок, пришедший на смену старому nvim-cmp. Работает плавно, без микрофризов интерфейса.
  • conform.lua — автоматическое форматирование кода строго под стандарты (например, gofmt для Go) прямо при сохранении файла. Одно нажатие :w — и код всегда выглядит чисто.

Тактильный комфорт (Автоматизация механики текста)

Блок, экономящий тысячи нажатий клавиш в день:

  • autopairs.lua — умное закрытие скобок, кавычек и парных символов на автомате.
  • comment.lua — быстрое комментирование строк или блоков кода через нативные сочетания, избавляющее от ручного ввода символов комментирования.

Информационное поле (UI и контроль состояния)

Этот слой держит меня в курсе происходящего внутри редактора:

  • lualine.lua — аккуратная, эстетичная и информативная статус-строка внизу.
  • bufferline.lua — организация открытых файлов в виде удобных вкладок сверху.
  • bufdelete.lua — утилита, позволяющая чисто и бесследно удалять буферы (вкладки) из памяти без разрушения текущей разметки окон и сплитов.

Вместо заключения: Философия подконтрольной среды

Сборка собственного конфига для текстового редактора в 2026 году, когда вокруг бушуют готовые IDE с гигабайтами встроенных функций, может показаться анахронизмом или пустой тратой времени. Но для меня это вопрос ментальной гигиены и отношения к своим инструментам.

Современный софт приучает разработчика к пассивному потреблению. Мы нажимаем кнопку «Установить», соглашаемся с гигабайтами чужого кода, телеметрии и скрытых процессов, совершенно не понимая, как эта махина устроена изнутри. Когда этот чёрный ящик ломается, мы остаёмся беспомощными перед экраном.

Собственный конфиг в Neovim — это полный отказ от компромиссов. Это путь радикальной осознанности:

  • Ты не используешь то, чего не понимаешь.
  • Каждый плагин, каждая автокоманда и даже микроскопический бинд на длинное тире — это осознанное инженерное решение, прошедшее строгий отбор.
  • Ты создаёшь цифровую среду, которая идеально подогнана под твою физику ввода, твоё мышление и твои эстетические стандарты.

В конечном счёте, это меняет само отношение к разработке. Когда ты убираешь всё лишнее и оставляешь только чистую логику, эстетику минимализма и полный контроль над каждым пикселем рабочей области, редактор перестаёт быть просто программой. Он становится естественным продолжением твоих рук и мыслей.

Код моего конфига, как и всегда, открыт и доступен на GitHub. Но я призываю вас не копировать его слепо, а использовать как отправную точку для создания своей собственной, полностью подконтрольной инженерной среды.