WhoIsSethDaniel / mason-tool-installer.nvim

Install and upgrade third party tools automatically
MIT License
444 stars 16 forks source link

Won't install dap, linters, and formatters #6

Closed SingularisArt closed 2 years ago

SingularisArt commented 2 years ago

Here's my minimal init.lua:

if #vim.api.nvim_list_uis() == 0 then
  return
end

require("plugins")
require("lsp")
...

My minimal plugins.lua

local packer = require("packer")

-- Have packer use a popup window
packer.init({
  display = {
    open_fn = function()
      return require("packer.util").float({ border = "rounded" })
    end,
  },
})

return packer.startup(function(use)
  use({ "wbthomason/packer.nvim" })

  -- LSP
  use({ "neovim/nvim-lspconfig" })
  use({ "williamboman/nvim-lsp-installer" })
  use({ "jose-elias-alvarez/null-ls.nvim" })
  use({ "onsails/lspkind-nvim" })
  use({ "tamago324/nlsp-settings.nvim" })
  use({ "williamboman/mason.nvim" })
  use({ "williamboman/mason-lspconfig.nvim" })
end)

My minimal lsp.lua:

local mason = require_clean("mason")
local mason_lspconfig = require_clean("mason-lspconfig")

mason.setup({
  setup = {
    ui = {
      border = "rounded",
      icons = {
        package_installed = "✓",
        package_pending = "➜",
        package_uninstalled = "✗",
      },
    },
    log_level = vim.log.levels.INFO,
    max_concurrent_installers = 5,
  },
})

local servers = {
  "sumneko_lua",
  "vimls",
  "texlab",
  "pylsp",
  "bashls",
  "clangd",
  "cmake",
  "html",
  "emmet_ls",
  "cssls",
  "tailwindcss",
  "jsonls",
  "rust_analyzer",
  "solang",
  "solc",
  "marksman",
  "golangci_lint_ls",
  "tsserver",
  "jdtls",
  "yamlls",
}
local ensure_installed = {
  "sumneko_lua",
  "vimls",
  "texlab",
  "pylsp",
  "bashls",
  "clangd",
  "cmake",
  "html",
  "emmet_ls",
  "cssls",
  "tailwindcss",
  "jsonls",
  "rust_analyzer",
  "solang",
  "solc",
  "marksman",
  "golangci_lint_ls",
  "tsserver",
  "jdtls",
  "yamlls",
  "black",
  "clang_format",
  "latexindent",
  "prettier",
  "rustfmt",
  "sql_formatter",
  "standardrb",
  "stylua",
  "google_java_format",
  "shellharden",
  "flake8",
  "cppcheck",
  "write_good",
}

mason_lspconfig.setup({
  ensure_installed = ensure_installed,
  automatic_installation = true,
})

local lspconfig = require_clean("lspconfig")

for server, _ in pairs(servers) do
  lspconfig[server].setup()
end

But mason installs only the servers, not the linters and formatters. I even tried this with the dap servers, but it doesn't work either. Am I missing something, or is this a bug in the plugin because I've got no idea?

WhoIsSethDaniel commented 2 years ago

You aren't using mason-tool-installer anywhere. Was this bug report intended for this repo?

If I assume this was intended for this repo there are a number of problems:

  1. You aren't using mason-tool-installer
  2. You are using mason-lspconfig's ensure_installed -- which will only install LSP servers (and will skip over non-LSP servers in your list)
  3. You are using the lspconfig name for each of your LSP servers and not the mason name for each server. e.g. lspconfig name: sumneko_lua, mason name: lua-language-server.

For the second point above you can use ensure_installed with mason-lspconfig* if you want, but it's better (at least IMO) to just usemason-tool-installer` to install everything (see below).

So, let's say you want to use mason-tool-installer you would change some of your config to:

[...]
require'mason-lspconfig'.setup()
require'mason-tool-installer'.setup({
  ensure_installed = {
   "lua-language-server",
  "vim-language-server",
  "texlab",
  "python-lsp-server",
  "bash-language-server",
  "clangd",
  "cmake",
  "html",
  "emmet-ls",
  "css-lsp",
  "tailwindcss-language-server",
  "json-lsp",
  "rust-analyzer",
  "solang",
  "solidity",
  "marksman",
  "golangci-lint-langserver",
  "typescript-language-server",
  "jdtls",
  "yam-language-server",
  "black",
  "clang_format",
  "latexindent",
  "prettier",
  "rustfmt",
  "sql_formatter",
  "standardrb",
  "stylua",
  "google_java_format",
  "shellharden",
  "flake8",
  "cppcheck",
  "write_good",
  }
})
[...]

I likely missed a few language servers that have different names. There is a mapping here: https://github.com/williamboman/mason-lspconfig.nvim/blob/main/doc/server-mapping.md that will show the mapping from lspconfig to mason names.

SingularisArt commented 2 years ago

Thank you. I had mason-tool-installer installed, but I configured mason-lsp-config instead. LOL. Anyway, thanks for the solution!

rohit-kumar-j commented 1 year ago

@SingularisArt, as stated by WhoIsSethDaniel mason-tool-installer works well, If you are looking for an elegant solution, you can check out this example>

Init.lua ```lua ------------------------------------------------- -- Global LSP Servers vim.api.nvim_set_var("lsp_servers", { { name = 'lua_ls', settings = { Lua = { diagnostics = { globals = { "vim" } }, }, }, }, { name = 'cmake', settings = { CMake = { filetypes = { "cmake", "CMakeLists.txt" } }, }, }, { name = 'clangd', settings = { clangd = { -- excludeArgs = { "-stdlib=libc++" } }, }, }, { name = 'pyright', }, } ) -- Global LSP Linters vim.api.nvim_set_var("lsp_linters", { "luacheck", -- lua "flake8", -- python "cpplint", -- C++ } ) -- Global LSP DAP vim.api.nvim_set_var("lsp_dap", { "debugpy", -- python "codelldb", -- C++ "cpptools", -- C++ } ) -- Global LSP Formatters vim.api.nvim_set_var("lsp_formatters", { "luaformatter", -- lua "black", -- python "clang-format", -- C++, C } ) ```
core/lspconfig.lua ```lua local lsp_servers = vim.api.nvim_get_var('lsp_servers') -- Convert lsp_servers to a table of strings local server_names = {} for _, server in ipairs(lsp_servers) do table.insert(server_names, server.name) end -- Set up mason-lspconfig require('mason').setup() require('mason-lspconfig').setup({ ensure_installed = server_names, }) -- LINTERS | FORMATTERS | DAP local lsp_linters = vim.api.nvim_get_var('lsp_linters') local lsp_dap = vim.api.nvim_get_var('lsp_dap') local lsp_formatters = vim.api.nvim_get_var('lsp_formatters') local all_lsp_tools = {} for _, lsp_tool in ipairs(lsp_linters) do table.insert(all_lsp_tools, lsp_tool) end for _, lsp_tool in ipairs(lsp_dap) do table.insert(all_lsp_tools, lsp_tool) end for _, lsp_tool in ipairs(lsp_formatters) do table.insert(all_lsp_tools, lsp_tool) end require('mason-tool-installer').setup ( { ensure_installed = all_lsp_tools } ) -- LINTERS | FORMATTERS | DAP -- LSP SETUP local on_attach = function(client,bufnr) -- Using default Keymaps end for _ , lsp in ipairs(lsp_servers) do require('lspconfig')[lsp.name].setup { settings = lsp_servers[lsp.settings], on_attach = on_attach, } end ```

Full config here: rohit-kumar-j/nvim

It provides full control of lsp, formatting, linting, and dap with mason and others fully from within the main init.lua file. Works out of the box with lazy.nvim and keybindings in Which-key.

Currently I am actively maintaining it