/ nvim / lua / plugins / go.lua
go.lua
  1  --- Go: go.nvim + DAP (dlv, dap-ui, dap-go). Build once: :lua require("go.install").update_all_sync()
  2  return {
  3    specs = {
  4      { src = 'https://github.com/ray-x/go.nvim', name = 'go.nvim' },
  5      { src = 'https://github.com/ray-x/guihua.lua', name = 'guihua.lua' },
  6      { src = 'https://github.com/mfussenegger/nvim-dap', name = 'nvim-dap' },
  7      { src = 'https://github.com/leoluz/nvim-dap-go', name = 'nvim-dap-go' },
  8      { src = 'https://github.com/rcarriga/nvim-dap-ui', name = 'nvim-dap-ui' },
  9    },
 10    config = function()
 11      local go_ok, go = pcall(require, 'go')
 12      if go_ok and type(go) == 'table' and go.setup then
 13        go.setup({
 14          lsp_cfg = false,    -- gopls managed by lsp/servers/go.lua, not go.nvim
 15          lsp_codelens = true,
 16          diagnostic = {
 17            hdlr = true,
 18            underline = true,
 19            virtual_text = { spacing = 2, prefix = '' },
 20            signs = { '', '', '', '' },
 21            update_in_insert = false,
 22          },
 23          lsp_inlay_hints = { enable = false },
 24        })
 25      end
 26  
 27      local dap_ok, dap = pcall(require, 'dap')
 28      local dapui_ok, dapui = pcall(require, 'dapui')
 29      local dap_go_ok, dap_go = pcall(require, 'dap-go')
 30      if not dap_ok or not dap then
 31        return
 32      end
 33  
 34      if dap_go_ok and dap_go and dap_go.setup then
 35        dap_go.setup()
 36      end
 37      if dapui_ok and dapui and dapui.setup then
 38        ---@diagnostic disable: missing-fields
 39        dapui.setup({})
 40      end
 41  
 42      dap.adapters.go = {
 43        type = 'server',
 44        port = '${port}',
 45        executable = {
 46          command = 'dlv',
 47          args = { 'dap', '-l', '127.0.0.1:${port}' },
 48        },
 49      }
 50  
 51      if dapui and dapui.open and dapui.close then
 52        local open, close = function()
 53          dapui.open({})
 54        end, function()
 55          dapui.close({})
 56        end
 57        dap.listeners.before.attach['dapui_config'] = open
 58        dap.listeners.before.launch['dapui_config'] = open
 59        dap.listeners.after.event_initialized['dapui_config'] = open
 60        dap.listeners.before.event_terminated['dapui_config'] = close
 61        dap.listeners.before.event_exited['dapui_config'] = close
 62      end
 63  
 64      vim.keymap.set('n', '<leader>du', function()
 65        pcall(require('dapui').toggle, {})
 66      end, { desc = '[d]ap [u]i' })
 67      vim.keymap.set('n', '<leader>de', function()
 68        pcall(require('dapui').eval)
 69      end, { desc = '[d]ap [e]val' })
 70      vim.keymap.set('n', '<leader>db', function()
 71        require('dap').toggle_breakpoint()
 72      end, { desc = 'toggle [d]ebug [b]reakpoint' })
 73      vim.keymap.set('n', '<leader>dB', function()
 74        require('dap').set_breakpoint(vim.fn.input('Breakpoint condition: '))
 75      end, { desc = '[d]ebug [B]reakpoint' })
 76      vim.keymap.set('n', '<leader>dc', function()
 77        require('dap').continue()
 78      end, { desc = '[d]ebug [c]ontinue' })
 79      vim.keymap.set('n', '<leader>di', function()
 80        require('dap').step_into()
 81      end, { desc = '[d]ebug [i]nto' })
 82      vim.keymap.set('n', '<leader>do', function()
 83        require('dap').step_over()
 84      end, { desc = '[d]ebug step [o]ver' })
 85      vim.keymap.set('n', '<leader>dO', function()
 86        require('dap').step_out()
 87      end, { desc = '[d]ebug step [O]ut' })
 88      vim.keymap.set('n', '<leader>dh', function()
 89        require('dap').step_back()
 90      end, { desc = '[d]ebug step back [h]' })
 91      vim.keymap.set('n', '<leader>dx', function()
 92        require('dap').restart()
 93      end, { desc = '[d]ebug restart [x]' })
 94      vim.keymap.set('n', '<leader>dC', function()
 95        require('dap').run_to_cursor()
 96      end, { desc = '[d]ebug [C]ursor' })
 97      vim.keymap.set('n', '<leader>dg', function()
 98        require('dap').goto_()
 99      end, { desc = '[d]ebug [g]o to line' })
100      vim.keymap.set('n', '<leader>dj', function()
101        require('dap').down()
102      end, { desc = '[d]ebug [j]ump down' })
103      vim.keymap.set('n', '<leader>dk', function()
104        require('dap').up()
105      end, { desc = '[d]ebug [k]ump up' })
106      vim.keymap.set('n', '<leader>dl', function()
107        require('dap').run_last()
108      end, { desc = '[d]ebug [l]ast' })
109      vim.keymap.set('n', '<leader>dp', function()
110        require('dap').pause()
111      end, { desc = '[d]ebug [p]ause' })
112      vim.keymap.set('n', '<leader>dr', function()
113        require('dap').repl.toggle()
114      end, { desc = '[d]ebug [r]epl' })
115      vim.keymap.set('n', '<leader>dR', function()
116        require('dap').clear_breakpoints()
117      end, { desc = '[d]ebug [R]emove breakpoints' })
118      vim.keymap.set('n', '<leader>ds', function()
119        require('dap').session()
120      end, { desc = '[d]ebug [s]ession' })
121      vim.keymap.set('n', '<leader>dt', function()
122        require('dap').terminate()
123      end, { desc = '[d]ebug [t]erminate' })
124      vim.keymap.set('n', '<leader>dw', function()
125        pcall(require('dap.ui.widgets').hover)
126      end, { desc = '[d]ebug [w]idgets' })
127    end,
128  }