Wed, 15 May 2024 22:44:16 -0500
set up nvim-dap etc
new file mode 100644 --- /dev/null +++ b/.config/nvim/after/ftplugin/elixir.lua @@ -0,0 +1,57 @@ +-- elixir-tools installs elixir-ls in directories by version and otp version in +-- order to match up the right version with your app. it doesn't expose what +-- path is in use except for how it launches elixir-ls, so we can scrape it out +-- of there. it's not clear to me how nvim-dap would handle an adapter's +-- definition changing, so i wouldn't expect this to work well with more than +-- one version in the same nvim session. + +local function find_elixir_lsp_dap_cmd(bufnr) + local elixir_lsp = vim.lsp.get_active_clients({ + idname = "ElixirLS", + bufnr = bufnr or vim.api.nvim_get_current_buf(), + })[1] + + if elixir_lsp then + local elixir_lsp_cmd = elixir_lsp.config.cmd[1] + local dap_cmd = elixir_lsp_cmd:gsub("language_server.", "debug_adapter.") + + return dap_cmd + end +end + +local dap = require("dap") + +dap.adapters.mix_task = function(callback, _) + local dap_cmd = find_elixir_lsp_dap_cmd() + + if dap_cmd then + callback({ + type = 'executable', + command = find_elixir_lsp_dap_cmd(), + args = {}, + }) + end +end + +dap.configurations.elixir = { + { + type = "mix_task", + name = "mix test", + task = 'test', + taskArgs = { "--trace" }, + request = "launch", + startApps = true, + projectDir = "${workspaceFolder}", + requireFiles = { + "test/**/test_helper.exs", + "test/**/*_test.exs" + } + }, + { + type = "mix_task", + name = "phx.server", + request = "launch", + task = "phx.server", + projectDir = "${workspaceFolder}" + }, +}
--- a/.config/nvim/lua/config/autocmds.lua +++ b/.config/nvim/lua/config/autocmds.lua @@ -21,13 +21,11 @@ autocmd(g, { "WinLeave", "FocusLost" }, end) -- >> auto mkpath on write -autocmd(g, "BufWritePre", "*", { - callback = function(ctx) - if vim.bo[ctx.buf].buftype == "" and not string.match(ctx.file, "^[%w]+:") then - fn.mkdir(fn.fnamemodify(ctx.file, ":p:h"), "p") - end - end, -}) +autocmd(g, "BufWritePre", "*", function(ctx) + if vim.bo[ctx.buf].buftype == "" and not string.match(ctx.file, "^[%w]+:") then + fn.mkdir(fn.fnamemodify(ctx.file, ":p:h"), "p") + end +end) -- >> auto session ?
new file mode 100644 --- /dev/null +++ b/.config/nvim/lua/plugins/dap.lua @@ -0,0 +1,69 @@ +return { + { + "mfussenegger/nvim-dap", + dependencies = { + { + "rcarriga/nvim-dap-ui", + dependencies = { "nvim-neotest/nvim-nio" }, + -- stylua: ignore + keys = { + { "<leader>du", function() require("dapui").toggle({ }) end, desc = "Dap UI" }, + { "<leader>de", function() require("dapui").eval() end, desc = "Eval", mode = {"n", "v"} }, + }, + opts = { + controls = { + icons = { + disconnect = "[d]", + pause = "[p]", + play = "[c]", + run_last = "[l]", + step_back = "[u]", + step_into = "[i]", + step_out = "[O]", + step_over = "[o]", + terminate = "[t]", + } + } + }, + config = function(_, opts) + local dap = require("dap") + local dapui = require("dapui") + dapui.setup(opts) + dap.listeners.after.event_initialized["dapui_config"] = function() + dapui.open({}) + end + dap.listeners.before.event_terminated["dapui_config"] = function() + dapui.close({}) + end + dap.listeners.before.event_exited["dapui_config"] = function() + dapui.close({}) + end + end, + }, + { "theHamsta/nvim-dap-virtual-text", config = true }, + { "leoluz/nvim-dap-go", config = true }, + { "suketa/nvim-dap-ruby", config = true }, + }, + + -- stylua: ignore + keys = { + { "<leader>dB", function() require("dap").set_breakpoint(vim.fn.input('Breakpoint condition: ')) end, desc = "Breakpoint Condition" }, + { "<leader>db", function() require("dap").toggle_breakpoint() end, desc = "Toggle Breakpoint" }, + { "<leader>dc", function() require("dap").continue() end, desc = "Continue" }, + { "<leader>da", function() require("dap").continue({ before = vim.fn.input("Args: ") }) end, desc = "Run with Args" }, + { "<leader>dC", function() require("dap").run_to_cursor() end, desc = "Run to Cursor" }, + { "<leader>dg", function() require("dap").goto_() end, desc = "Go to Line (No Execute)" }, + { "<leader>di", function() require("dap").step_into() end, desc = "Step Into" }, + { "<leader>dj", function() require("dap").down() end, desc = "Down" }, + { "<leader>dk", function() require("dap").up() end, desc = "Up" }, + { "<leader>dl", function() require("dap").run_last() end, desc = "Run Last" }, + { "<leader>dO", function() require("dap").step_out() end, desc = "Step Out" }, -- switched o/O from lazyvim + { "<leader>do", function() require("dap").step_over() end, desc = "Step Over" }, + { "<leader>dp", function() require("dap").pause() end, desc = "Pause" }, + { "<leader>dr", function() require("dap").repl.toggle() end, desc = "Toggle REPL" }, + { "<leader>ds", function() require("dap").session() end, desc = "Session" }, + { "<leader>dt", function() require("dap").terminate() end, desc = "Terminate" }, + { "<leader>dw", function() require("dap.ui.widgets").hover() end, desc = "Widgets" }, + }, + }, +}
--- a/.config/nvim/lua/plugins/filetype.lua +++ b/.config/nvim/lua/plugins/filetype.lua @@ -27,6 +27,7 @@ return { "comment", "eex", "elixir", + "go", "heex", "lua", "surface", @@ -46,7 +47,7 @@ return { -- elixir-ls { "elixir-tools/elixir-tools.nvim", - event = { "BufReadPre", "BufNewFile" }, + ft = { "elixir", "eelixir", "heex" }, config = function() local elixir = require("elixir") local elixirls = require("elixir.elixirls")