-- Exit if the language server isn't available if vim.fn.executable('clangd') ~= 1 then return end -- require'lspconfig'.clangd.setup{} local root_files = { 'compile_commands.json', '.vscode', '.git', } vim.lsp.start { name = 'clangd', cmd = { 'clangd' }, root_dir = vim.fs.dirname(vim.fs.find(root_files, { upward = true })[1]), capabilities = require('user.lsp').make_client_capabilities(), filetypes = { "c" }, on_attach = function(client, bufnr) require("nvim-navic").attach(client, bufnr) require("workspace-diagnostics").populate_workspace_diagnostics(client, bufnr) end } local dap = require("dap") local pickers = require("telescope.pickers") local finders = require("telescope.finders") local conf = require("telescope.config").values local actions = require("telescope.actions") local action_state = require("telescope.actions.state") if vim.fn.executable('gdb') == 1 then dap.adapters.gdb = { type = "executable", command = "gdb", args = { "-i", "dap" } } end -- DAP loads this automatically as of now. May be needed to load the debugger for asm? -- if require('user.file_exists').file_exists(vim.fs.dirname(vim.fs.find(root_files, { upward = true })[1]) .. "/.vscode/launch.json") then -- require("dap.ext.vscode").load_launchjs(nil, { cppdbg = { "c", "cpp", "asm" } }) -- require("dap.ext.vscode").load_launchjs(nil, { gdb = { "c", "cpp", "asm" } }) -- end if vim.fn.executable('OpenDebugAD7') == 1 then dap.adapters.cppdbg = { id = 'cppdbg', type = 'executable', command = 'OpenDebugAD7', } dap.configurations.c = { { name = "Launch an executable", type = "cppdbg", request = "launch", cwd = "${workspaceFolder}", program = function() return coroutine.create(function(coro) local opts = {} pickers .new(opts, { prompt_title = "Path to executable", finder = finders.new_oneshot_job({ "fd", "--hidden", "--no-ignore", "--type", "x" }, {}), sorter = conf.generic_sorter(opts), attach_mappings = function(buffer_number) actions.select_default:replace(function() actions.close(buffer_number) coroutine.resume(coro, action_state.get_selected_entry()[1]) end) return true end, }) :find() end) end, stopAtBeginningOfMainSubprogram = true, }, } end