Дистрибутивы, отладка и терминал: быстрый старт и интеграции

Рейтинг: 64.6% · 12 голосов
Исчерпывающий курс по Vim и Neovim: модальное редактирование и грамматика (операторы, движения, текстовые объекты, точка-команда), регистры, метки, макросы, поиск и :substitute, :global, буферы/окна/quickfix, визуальный режим, конфигурация на Lua, маппинги, плагины (lazy.nvim), LSP, автодополнение (blink.cmp), Treesitter, fuzzy-поиск, Git, эргономика и антипаттерны. 34 главы, актуально на 2026 (Vim 9.1, Neovim 0.11/0.12).
Ответить
Аватара пользователя
Roman_Vim
Сообщения: 34
Зарегистрирован: 11 май 2026, 05:31

Дистрибутивы, отладка и терминал: быстрый старт и интеграции

Сообщение Roman_Vim »

Оглавление курса (34)
  1. Философия Vim: модальное редактирование и почему это актуально в 2026
  2. Установка и выживание: первый запуск, режимы, как выйти
  3. Перемещение по тексту: движения как основа эффективности
  4. Базовое редактирование: вставка, удаление, копирование
  5. Грамматика Vim: операторы + движения = команды
  6. Текстовые объекты: оперируем структурой, а не символами
  7. Точка-команда и повторяемость: "один штрих, чтобы повторить"
  8. Регистры: продвинутая работа с буфером обмена
  9. Метки и прыжки: навигация по истории перемещений
  10. Поиск: /, ?, *, # и магия паттернов
  11. Замена :substitute и регулярные выражения Vim
  12. Команда :global - оружие массового редактирования
  13. Буферы, окна и вкладки: организация рабочего пространства
  14. Quickfix и location list: пакетная работа по всему проекту
  15. Навигация по файлам: netrw, fuzzy-поиск и проекты
  16. Макросы: автоматизация повторяющихся правок
  17. Визуальный режим и блочное редактирование
  18. Трюки режима вставки
  19. Свёртки, автодополнение и аббревиатуры (встроенные)
  20. Конфигурация с нуля: init.lua и разумные дефолты 2026
  21. Маппинги: leader, which-key и здравые привычки
  22. Скриптинг: основы Vimscript и Lua для Neovim
  23. Менеджеры плагинов: lazy.nvim и lazy-loading
  24. Neovim в 2026: чем отличается и почему выбирают
  25. LSP в Neovim: умные возможности языка
  26. Автодополнение 2026: blink.cmp против nvim-cmp
  27. Treesitter: точная подсветка и структурное редактирование
  28. Fuzzy-поиск: Telescope, fzf-lua и snacks.picker
  29. Git внутри редактора: fugitive, gitsigns и lazygit
  30. Дистрибутивы, отладка и терминал: быстрый старт и интеграции (вы здесь)
  31. Vim повсюду: IDE, браузер и shell
  32. Эргономика и антипаттерны: как не навредить себе и не застрять
  33. Рабочие рецепты, тренажёры и план обучения
  34. Шпаргалка-справочник: все ключевые команды одним списком
Часть VI. Современный Neovim 2026

К этому моменту вы умеете собирать конфиг руками: знаете init.lua и разумные дефолты (глава 20), маппинги и which-key (глава 21), менеджеры плагинов и lazy-loading (глава 23), нативный LSP (глава 25), автодополнение (глава 26), Treesitter (глава 27), пикеры (глава 28) и Git внутри редактора (глава 29). Эта глава отвечает на три практических вопроса, которые встают перед каждым, кто перерос "голый" Neovim:
  1. С чего начать? Собирать конфиг с нуля - мощно, но долго. Готовые дистрибутивы (kickstart.nvim, LazyVim, NvChad, AstroNvim) дают рабочую IDE за минуты. Разберём, кому что подходит в 2026 и где их границы.
  2. Как отлаживать код прямо в редакторе? nvim-dap превращает Neovim в полноценный отладчик с точками останова, шагами и инспекцией переменных - без выхода в IDE.
  3. Как жить в терминале изнутри редактора и снаружи? Встроенный :terminal, toggleterm, бесшовная навигация с tmux и удалённое управление через neovim-remote.
Это глава об интеграциях и быстром старте. Она связывает воедино предыдущие части и готовит почву для главы 31, где мы вынесем Vim-навык за пределы редактора - в IDE, браузер и shell.

1. Дистрибутивы: готовый конфиг vs свой

Зачем вообще дистрибутив

"Голый" Neovim из коробки - это редактор, а не среда разработки. Чтобы получить LSP, автодополнение, файловый менеджер, нечёткий поиск, Git-интеграцию и согласованные кейбинды, нужно установить и настроить десяток плагинов. На сборку зрелого личного конфига уходят недели итераций.

Дистрибутив - это готовый, поддерживаемый сообществом конфиг поверх lazy.nvim (см. главу 23). Вы устанавливаете его в ~/.config/nvim, и у вас сразу рабочая IDE. Цена - вы принимаете чужие соглашения: структуру файлов, дефолтные кейбинды, выбор плагинов. Ключевое решение 2026 года звучит так: либо вы понимаете каждую строку своего конфига (путь kickstart), либо осознанно принимаете соглашения дистрибутива (LazyVim/NvChad/AstroNvim) и учитесь их переопределять. Худший вариант - смешивать: лезть в дистрибутив с ручными правками, не понимая его слоёв мёржа opts. Это ломает каскад настроек и приводит к загадочным багам.

Четыре варианта в 2026

kickstart.nvim - учебный, один файл

kickstart.nvim (nvim-lua/kickstart.nvim) - это не дистрибутив, а стартовая площадка. Один хорошо прокомментированный init.lua (плюс опциональные модули в kickstart/), который показывает, как устроены LSP, Treesitter, автодополнение и пикеры. Идея авторов: вы читаете и понимаете каждую строку, форкаете репозиторий и дальше пилите конфиг под себя.
  • Плюсы: прозрачность, ноль магии, идеален для обучения и как основа своего конфига. Обновлён под нативный LSP 0.11 и blink.cmp.
  • Минусы: это минимум; всё сверх базы вы достраиваете сами.
  • Кому: тем, кто хочет понимать внутренности и в итоге иметь свой конфиг.
LazyVim - полноценная основа

LazyVim (folke/LazyVim) - по разным оценкам самый популярный дистрибутив 2026 года: на нём построена значительная часть пользовательских Neovim-конфигов (точных верифицируемых цифр доли рынка нет - это грубая оценка по активности репозитория и упоминаниям в сообществе). Рабочий IDE-сетап из коробки на lazy.nvim, со слоистой системой переопределения opts и системой Extras (:LazyExtras), которой вы включаете готовые модули - языковые паки (lang.*), альтернативы движков и т.д. - без ручного конфига.

Важные дефолты 2026: движок автодополнения по умолчанию - blink.cmp (не nvim-cmp), пикер и ряд UI-компонентов - из snacks.nvim. Вернуться на nvim-cmp можно через :LazyExtras -> включить coding.nvim-cmp; одновременно работает только один движок.
  • Плюсы: крупнейшее сообщество, рабочая IDE сразу, аккуратная система override через opts, Extras для языков.
  • Минусы: нужно понимать слои мёржа, иначе override не работает интуитивно; "магия" дистрибутива скрывает детали.
  • Кому: тем, кто хочет быстрый старт с возможностью тонко переопределять. Дефолтный выбор для большинства в 2026.
NvChad - скорость и красивый UI

NvChad делает упор на быстрый старт и эстетику: собственная система тем base46 (компилируется в байткод ради скорости), минималистичный, отполированный UI. Поверх ставится слой NvChad/ui и конфиг пользователя.
  • Плюсы: очень быстрый старт, красивый UI "из коробки", своя система тем.
  • Минусы: более своеобразная архитектура (base46, кастомные абстракции), кастомизация требует знакомства именно с соглашениями NvChad.
  • Кому: тем, для кого важны визуал и скорость, и кто готов разобраться в base46.
AstroNvim - модульная экосистема

AstroNvim - модульный community-дистрибутив с системой плагинов-"packs" (community-репозиторий с готовыми наборами под языки и инструменты).
  • Плюсы: богатая модульность, community-паки, продуманная структура.
  • Минусы: больше слоёв абстракции; как и у любого дистрибутива - нужно принять его соглашения.
  • Кому: тем, кто любит модульный, "собранный из блоков" подход.
Безопасная примерка: бэкап и изоляция конфига

Прежде чем ставить LazyVim/NvChad/AstroNvim поверх существующего ~/.config/nvim, защититесь от потери своей настройки. Neovim хранит состояние в нескольких местах, и затереть нужно не только конфиг:

Код: Выделить всё

Путь                 |  Что лежит
---------------------+---------------------------------------------------
~/.config/nvim       |  сам конфиг (init.lua, lua-модули)
~/.local/share/nvim  |  данные плагинов, парсеры Treesitter, Mason и т.д.
~/.local/state/nvim  |  состояние: шейды, undo, swap, логи
~/.cache/nvim        |  кеши (можно просто удалять)
Способ 1 - бэкап и подмена. Откатываемо переименуйте все каталоги, затем ставьте дистрибутив на чистое место:

Код: Выделить всё

# Бэкап (не удаляем - переименовываем, чтобы вернуть одной командой)
mv ~/.config/nvim{,.bak}
mv ~/.local/share/nvim{,.bak}
mv ~/.local/state/nvim{,.bak}
mv ~/.cache/nvim{,.bak} 2>/dev/null

# Теперь ставим дистрибутив в чистый ~/.config/nvim, например LazyVim:
git clone https://github.com/LazyVim/starter ~/.config/nvim
rm -rf ~/.config/nvim/.git
# Вернуть свой конфиг: удалить .bak-каталоги обратно на место.
Способ 2 - NVIM_APPNAME (рекомендуется для параллельной примерки). Переменная NVIM_APPNAME меняет имя подкаталога во всех трёх местах сразу (~/.config/$NVIM_APPNAME, ~/.local/share/$NVIM_APPNAME, ~/.local/state/$NVIM_APPNAME), поэтому дистрибутив живёт полностью изолированно и не трогает ваш основной конфиг:

Код: Выделить всё

git clone https://github.com/LazyVim/starter ~/.config/lazyvim
NVIM_APPNAME=lazyvim nvim     # запуск LazyVim рядом с обычным `nvim`
Это тот же приём, что в упражнении с kickstart: пробуйте сколько угодно дистрибутивов параллельно, каждый под своим NVIM_APPNAME, не рискуя рабочим окружением. Удобно завести алиасы (alias lvim='NVIM_APPNAME=lazyvim nvim').

Дистрибутив vs свой конфиг

Код: Выделить всё

Критерий                 |  Свой конфиг (с нуля)  |  Дистрибутив
-------------------------+------------------------+---------------------------
Время до рабочей IDE     |  дни-недели            |  минуты
Понимание внутренностей  |  полное                |  частичное (скрыто слоями)
Контроль                 |  абсолютный            |  в рамках соглашений
Поддержка/обновления     |  на вас                |  на сообществе
Риск "магии"             |  нет                   |  есть (каскад opts)
Кривая обучения          |  круче                 |  положе на старте
Рекомендация старта 2026

Практичный приём, на котором сходится сообщество: жить на LazyVim (рабочая IDE сразу, не теряете время), а в свободное время разобрать kickstart.nvim - прочитать его построчно, чтобы понимать, как всё устроено, и не зависеть от магии дистрибутива. Опытным Vim-пользователям, у которых уже есть рабочий конфиг, мигрировать на дистрибутив без причины не нужно.
Внимание (nvim-treesitter 2026). nvim-treesitter пережил несовместимый rewrite: старый код заморожен в ветке master (для Neovim 0.11), новый - в main (требует 0.12). На Neovim 0.12 базовая подсветка Treesitter уже в ядре. Дистрибутивы это учитывают в своих пресетах - ещё один аргумент не собирать Treesitter-часть руками, если не хотите вникать. Подробнее в главе 27.
2. Отладка: nvim-dap и dap-ui

Зачем отладчик в редакторе

Печать print() по всему коду - это отладка прошлого века. Полноценный отладчик даёт точки останова (breakpoints), пошаговое выполнение, инспекцию переменных, стек вызовов и REPL - не покидая Neovim и не теряя контекст. Раньше за этим уходили в IDE; теперь это есть нативно через DAP.

nvim-dap (mfussenegger/nvim-dap) - клиент Debug Adapter Protocol (DAP). Это тот же подход, что у LSP: единый протокол, а конкретику языка обеспечивает внешний debug adapter (отдельная программа). Neovim говорит на DAP, адаптер транслирует это в отладчик конкретного языка (debugpy для Python, delve для Go, codelldb для C/C++/Rust и т.д.).

Архитектура:

Код: Выделить всё

Neovim (nvim-dap)  < -  - DAP -  - >  debug adapter  < -  - >  отладчик языка / процесс
Из чего собирается отладочный стек

Код: Выделить всё

Компонент                                    |  Роль
---------------------------------------------+------------------------------------------
nvim-dap                                     |  DAP-клиент: точки останова, шаги, сессии
nvim-dap-ui (rcarriga/nvim-dap-ui)           |  UI: панели scopes, watches, стек, REPL
nvim-dap-virtual-text                        |  inline-значения переменных прямо в коде
debug adapter (debugpy, delve, codelldb...)  |  мост к отладчику конкретного языка
mason-nvim-dap (опц.)                        |  установка адаптеров через Mason
dap-ui подписывается на события сессии и сам открывает/закрывает панели. Типовая привязка - авто-открытие UI при старте сессии:

Код: Выделить всё

local dap, dapui = require("dap"), require("dapui")
dapui.setup()
dap.listeners.before.attach.dapui_config = function() dapui.open() end
dap.listeners.before.launch.dapui_config = function() dapui.open() end
dap.listeners.before.event_terminated.dapui_config = function() dapui.close() end
dap.listeners.before.event_exited.dapui_config = function() dapui.close() end
Базовые команды и привязки

В nvim-dap нет навязанных кейбиндов - вы биндите функции сами. Типовая раскладка (близкая к F-клавишам IDE; именно она встречается в каноничных примерах nvim-dap - <S-F11> под step out, как в большинстве IDE):

Код: Выделить всё

Клавиша / вызов                           |  Действие
------------------------------------------+--------------------------------
<F5> -> dap.continue()                    |  старт / продолжить выполнение
<F10> -> dap.step_over()                  |  шаг через (step over)
<F11> -> dap.step_into()                  |  шаг внутрь (step into)
<S-F11> -> dap.step_out()                 |  шаг наружу (step out)
<leader>b -> dap.toggle_breakpoint()      |  поставить/снять точку останова
<leader>B -> dap.set_breakpoint(условие)  |  условная точка останова
<leader>dr -> dap.repl.open()             |  открыть REPL отладчика
<leader>du -> dapui.toggle()              |  показать/скрыть панели dap-ui
Пример конфигурации привязок:

Код: Выделить всё

vim.keymap.set("n", "<F5>", function() require("dap").continue() end, { desc = "Debug: continue" })
vim.keymap.set("n", "<F10>", function() require("dap").step_over() end, { desc = "Debug: step over" })
vim.keymap.set("n", "<F11>", function() require("dap").step_into() end, { desc = "Debug: step into" })
vim.keymap.set("n", "<S-F11>", function() require("dap").step_out() end, { desc = "Debug: step out" })
vim.keymap.set("n", "<leader>b", function() require("dap").toggle_breakpoint() end, { desc = "Debug: toggle breakpoint" })
Пример: отладка Python от и до

Установлен debugpy (например, через Mason или pip install debugpy в окружении проекта), настроен адаптер:

Код: Выделить всё

local dap = require("dap")
dap.adapters.python = {
  type = "executable",
  command = "python",
  args = { "-m", "debugpy.adapter" },
}
dap.configurations.python = {
  {
    type = "python",
    request = "launch",
    name = "Launch file",
    program = "${file}",  -- текущий файл
    -- Интерпретатор, которым debugpy ЗАПУСКАЕТ ваш код.
    -- Без него debugpy цепляется к системному python, а не к venv проекта
    -- (типичная причина "не находит мои пакеты").
    pythonPath = function()
      -- активный venv, если есть; иначе python из PATH
      local venv = os.getenv("VIRTUAL_ENV")
      if venv then return venv .. "/bin/python" end
      return vim.fn.exepath("python3") or vim.fn.exepath("python") or "python"
    end,
  },
}
Про окружение проекта. Поле command адаптера - это python, которым запускается сам debugpy.adapter; а pythonPath в configurations - это интерпретатор, которым debugpy запускает ваш код. Чтобы отладчик видел зависимости проекта, pythonPath должен указывать на python из активного venv (как выше). Если опустить pythonPath, отладка пойдёт через системный python - пакеты из окружения проекта будут "не видны".
Сессия отладки шаг за шагом:

Код: Выделить всё

Открыт buggy.py, курсор на строке 12
Нажимаем  <leader>b           -> на строке 12 появился знак точки останова (●)
Нажимаем  <F5>                -> dap.continue(): код стартует, dap-ui раскрывает панели,
                                  выполнение замирает на строке 12
Смотрим   панель Scopes       -> видим локальные переменные и их значения
Нажимаем  <F10>               -> step over: перешли на строку 13, значения обновились
Печатаем  в REPL: my_var      -> отладчик вернул текущее значение my_var
Нажимаем  <F5>                -> продолжили до следующего breakpoint или конца
Inline-значения (nvim-dap-virtual-text) показывают значения переменных прямо в строках кода как virtual text - отдельную панель открывать не нужно.

launch vs attach: подключение к работающему процессу

Выше request = "launch" - отладчик сам запускает программу. Но в реальной работе процесс часто уже крутится: веб-сервер (Django/Flask/uvicorn), воркер, тесты под pytest, удалённый или контейнерный процесс. Для этого есть request = "attach" - DAP подключается к уже работающему процессу, не перезапуская его.

Сценарий: запускаете приложение под debugpy в режиме ожидания отладчика, затем цепляетесь из Neovim к нужному хосту/порту:

Код: Выделить всё

# В терминале/контейнере: процесс ждёт подключения отладчика на порту 5678
python -m debugpy --listen 0.0.0.0:5678 --wait-for-client -m uvicorn app:app

Код: Выделить всё

-- В dap.configurations.python добавляем конфигурацию attach рядом с launch:
table.insert(dap.configurations.python, {
  type = "python",
  request = "attach",
  name = "Attach :5678",
  connect = { host = "127.0.0.1", port = 5678 },
  -- сопоставление путей, если код в контейнере/на другом хосте:
  pathMappings = {
    { localRoot = "${workspaceFolder}", remoteRoot = "." },
  },
})
При запуске dap.continue() вы выбираете из списка нужную конфигурацию (Launch file или Attach :5678). attach незаменим для отладки уже поднятого веб-сервера, фоновых воркеров и процессов в Docker/на удалённой машине - там, где launch неприменим. Для процесса в контейнере не забудьте пробросить порт debugpy наружу и задать pathMappings, иначе breakpoints не "прилипнут" к вашим локальным файлам.

Точки останова посложнее

dap.set_breakpoint(condition, hit_condition, log_message) принимает до трёх аргументов - все опциональны, ненужные передавайте как nil. Отсюда три вида "умных" точек:
  • Условная (condition): dap.set_breakpoint(vim.fn.input("Condition: ")) - останавливается, только когда выражение истинно (например, i == 42). Незаменимо в циклах.
  • По счётчику срабатываний (hit_condition): останов не на конкретном значении, а на N-м проходе через строку - когда индекс цикла вам не виден или неудобен, но нужно "поймать 100-ю итерацию". Передаётся вторым аргументом:

Код: Выделить всё

  -- остановиться на 100-м срабатывании этой точки
  require("dap").set_breakpoint(nil, "100")
  -- комбинируется с условием: считать только подходящие срабатывания
  require("dap").set_breakpoint("user.id == 7", "3")  -- 3-й раз, когда id == 7
Адаптеры обычно понимают и операторы - > 50, >= 10, % 5 (каждое 5-е) - но точный синтаксис зависит от debug adapter. Это тот же кейс, что условие i == 42, но без доступа к самой переменной-счётчику.
  • Logpoint (log_message): точка, которая не останавливает выполнение, а печатает сообщение в REPL; выражения в {...} интерполируются: dap.set_breakpoint(nil, nil, "iter={i} value={total}") - "принт без принтов" прямо в исходнике, без правки кода.
LazyVim и DAP

В LazyVim DAP подключается через Extra: :LazyExtras -> включить dap.core. Это ставит nvim-dap, nvim-dap-ui, virtual text и Mason-интеграцию для адаптеров плюс разумные кейбинды на <leader>d. Языковые Extras (lang.python, lang.go и т.д.) часто подтягивают и нужный адаптер. Если вы на дистрибутиве - начинайте отсюда, а не собирайте DAP руками.

3. Терминал внутри редактора

Встроенный :terminal

Neovim несёт настоящий терминальный эмулятор внутри буфера. Команда :terminal (или :term) открывает буфер, в котором запущена интерактивная оболочка - туда можно гнать сборку, тесты, git, что угодно, не выходя из редактора.

Ключевая особенность - режим терминала (Terminal mode). Когда вы "внутри" терминального буфера, нажатия идут в оболочку, а не в Neovim. Чтобы выйти в Normal-режим (для прокрутки, копирования, прыжков по буферу), нажмите <C-\><C-n>. Это самая частая точка спотыкания у новичков.

Код: Выделить всё

Команда / клавиша  |  Действие
-------------------+-------------------------------------------------+----------------------------------
:terminal          |  открыть терминал в текущем окне
:split             |  terminal                                       |  терминал в горизонтальном сплите
:vsplit            |  terminal                                       |  терминал в вертикальном сплите
<C-\><C-n>         |  выйти из Terminal-режима в Normal
i / a              |  вернуться в Terminal-режим (ввод) из Normal
:terminal <cmd>    |  запустить команду сразу (например :term make)
Удобная привязка, чтобы выходить из терминала привычным <Esc> и переключаться между окнами без двойного аккорда:

Код: Выделить всё

vim.keymap.set("t", "<Esc>", [[<C-\><C-n>]], { desc = "Terminal: to normal mode" })
-- Навигация из терминала в соседние окна без выхода вручную:
vim.keymap.set("t", "<C-h>", [[<C-\><C-n><C-w>h]])
vim.keymap.set("t", "<C-j>", [[<C-\><C-n><C-w>j]])
vim.keymap.set("t", "<C-k>", [[<C-\><C-n><C-w>k]])
vim.keymap.set("t", "<C-l>", [[<C-\><C-n><C-w>l]])
Не вешайте <Esc> на выход из Terminal-режима глобально, если внутри терминала работаете в программах, которым нужен сам <Esc> (например, ещё один Vim или TUI). Делайте маппинг буфер-локальным через autocmd на TermOpen для конкретных оболочек.
Автокоманда, чтобы терминальные буферы открывались сразу в режиме ввода и без номеров строк:

Код: Выделить всё

vim.api.nvim_create_autocmd("TermOpen", {
  group = vim.api.nvim_create_augroup("term-open", { clear = true }),
  callback = function()
    vim.opt_local.number = false
    vim.opt_local.relativenumber = false
    vim.cmd.startinsert()
  end,
})
toggleterm: терминал по нажатию

Встроенный :terminal примитивен: один буфер на окно, ручное управление. toggleterm.nvim (akinsho/toggleterm.nvim) делает работу с терминалом цивилизованной:
  • Тоггл по горячей клавише - терминал "выезжает" (плавающим окном, сплитом или снизу) и прячется одним нажатием.
  • Несколько пронумерованных терминалов - 2<C-\> открывает терминал №2. Число-префикс перед <C-\> работает только из Normal-режима и при заданном open_mapping; в Terminal-режиме (когда вы "внутри" терминала) счётчик набрать нельзя - сначала выйдите в Normal через <C-\><C-n>.
  • Именованные кастомные терминалы для конкретных инструментов (например, lazygit - см. главу 29; node REPL; htop).
  • Отправка текущей строки/выделения в терминал (ToggleTermSendCurrentLine, ToggleTermSendVisualSelection).
Минимальная настройка:

Код: Выделить всё

require("toggleterm").setup({
  open_mapping = [[<c-\>]],   -- Ctrl-\ открывает/прячет терминал
  direction = "float",         -- float | horizontal | vertical | tab
  float_opts = { border = "rounded" },
})
Кастомный терминал под lazygit (тот самый паттерн из главы 29):

Код: Выделить всё

local Terminal = require("toggleterm.terminal").Terminal
local lazygit = Terminal:new({ cmd = "lazygit", direction = "float", hidden = true })
vim.keymap.set("n", "<leader>gg", function() lazygit:toggle() end, { desc = "Lazygit" })

Код: Выделить всё

Возможность                       |  :terminal  |  toggleterm
----------------------------------+-------------+------------
Тоггл одной клавишей              |  нет        |  да
Плавающее окно                    |  вручную    |  да
Несколько именованных терминалов  |  вручную    |  да
Отправка строки/выделения         |  нет        |  да
Интеграция (lazygit и пр.)        |  вручную    |  из коробки
В LazyVim базовый toggle-терминал уже есть: <C-/> (или <leader>ft для плавающего) открывает терминал в корне проекта без отдельной установки toggleterm.

4. Интеграция с tmux

Зачем

Многие живут в tmux: несколько панелей, в одной - Neovim, в других - серверы, логи, REPL. Проблема в том, что у Neovim своя система окон (сплитов), а у tmux - своя система панелей, и переключаться приходится разными хоткеями: <C-w>h/j/k/l внутри Neovim и <prefix> + стрелки в tmux. Граница между "окном Neovim" и "панелью tmux" постоянно сбивает.

vim-tmux-navigator

vim-tmux-navigator (christoomey/vim-tmux-navigator) стирает эту границу. Вы ставите плагин в Neovim и добавляете парные привязки в ~/.tmux.conf. После этого <C-h>/<C-j>/<C-k>/<C-l> перемещают фокус сквозь границу: если рядом окно Neovim - прыгаем в него, если панель tmux - в неё. Один набор клавиш на всю сетку.

Сторона tmux (~/.tmux.conf):

Код: Выделить всё

# Умное переключение панелей, понимающее сплиты Vim/Neovim
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
    | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|l?n?vim?x?|fzf)(diff)?$'"
bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h'  'select-pane -L'
bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j'  'select-pane -D'
bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k'  'select-pane -U'
bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l'  'select-pane -R'
Сторона Neovim - просто установить плагин (через lazy.nvim); кейбинды <C-h/j/k/l> он навешивает сам.

Код: Выделить всё

Курсор в окне кода (левый сплит Neovim)
Нажимаем  <C-l>   -> перешли в правый сплит Neovim (терминал)
Нажимаем  <C-l>   -> справа окон Neovim больше нет -> перешли в панель tmux с логами
Нажимаем  <C-h>   -> вернулись обратно в Neovim, в нужный сплит
Помните про clipboard и OSC52: tmux может ломать авто-детект OSC52 для системного буфера. Если копирование "молча" не работает по SSH, включите set -g allow-passthrough on в tmux или сконфигурируйте провайдер явно. Подробнее про регистры и clipboard - в главе 8.
5. neovim-remote: один Neovim снаружи

Проблема

Вы внутри Neovim, открыли терминал (или работаете в tmux-панели рядом) и хотите из shell открыть файл в уже запущенном Neovim, а не плодить вложенные экземпляры. Классический случай - git commit: Git запускает $EDITOR для сообщения коммита, и если EDITOR=nvim, вы получаете Neovim внутри Neovim. Неприятно.

Решение

Neovim умеет слушать сокет. Запущенный экземпляр публикует адрес в переменной $NVIM (для дочерних процессов терминала это работает автоматически), либо его можно задать явно: nvim --listen /tmp/nvim.sock.

Управлять им снаружи можно двумя способами:
  1. neovim-remote (nvr) - отдельная утилита (pip install neovim-remote). Команды nvr файл, nvr -cc split файл, nvr --remote-wait (для редакторов коммитов - вернуть управление только после закрытия буфера).
  2. Нативно, без nvr - у nvim есть флаг --remote и семейство --remote-*: nvim --server $NVIM --remote файл открывает файл в уже запущенном сервере.
Пример: чтобы git commit из встроенного терминала открывал сообщение в текущем Neovim как обычный буфер, а не вложенный редактор:

Код: Выделить всё

# В shell-профиле, например ~/.zshrc:
if [ -n "$NVIM" ]; then
  export EDITOR='nvr --remote-wait'   # вариант с neovim-remote
  # либо нативно:
  # export EDITOR="nvim --server $NVIM --remote-wait"
fi

Код: Выделить всё

Внутри :terminal набираем  git commit
-> сообщение коммита открывается БУФЕРОМ в текущем Neovim (не вложенный nvim)
Редактируем, :wq
-> nvr возвращает управление git, коммит создан
--remote-wait критичен: без него Git подумает, что редактор закрылся мгновенно, и не дождётся текста.

6. Лучшие практики 2026
  • Новичку - LazyVim как основа, kickstart.nvim параллельно для обучения. Рабочая IDE сразу плюс прозрачный однофайловый конфиг, чтобы понимать внутренности. Не выбирайте "или-или" - берите оба, но в разных ролях.
  • Не смешивайте дистрибутив с хаотичными ручными правками. В LazyVim переопределяйте через слой opts (и :LazyExtras), а не правкой файлов дистрибутива. В kickstart, наоборот, слоёв нет - правьте файл напрямую.
  • DAP начинайте с языкового Extra/готового адаптера, а не с ручной сборки. В LazyVim - dap.core + lang.*. Адаптеры ставьте через Mason (mason-nvim-dap), чтобы не возиться с путями.
  • Условные точки, hit-condition и logpoints вместо print. Условие (i == 42), останов на N-м срабатывании (hit_condition) и логпоинты с интерполяцией экономят часы в циклах и горячих путях.
  • Для уже запущенного процесса - request = "attach". Веб-сервер, воркер, тесты, код в Docker/на удалённом хосте отлаживаются подключением к работающему debugpy --listen, а не перезапуском через launch.
  • Терминал - через toggleterm (или встроенный toggle LazyVim), а не голый :terminal. Тоггл одной клавишей, именованные терминалы под lazygit/REPL, отправка выделения.
  • <C-\><C-n> - мышечная память для выхода из Terminal-режима. Замапьте <Esc> буфер-локально, но осторожно с вложенными TUI.
  • Единый набор <C-h/j/k/l> через vim-tmux-navigator. Одни клавиши на сплиты Neovim и панели tmux - меньше когнитивной нагрузки.
  • Один Neovim, а не матрёшка. Настройте EDITOR на nvr --remote-wait (или нативный --remote-wait) внутри терминала, чтобы git commit и подобное открывались буфером.
  • Опытным Vim-юзерам не мигрировать без причины. Если ваш конфиг работает - дистрибутив не обязателен. На серверах, где нельзя ставить софт, держите беглость в чистом Vim (см. главу 24).
7. Частые ошибки
  • Лезть в файлы дистрибутива вместо слоя override. Правки внутри LazyVim/NvChad затираются при обновлении и ломают каскад opts. Используйте предусмотренный механизм переопределения.
  • Ждать, что nvim-dap сам поставит точки останова без адаптера. DAP - только клиент; без установленного debug adapter (debugpy/delve/codelldb) и конфигурации dap.configurations.<lang> ничего не запустится.
  • Забыть request/program в конфиге DAP. Конфигурация требует как минимум type, request (launch/attach) и точки входа (program/${file}).
  • "Залипнуть" в Terminal-режиме. Нажатия уходят в оболочку; команды Neovim не работают, пока не нажмёте <C-\><C-n>.
  • Глобальный <Esc> на выход из терминала ломает вложенные TUI. Внутри терминала может крутиться программа, которой нужен сам <Esc> - делайте маппинг буфер-локальным.
  • Поставить vim-tmux-navigator только в Neovim. Без парных привязок в ~/.tmux.conf сквозная навигация не работает - нужны обе стороны.
  • EDITOR=nvim внутри терминала Neovim. git commit запустит вложенный Neovim. Решение - --remote-wait через nvr или нативно.
  • Забыть --remote-wait (взять просто --remote). Git не дождётся текста коммита и завершится с пустым/незаполненным сообщением.
  • Полагаться на OSC52-copy через tmux без allow-passthrough. Копирование в системный буфер по SSH "молча" не сработает (см. главу 8).
8. Упражнения
  1. Поставьте kickstart.nvim в песочнице. Используйте отдельный конфиг через переменную окружения NVIM_APPNAME (например, NVIM_APPNAME=kickstart nvim), чтобы не трогать основной ~/.config/nvim. Прочитайте init.lua целиком и найдите, где включается LSP, а где - пикер.
  1. Соберите минимальный DAP под свой язык. Установите адаптер (Python - debugpy, Go - delve), настройте dap.adapters и dap.configurations, привяжите <F5>/<F10>/<leader>b. Поставьте точку останова, запустите и пройдите три шага, наблюдая переменные в dap-ui.
  1. Условный breakpoint и hit-condition. В цикле на 100 итераций поставьте условную точку останова, срабатывающую только на i == 42. Затем уберите условие и поставьте точку с hit_condition = "42" (dap.set_breakpoint(nil, "42")) - убедитесь, что она тоже замирает на 42-м проходе, не зная про переменную i. Сравните оба подхода.
  1. Терминальный workflow. Настройте toggleterm с тогглом на <C-\> и отдельным плавающим терминалом под любой TUI (htop/lazygit). Отправьте текущую строку кода в терминал через ToggleTermSendCurrentLine.
  1. Сквозная навигация. Установите vim-tmux-navigator в Neovim и добавьте парные привязки в ~/.tmux.conf. В сессии tmux с панелью Neovim и панелью с tail -f логом пройдите <C-h/j/k/l> через границу редактора и tmux, ни разу не используя <prefix>.
  1. Никакой матрёшки. Настройте EDITOR на --remote-wait так, чтобы при git commit из встроенного :terminal сообщение открывалось буфером в текущем Neovim. Проверьте, что без --remote-wait Git завершается с пустым сообщением, а с ним - ждёт :wq.
  1. Attach к работающему процессу. Запустите простой веб-сервер или скрипт под python -m debugpy --listen 5678 --wait-for-client .... Добавьте в dap.configurations.python конфигурацию request = "attach" с connect = { host, port } и подключитесь из Neovim к живому процессу. Поставьте breakpoint в обработчике и поймайте реальный запрос.
  1. Изоляция конфига. Через NVIM_APPNAME поставьте LazyVim рядом со своим основным конфигом (~/.config/lazyvim + NVIM_APPNAME=lazyvim nvim), не трогая ~/.config/nvim. Убедитесь, что оба запускаются независимо и делят только бинарь Neovim. Заведите алиас для быстрого запуска.
9. Главное из главы
  • Дистрибутивы экономят недели. В 2026 практичный путь: жить на LazyVim (рабочая IDE из коробки, blink.cmp и snacks по умолчанию, Extras через :LazyExtras) и параллельно изучить kickstart.nvim построчно, чтобы понимать внутренности. NvChad - за скорость и UI (base46), AstroNvim - за модульность. Свой конфиг даёт полный контроль ценой времени.
  • Не смешивайте правки дистрибутива со слоями его конфигурации - override идёт через opts, а не правку файлов.
  • Отладка нативна. nvim-dap (DAP-клиент) + nvim-dap-ui (панели) + debug adapter под язык дают breakpoints, шаги, инспекцию и REPL без выхода в IDE. Условные точки, останов по счётчику срабатываний (hit_condition) и logpoints заменяют print. Для уже работающего процесса (веб-сервер, тесты, контейнер) - request = "attach", а не launch. Для Python указывайте pythonPath на интерпретатор venv, иначе debugpy не увидит зависимости проекта.
  • Терминал под рукой. Встроенный :terminal плюс <C-\><C-n> для выхода из Terminal-режима; toggleterm - тоггл одной клавишей, именованные терминалы и отправка выделения.
  • Бесшовные интеграции. vim-tmux-navigator объединяет сплиты Neovim и панели tmux под <C-h/j/k/l>; neovim-remote (nvr --remote-wait) и нативный --remote-wait избавляют от вложенных Neovim в git commit.
В следующей главе (31) мы вынесем накопленный Vim-навык за пределы редактора - в IDE через IdeaVim и vscode-neovim, в браузер и в shell-режим vi.
👍1 ❤️2 🔥1 😄 🤔1
✔ Лучший ответ сформирован автоматически — QemuLord
Roman_Vim писал(а):а в pythonPath укажите на интерпретатор venv, иначе debugpy не увидит зависимости проекта вот это прям мой случай был. сидел час не понимал почему отладчик орёт ModuleNotFoundError на пакет который точно стоит. оказалось цеплялся к системному питону а не к venv. добавил pythonPath с os.getenv VIRTUAL_ENV и всё взлетело
Перейти к ответу →
Аватара пользователя
linux11
Сообщения: 1
Зарегистрирован: 05 июн 2026, 19:34

Re: Дистрибутивы, отладка и терминал: быстрый старт и интеграции

Сообщение linux11 »

вот это про NVIM_APPNAME прям сэкономило мне нервы. раньше сносил свой конфиг чтобы потыкать LazyVim, теперь просто alias lvim='NVIM_APPNAME=lazyvim nvim' и два редактора рядом живут, общий только бинарь. жаль раньше не знал
👍2 ❤️2 🔥 😄 🤔
Аватара пользователя
QemuLord
Сообщения: 1
Зарегистрирован: 11 май 2026, 05:58

Re: Дистрибутивы, отладка и терминал: быстрый старт и интеграции

Сообщение QemuLord »

✔ Лучший ответ — сформирован автоматически
Roman_Vim писал(а):а в pythonPath укажите на интерпретатор venv, иначе debugpy не увидит зависимости проекта
вот это прям мой случай был. сидел час не понимал почему отладчик орёт ModuleNotFoundError на пакет который точно стоит. оказалось цеплялся к системному питону а не к venv. добавил pythonPath с os.getenv VIRTUAL_ENV и всё взлетело
👍1 ❤️2 🔥 😄 🤔
Аватара пользователя
Jjg77
Сообщения: 1
Зарегистрирован: 21 май 2026, 23:20

Re: Дистрибутивы, отладка и терминал: быстрый старт и интеграции

Сообщение Jjg77 »

а вопрос по attach: если процесс крутится в докере, я пробросил порт 5678 наружу, конфиг attach добавил, а брейки серым висят и не прилипают. что ещё надо?
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
njbecke1
Сообщения: 2
Зарегистрирован: 05 июн 2026, 13:56

Re: Дистрибутивы, отладка и терминал: быстрый старт и интеграции

Сообщение njbecke1 »

по навигатору затык был классический: поставил vim-tmux-navigator только в нвим и думаю чего <C-l> в панель tmux не прыгает. а надо ещё и в tmux.conf парные биндинги с is_vim добавить. две стороны нужны, в уроке прям написано но я проскочил
👍1 ❤️1 🔥 😄 🤔
Аватара пользователя
swill
Сообщения: 1
Зарегистрирован: 06 июн 2026, 22:22

Re: Дистрибутивы, отладка и терминал: быстрый старт и интеграции

Сообщение swill »

залип в терминале как и обещано в разделе про частые ошибки) тыкал команды нвима а они в шелл уходят. <C-\><C-n> теперь намертво в пальцах. ещё повесил Esc буфер-локально через TermOpen, но не глобально - внутри иногда lazygit гоняю, ему свой Esc нужен
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
Nbaskova
Сообщения: 1
Зарегистрирован: 11 май 2026, 00:45

Re: Дистрибутивы, отладка и терминал: быстрый старт и интеграции

Сообщение Nbaskova »

спасибо за logpoint, это реально принт без принтов. больше не сорю print по коду
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Git внутри редактора: fugitive, gitsigns и lazygit
Следующая глава →
Vim повсюду: IDE, браузер и shell

Все главы курса «Vim и Neovim: модальное редактирование от основ до современного Neovim»

Поделиться темой: ✈ Telegram VK
  • Похожие темы

Вернуться в «Vim и Neovim: модальное редактирование от основ до Neovim 2026»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость