DAP Debugging

    Definição curta: Tutorial para configurar o DAP (Debug Adapter Protocol) no Neovim para debugging de código com breakpoints, variáveis e stack traces.

    Antes de começar

    • Neovim v0.11 ou mais recente instalado — confira com nvim --version
    • Um init.lua que já carrega, ainda que vazio

    O que você vai aprender

    • Explicar Plugins necessários com suas palavras
    • Explicar Configuração básica com suas palavras
    • Explicar Breakpoints com suas palavras
    • Localizar o assunto desta página no :help do seu próprio Neovim

    O que é

    DAP é um protocolo para debugging que permite ao Neovim se comunicar com debug adapters de diferentes linguagens. O nvim-dap é a implementação em Lua.

    Índice de sub-tópicos

    Plugins necessários

    -- plugins/dap.lua
    return {
      "mfussenegger/nvim-dap",
      dependencies = {
        "rcarriga/nvim-dap-ui",      -- UI para DAP
        "theHamsta/nvim-dap-virtual-text", -- Virtual text
      },
    }

    Configuração básica

    -- setup/dap.lua
    local dap = require("dap")
    local dapui = require("dapui")
    
    dapui.setup()
    
    dap.listeners.after.event_initialized["dapui_config"] = function()
      dapui.open()
    end

    Breakpoints

    -- Breakpoint simples
    vim.keymap.set("n", "<leader>b", dap.toggle_breakpoint)
    
    -- Breakpoint condicional: para só quando a expressão for verdadeira
    vim.keymap.set("n", "<leader>B", function()
      dap.set_breakpoint(vim.fn.input("Condição do breakpoint: "))
    end)

    O nvim-dap não define atalho nenhum por padrão — a documentação dele diz isso com todas as letras, para não colidir com o mapeamento de quem instala. As teclas abaixo são a convenção que a maioria dos exemplos usa, mas só existem depois que você as mapeia:

    vim.keymap.set("n", "<F5>",  dap.continue)
    vim.keymap.set("n", "<F6>",  dap.pause)
    vim.keymap.set("n", "<F9>",  dap.toggle_breakpoint)
    vim.keymap.set("n", "<F10>", dap.step_over)
    vim.keymap.set("n", "<F11>", dap.step_into)
    vim.keymap.set("n", "<F12>", dap.step_out)
    Tecla (depois de mapeada)Função
    <F5>dap.continue() — inicia ou continua
    <F6>dap.pause()
    <F9>dap.toggle_breakpoint()
    <F10>dap.step_over()
    <F11>dap.step_into()
    <F12>dap.step_out()

    Exemplo Lua

    -- Configurar debug para Lua (ZeroBrane ou lokit)
    dap.adapters.lua = {
      type = "server",
      host = "127.0.0.1",
      port = 8172,
    }

    Exemplo Python

    -- Python debug com debugpy
    dap.adapters.python = {
      type = "executable",
      command = "python",
      args = { "-m", "debugpy.adapter" },
    }

    Você aprendeu

    • Plugins necessários
    • Configuração básica
    • Breakpoints
    • Navegação de debug
    • Exemplo Lua

    Perguntas para reflexão

    1. O que Plugins necessários resolve, e o que se perde sem isso?
    2. O que Configuração básica resolve, e o que se perde sem isso?
    3. O que Breakpoints resolve, e o que se perde sem isso?
    4. Qual parte desta página você conseguiria reproduzir sem consultar, direto no editor?

    Artigos relacionados

    Veja também

    Referências