Перейти к содержанию

Как устроена интеграция

Столько механики, сколько нужно, чтобы рассуждать о ней, когда что-то ведёт себя странно. Само устройство — в Разработке.

Кто с кем говорит

   Neovim  ── source frontend protocol ──►  bugsaur  ── DAP ──►  адаптер ──►  ваша программа
    (Lua)         по Unix-сокету            (ядро)               (dlv, codelldb, …)

Neovim не является DAP-клиентом и с адаптером не разговаривает никогда. Он шлёт намерения — запусти это, переключи точку здесь, шагни — и получает состояние для отображения. DAP-сессией владеет Bugsaur.

Сокет

bugsaur gui --socket <путь> поднимает окно и бэкенд-сессию, после чего принимает source frontend на этом сокете. При gui = true плагин запускает этот режим сам, поэтому отдельный терминал не нужен.

Сокет создаётся автоматически: /tmp/rust-debugger-nvim-<pid>.sock.

Жизненный цикл: редактор не владелец

Закрытие Neovim не завершает сессию. Бэкенд продолжает работать, а подключившийся заново фронтенд получает актуальное состояние через обмен hello — не проигрывание пропущенного, а снимок того, как всё обстоит сейчас.

Это практическое следствие модели владения: ваш редактор — наблюдатель, который может уйти и вернуться.

С auto_attach = true старт Neovim молча прицепляется к идущей сессии проекта, а не заводит новую.

Что пересекает границу

Направление Что
Neovim → Bugsaur запуск сессии с профилем; набор точек останова; команды выполнения; просьба вывести окно вперёд
Bugsaur → Neovim текущее место остановки; состояния точек от адаптера; фаза сессии

Заметно отсутствуют: переменные, содержимое стека и результаты watches. Их рисует окно отладчика, у которого они и так есть, а отправка их ещё и редактору означала бы двух владельцев одного состояния.

Почему окно — отдельный процесс

Окно отладчика не является буфером Neovim. Это нативное окно процесса bugsaur, и поэтому:

  • оно переживает редактор;
  • обработка клавиатуры у него своя, и mappings Neovim до него не дотягиваются — см. Клавиши;
  • его можно поднять независимо, чем и занимаются :DebugFocus и gui_focus_on_stop.

Когда соединения нет

Проверяйте по порядку:

  1. bugsaur.state.last_error в Lua;
  2. что сокет существует: /tmp/rust-debugger-nvim-<pid>.sock;
  3. что binary в setup() указывает на существующий исполняемый файл.

Подробнее: Диагностика → Интеграция с Neovim.