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

Neovim: команды

Все команды, которые определяет плагин.

Запуск сессии

:DebugStart [профиль]

Запускает сессию отладки для текущего проекта. Без аргумента берётся профиль default из .bugsaur/config.toml, с аргументом — названный. Имена дополняются по Tab и читаются из конфига проекта.

Если конфига нет, отладчик опознаёт язык, создаёт конфиг, сообщает об этом и продолжает.

Используются сохранённые точки останова из .bugsaur/breakpoints.json. Если их нет, начальной становится текущая строка.

:DebugTest

Отлаживает тест под курсором. Курсор должен находиться внутри тестовой функции — в Rust годится и строка #[test]. На строке тестовой группы, например mod tests или PHP-класса с распознанными тестовыми методами, запускается вся группа. Обычный PHP-класс отвергается.

Требуется сохранённый буфер: бэкенд читает файл с диска. В отличие от :DebugStart, сохранённые точки останова не подхватываются — используются только точки текущего запроса.

Управление выполнением

Команда Что делает
:DebugContinue выполнять до следующей точки останова
:DebugStepOver выполнить текущую строку, остановиться на следующей
:DebugStepInto войти в вызов на текущей строке
:DebugStepOut доработать до возврата из текущей функции
:DebugPause прервать работающую программу
:DebugStop завершить сессию

Они соответствуют тем же операциям, что и клавиши в самом окне; см. Работа с Bugsaur → Шаги.

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

:ToggleBreakpoint [условие]

Ставит или снимает точку останова на текущей строке. С аргументом точка становится условной:

:ToggleBreakpoint count > 10
:ToggleBreakpoint user.id == 42

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

Окно

:DebugFocus

Выводит окно отладчика вперёд. Полезно, когда остановку вызвали не из редактора — например, запросом к PHP-приложению из браузера — и окно осталось позади чего-то ещё.

С gui_focus_on_stop = true в setup() это происходит само на каждой остановке.

Lua API для расширений

Кроме команд, модуль отдаёт функции для скриптов:

local bugsaur = require("bugsaur")

bugsaur.list(opts)              -- записи; opts.root или opts.path сужают выборку
bugsaur.set(path, line, cond)   -- поставить или заменить условие; true, если набор изменился
bugsaur.remove(path, line)      -- снять одну; true, если было что снимать
bugsaur.remove_file(path)       -- снять все в файле; сколько снято
bugsaur.clear(opts)             -- снять всё или всё в opts.root

Запись из list(), сортировка по пути, затем по строке:

{
  path = "/abs/src/main.rs",
  relative = "src/main.rs",   -- nil, если файл вне любого корня
  root = "/abs",              -- nil там же
  line = 42,
  condition = nil,
  state = "verified",         -- "verified" | "rejected" | "pending"
}

list() без аргументов отдаёт всё, что сейчас в памяти. opts.root сначала дочитывает набор указанного корня с диска — так список покажет проект, файлы которого в этом Neovim ещё не открывали.

Любое изменение набора — из этих функций, из :ToggleBreakpoint или при чтении файла с диска — стреляет автокомандой:

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

Две оговорки

bugsaur.set не проверяет, есть ли на строке исполняемое место — буфер может быть даже не загружен. Проверяет только :ToggleBreakpoint, потому что работает по курсору.

bugsaur.state — внутреннее состояние плагина, а не контракт. Полагаться на него нельзя.