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

Синхронизация точек останова

Точки останова общие у редактора и отладчика через один файл. Эта страница объясняет, как именно и что эта общность гарантирует, а что нет.

Один файл, два читателя

<корень>/.bugsaur/
├── config.toml        проект — общий, коммитится
├── breakpoints.json   ваши точки останова — личные, скрыты от гита
└── .gitignore         создаётся при первой записи

Neovim пишет breakpoints.json, отладчик его читает. В этом весь механизм, и он даёт три свойства:

  • Они переживают перезапуск Neovim. Набор восстанавливается при следующем открытии файла. Заводить точки заново после перезапуска редактора не нужно.
  • Терминал и редактор согласованы. bugsaur run --project . без единого --break стартует ровно с теми точками, которые взял бы :DebugStart.
  • Они переживают переезд. Пути хранятся относительно корня проекта, поэтому перемещение или переименование каталога проекта набор не ломает.

Личные, а не общие

При первой записи рядом создаётся .bugsaur/.gitignore, который прячет breakpoints.json от гита. config.toml принадлежит проекту, точки останова — вам.

Существующий .gitignore не трогается: если он у вас свой, добавьте строку breakpoints.json руками.

Номер строки хранится как есть

Номер строки сохраняется буквально. Если файл изменился вне редактора — rebase, git checkout, прогон форматтера при закрытом Neovim, — точка останется на прежнем номере строки, и переставить её придётся руками.

Файлы вне любого проекта

Файлу, который не лежит ни под одним корнем .bugsaur/, сохраняться некуда. Его точки останова живут до конца сессии редактора и исчезают. Это следствие того, что хранилище привязано к проекту, а не ошибка.

Командная строка перебивает файл

bugsaur gui --project . --break src/main.rs:15

Явный --break заменяет сохранённый набор целиком, а не дополняет его. Без --break берётся сохранённый набор как есть.

:DebugTest ведёт себя так же, как явно заданный набор: запуск теста использует только точки текущего запроса, а не сохранённые.

Три состояния точки останова

Знак в поле у номеров строк показывает, что ответил адаптер:

Знак Состояние Что означает
verified адаптер принял точку на этой строке
pending ответа ещё нет
rejected адаптер отказал

Адаптер вправе сдвинуть точку с запрошенной строки. Когда он так делает, подтверждения на запрошенной строке нет, и она остаётся pending — состояние отражает ответ на ваш запрос, а не наличие точки где-то рядом.

Те же состояния показаны кружками в панели Breakpoints окна.

Реакция на изменения из плагина

Любое изменение набора стреляет автокомандой User:

vim.api.nvim_create_autocmd("User", {
  pattern = "BugsaurBreakpointsChanged",
  callback = function(event)
    -- event.data.paths — затронутые файлы
  end,
})

Она срабатывает и на :ToggleBreakpoint, и на вызовы Lua API, и на чтение набора файла с диска. Полное API: Команды.