set up nvim-dap etc

Wed, 15 May 2024 22:44:16 -0500

author
Meredith Howard <mhoward@roomag.org>
date
Wed, 15 May 2024 22:44:16 -0500
changeset 1165
840f0fde07e2
parent 1164
a8b6384c8738
child 1166
34bf03fa07e4

set up nvim-dap etc

.config/nvim/after/ftplugin/elixir.lua file | annotate | diff | comparison | revisions
.config/nvim/lua/config/autocmds.lua file | annotate | diff | comparison | revisions
.config/nvim/lua/plugins/dap.lua file | annotate | diff | comparison | revisions
.config/nvim/lua/plugins/filetype.lua file | annotate | diff | comparison | revisions
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")

mercurial