diff --git a/nvim/.config/nvim/lua/romanzy/custom/dart.lua b/nvim/.config/nvim/lua/romanzy/custom/dart.lua new file mode 100644 index 0000000..202a3ca --- /dev/null +++ b/nvim/.config/nvim/lua/romanzy/custom/dart.lua @@ -0,0 +1,18 @@ +local M = {} + +-- This function returns project local dart, or fallsback to global +function M.executable(path) + local directory = vim.fn.isdirectory(path) == 1 and path or vim.fs.dirname(path) + local root = vim.fs.root(directory, { "pubspec.yaml" }) + + if root then + local fvm_dart = root .. "/.fvm/flutter_sdk/bin/dart" + if vim.fn.executable(fvm_dart) == 1 then + return fvm_dart + end + end + + return "dart" +end + +return M diff --git a/nvim/.config/nvim/lua/romanzy/plugins/conform.lua b/nvim/.config/nvim/lua/romanzy/plugins/conform.lua index 4b4fbc9..58a90bf 100644 --- a/nvim/.config/nvim/lua/romanzy/plugins/conform.lua +++ b/nvim/.config/nvim/lua/romanzy/plugins/conform.lua @@ -5,8 +5,11 @@ vim.pack.add({ }, }) +local dart = require("romanzy.custom.dart") + require("conform").setup({ formatters_by_ft = { + dart = { "dart_format" }, javascript = { "prettier" }, javascriptreact = { "prettier" }, typescript = { "prettier" }, @@ -16,6 +19,13 @@ require("conform").setup({ cpp = { filter = function() return false end }, h = { filter = function() return false end } }, + formatters = { + dart_format = { + command = function(_, ctx) + return dart.executable(ctx.filename) + end, + }, + }, format_on_save = { lsp_format = "fallback", timeout_ms = 2000, diff --git a/nvim/.config/nvim/lua/romanzy/plugins/lsp.lua b/nvim/.config/nvim/lua/romanzy/plugins/lsp.lua index 7422dd6..3711e4f 100644 --- a/nvim/.config/nvim/lua/romanzy/plugins/lsp.lua +++ b/nvim/.config/nvim/lua/romanzy/plugins/lsp.lua @@ -44,6 +44,7 @@ end configure_diagnostics() local capabilities = require("mini.completion").get_lsp_capabilities() +local dart = require("romanzy.custom.dart") local managed_servers = { "bashls", "clangd", @@ -87,6 +88,18 @@ local servers = { tailwindcss = {}, eslint = {}, tinymist = {}, + dartls = { + cmd = function(dispatchers, config) + return vim.lsp.rpc.start({ + dart.executable(config.root_dir), + "language-server", + "--protocol=lsp", + }, dispatchers, { + cwd = config.root_dir, + detached = config.detached, + }) + end, + }, } for server_name, config in pairs(servers) do @@ -101,6 +114,8 @@ mason_lspconfig.setup({ automatic_enable = managed_servers, }) +vim.lsp.enable("dartls") + local mason_registry = require("mason-registry") mason_registry.refresh(vim.schedule_wrap(function() for _, tool_name in ipairs(managed_tools) do