Explorar el Código

Merge remote-tracking branch 'origin/rolling'

kylo252 hace 2 años
padre
commit
439e0c205a

+ 4 - 4
README.md

@@ -39,7 +39,7 @@ bash <(curl -s https://raw.githubusercontent.com/lunarvim/lunarvim/master/utils/
 
 
 To run the install script without any interaction you can pass the `-y` flag to automatically install all dependencies and have no prompts. This is particularly useful in automated installations.
 To run the install script without any interaction you can pass the `-y` flag to automatically install all dependencies and have no prompts. This is particularly useful in automated installations.
 
 
-The same way, you can use `--no-install-dependencies` to skip the dependency installation.
+In the same way, you can use `--no-install-dependencies` to skip the dependency installation.
 
 
 ### Windows (Powershell 7+):
 ### Windows (Powershell 7+):
 
 
@@ -51,7 +51,7 @@ Invoke-WebRequest https://raw.githubusercontent.com/LunarVim/LunarVim/master/uti
 
 
 ## Automatic LSP support
 ## Automatic LSP support
 
 
-By default, most supported language servers will get automatically installed once you open the supported file-type, e.g, opening a Python file for the first time will install `Pyright` and configure it automatically for you.
+By default, most supported language servers will get automatically installed once you open the supported file type, e.g, opening a Python file for the first time will install `Pyright` and configure it automatically for you.
 
 
 ## Configuration file
 ## Configuration file
 
 
@@ -99,7 +99,7 @@ formatters.setup {
   { command = "black" },
   { command = "black" },
   {
   {
     command = "prettier",
     command = "prettier",
-    ---@usage specify which filetypes to enable. By default a providers will attach to all the filetypes it supports.
+    ---@usage specify which filetypes to enable. By default, providers will attach to all the filetypes it supports.
     filetypes = { "typescript", "typescriptreact" },
     filetypes = { "typescript", "typescriptreact" },
   },
   },
 }
 }
@@ -109,7 +109,7 @@ local linters = require "lvim.lsp.null-ls.linters"
 linters.setup {
 linters.setup {
   {
   {
     command = "eslint_d",
     command = "eslint_d",
-    ---@usage specify which filetypes to enable. By default a providers will attach to all the filetypes it supports.
+    ---@usage specify which filetypes to enable. By default, providers will attach to all the filetypes it supports.
     filetypes = { "javascript", "javascriptreact" },
     filetypes = { "javascript", "javascriptreact" },
   },
   },
 }
 }

+ 7 - 0
lua/lvim/config/init.lua

@@ -99,6 +99,13 @@ local function handle_deprecated_settings()
       "Use vim.api.nvim_create_autocmd instead or check LunarVim#2592 to learn about the new syntax"
       "Use vim.api.nvim_create_autocmd instead or check LunarVim#2592 to learn about the new syntax"
     )
     )
   end
   end
+
+  if lvim.lsp.automatic_servers_installation then
+    deprecation_notice(
+      "lvim.lsp.automatic_servers_installation",
+      "Use `lvim.lsp.installer.setup.automatic_installation` instead"
+    )
+  end
 end
 end
 
 
 --- Override the configuration with a user provided one
 --- Override the configuration with a user provided one

+ 4 - 0
lua/lvim/core/autopairs.lua

@@ -79,6 +79,10 @@ M.setup = function()
   if lvim.builtin.autopairs.on_config_done then
   if lvim.builtin.autopairs.on_config_done then
     lvim.builtin.autopairs.on_config_done(autopairs)
     lvim.builtin.autopairs.on_config_done(autopairs)
   end
   end
+  pcall(function()
+    local cmp_autopairs = require "nvim-autopairs.completion.cmp"
+    require("cmp").event:on("confirm_done", cmp_autopairs.on_confirm_done())
+  end)
 end
 end
 
 
 return M
 return M

+ 2 - 2
lua/lvim/core/bufferline.lua

@@ -45,10 +45,10 @@ M.config = function()
     },
     },
     highlights = {
     highlights = {
       background = {
       background = {
-        gui = "italic",
+        italic = true,
       },
       },
       buffer_selected = {
       buffer_selected = {
-        gui = "bold",
+        bold = true,
       },
       },
     },
     },
     options = {
     options = {

+ 1 - 0
lua/lvim/core/builtins/init.lua

@@ -16,6 +16,7 @@ local builtins = {
   "lvim.core.notify",
   "lvim.core.notify",
   "lvim.core.lualine",
   "lvim.core.lualine",
   "lvim.core.alpha",
   "lvim.core.alpha",
+  "lvim.core.mason",
 }
 }
 
 
 function M.config(config)
 function M.config(config)

+ 49 - 52
lua/lvim/core/cmp.lua

@@ -1,24 +1,23 @@
 local M = {}
 local M = {}
 M.methods = {}
 M.methods = {}
 
 
----checks if the character preceding the cursor is a space character
----@return boolean true if it is a space character, false otherwise
-local check_backspace = function()
-  local col = vim.fn.col "." - 1
-  return col == 0 or vim.fn.getline("."):sub(col, col):match "%s"
+local has_words_before = function()
+  local line, col = unpack(vim.api.nvim_win_get_cursor(0))
+  return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match "%s" == nil
 end
 end
-M.methods.check_backspace = check_backspace
+M.methods.has_words_before = has_words_before
 
 
-local function T(str)
+---@deprecated use M.methods.has_words_before instead
+M.methods.check_backspace = function()
+  return not has_words_before()
+end
+
+local T = function(str)
   return vim.api.nvim_replace_termcodes(str, true, true, true)
   return vim.api.nvim_replace_termcodes(str, true, true, true)
 end
 end
 
 
----wraps vim.fn.feedkeys while replacing key codes with escape codes
----Ex: feedkeys("<CR>", "n") becomes feedkeys("^M", "n")
----@param key string
----@param mode string
 local function feedkeys(key, mode)
 local function feedkeys(key, mode)
-  vim.fn.feedkeys(T(key), mode)
+  vim.api.nvim_feedkeys(T(key), mode, true)
 end
 end
 M.methods.feedkeys = feedkeys
 M.methods.feedkeys = feedkeys
 
 
@@ -28,39 +27,21 @@ M.methods.feedkeys = feedkeys
 local function jumpable(dir)
 local function jumpable(dir)
   local luasnip_ok, luasnip = pcall(require, "luasnip")
   local luasnip_ok, luasnip = pcall(require, "luasnip")
   if not luasnip_ok then
   if not luasnip_ok then
-    return
+    return false
   end
   end
 
 
   local win_get_cursor = vim.api.nvim_win_get_cursor
   local win_get_cursor = vim.api.nvim_win_get_cursor
   local get_current_buf = vim.api.nvim_get_current_buf
   local get_current_buf = vim.api.nvim_get_current_buf
 
 
-  local function inside_snippet()
-    -- for outdated versions of luasnip
-    if not luasnip.session.current_nodes then
-      return false
-    end
-
-    local node = luasnip.session.current_nodes[get_current_buf()]
-    if not node then
-      return false
-    end
-
-    local snip_begin_pos, snip_end_pos = node.parent.snippet.mark:pos_begin_end()
-    local pos = win_get_cursor(0)
-    pos[1] = pos[1] - 1 -- LuaSnip is 0-based not 1-based like nvim for rows
-    return pos[1] >= snip_begin_pos[1] and pos[1] <= snip_end_pos[1]
-  end
-
   ---sets the current buffer's luasnip to the one nearest the cursor
   ---sets the current buffer's luasnip to the one nearest the cursor
   ---@return boolean true if a node is found, false otherwise
   ---@return boolean true if a node is found, false otherwise
   local function seek_luasnip_cursor_node()
   local function seek_luasnip_cursor_node()
+    -- TODO(kylo252): upstream this
     -- for outdated versions of luasnip
     -- for outdated versions of luasnip
     if not luasnip.session.current_nodes then
     if not luasnip.session.current_nodes then
       return false
       return false
     end
     end
 
 
-    local pos = win_get_cursor(0)
-    pos[1] = pos[1] - 1
     local node = luasnip.session.current_nodes[get_current_buf()]
     local node = luasnip.session.current_nodes[get_current_buf()]
     if not node then
     if not node then
       return false
       return false
@@ -69,6 +50,9 @@ local function jumpable(dir)
     local snippet = node.parent.snippet
     local snippet = node.parent.snippet
     local exit_node = snippet.insert_nodes[0]
     local exit_node = snippet.insert_nodes[0]
 
 
+    local pos = win_get_cursor(0)
+    pos[1] = pos[1] - 1
+
     -- exit early if we're past the exit node
     -- exit early if we're past the exit node
     if exit_node then
     if exit_node then
       local exit_pos_end = exit_node.mark:pos_end()
       local exit_pos_end = exit_node.mark:pos_end()
@@ -124,9 +108,9 @@ local function jumpable(dir)
   end
   end
 
 
   if dir == -1 then
   if dir == -1 then
-    return inside_snippet() and luasnip.jumpable(-1)
+    return luasnip.in_snippet() and luasnip.jumpable(-1)
   else
   else
-    return inside_snippet() and seek_luasnip_cursor_node() and luasnip.jumpable()
+    return luasnip.in_snippet() and seek_luasnip_cursor_node() and luasnip.jumpable(1)
   end
   end
 end
 end
 M.methods.jumpable = jumpable
 M.methods.jumpable = jumpable
@@ -241,48 +225,61 @@ M.config = function()
     mapping = cmp.mapping.preset.insert {
     mapping = cmp.mapping.preset.insert {
       ["<C-k>"] = cmp.mapping.select_prev_item(),
       ["<C-k>"] = cmp.mapping.select_prev_item(),
       ["<C-j>"] = cmp.mapping.select_next_item(),
       ["<C-j>"] = cmp.mapping.select_next_item(),
+      ["<Down>"] = cmp.mapping(cmp.mapping.select_next_item { behavior = cmp.SelectBehavior.Select }, { "i" }),
+      ["<Up>"] = cmp.mapping(cmp.mapping.select_prev_item { behavior = cmp.SelectBehavior.Select }, { "i" }),
       ["<C-d>"] = cmp.mapping.scroll_docs(-4),
       ["<C-d>"] = cmp.mapping.scroll_docs(-4),
       ["<C-f>"] = cmp.mapping.scroll_docs(4),
       ["<C-f>"] = cmp.mapping.scroll_docs(4),
+      ["<C-y>"] = cmp.mapping {
+        i = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = false },
+        c = function(fallback)
+          if cmp.visible() then
+            cmp.confirm { behavior = cmp.ConfirmBehavior.Replace, select = false }
+          else
+            fallback()
+          end
+        end,
+      },
       ["<Tab>"] = cmp.mapping(function(fallback)
       ["<Tab>"] = cmp.mapping(function(fallback)
         if cmp.visible() then
         if cmp.visible() then
           cmp.select_next_item()
           cmp.select_next_item()
-        elseif luasnip.expandable() then
-          luasnip.expand()
-        elseif jumpable() then
+        elseif luasnip.expand_or_locally_jumpable() then
+          luasnip.expand_or_jump()
+        elseif jumpable(1) then
           luasnip.jump(1)
           luasnip.jump(1)
-        elseif check_backspace() then
-          fallback()
+        elseif has_words_before() then
+          cmp.complete()
         else
         else
           fallback()
           fallback()
         end
         end
-      end, {
-        "i",
-        "s",
-      }),
+      end, { "i", "s" }),
       ["<S-Tab>"] = cmp.mapping(function(fallback)
       ["<S-Tab>"] = cmp.mapping(function(fallback)
         if cmp.visible() then
         if cmp.visible() then
           cmp.select_prev_item()
           cmp.select_prev_item()
-        elseif jumpable(-1) then
+        elseif luasnip.jumpable(-1) then
           luasnip.jump(-1)
           luasnip.jump(-1)
         else
         else
           fallback()
           fallback()
         end
         end
-      end, {
-        "i",
-        "s",
-      }),
-
+      end, { "i", "s" }),
       ["<C-Space>"] = cmp.mapping.complete(),
       ["<C-Space>"] = cmp.mapping.complete(),
       ["<C-e>"] = cmp.mapping.abort(),
       ["<C-e>"] = cmp.mapping.abort(),
       ["<CR>"] = cmp.mapping(function(fallback)
       ["<CR>"] = cmp.mapping(function(fallback)
-        if cmp.visible() and cmp.confirm(lvim.builtin.cmp.confirm_opts) then
-          if jumpable() then
+        if cmp.visible() then
+          local confirm_opts = lvim.builtin.cmp.confirm_opts
+          local is_insert_mode = function()
+            return vim.api.nvim_get_mode().mode:sub(1, 1) == "i"
+          end
+          if is_insert_mode() then -- prevent overwriting brackets
+            confirm_opts.behavior = cmp.ConfirmBehavior.Insert
+          end
+          cmp.confirm(confirm_opts)
+          if jumpable(1) then
             luasnip.jump(1)
             luasnip.jump(1)
           end
           end
           return
           return
         end
         end
 
 
-        if jumpable() then
+        if jumpable(1) then
           if not luasnip.jump(1) then
           if not luasnip.jump(1) then
             fallback()
             fallback()
           end
           end

+ 18 - 2
lua/lvim/core/comment.lua

@@ -3,8 +3,24 @@ local M = {}
 function M.config()
 function M.config()
   local pre_hook = nil
   local pre_hook = nil
   if lvim.builtin.treesitter.context_commentstring.enable then
   if lvim.builtin.treesitter.context_commentstring.enable then
-    pre_hook = function(_ctx)
-      return require("ts_context_commentstring.internal").calculate_commentstring()
+    pre_hook = function(ctx)
+      local U = require "Comment.utils"
+
+      -- Determine whether to use linewise or blockwise commentstring
+      local type = ctx.ctype == U.ctype.linewise and "__default" or "__multiline"
+
+      -- Determine the location where to calculate commentstring from
+      local location = nil
+      if ctx.ctype == U.ctype.blockwise then
+        location = require("ts_context_commentstring.utils").get_cursor_location()
+      elseif ctx.cmotion == U.cmotion.v or ctx.cmotion == U.cmotion.V then
+        location = require("ts_context_commentstring.utils").get_visual_start_location()
+      end
+
+      return require("ts_context_commentstring.internal").calculate_commentstring {
+        key = type,
+        location = location,
+      }
     end
     end
   end
   end
   lvim.builtin.comment = {
   lvim.builtin.comment = {

+ 2 - 2
lua/lvim/core/info.lua

@@ -111,9 +111,9 @@ local function make_auto_lsp_info(ft)
     return info_lines
     return info_lines
   end
   end
 
 
-  local available = lsp_utils.get_supported_servers_per_filetype(ft)
+  local supported = lsp_utils.get_supported_servers(ft)
   local skipped = vim.tbl_filter(function(name)
   local skipped = vim.tbl_filter(function(name)
-    return vim.tbl_contains(available, name)
+    return vim.tbl_contains(supported, name)
   end, skipped_servers)
   end, skipped_servers)
 
 
   if #skipped == 0 then
   if #skipped == 0 then

+ 6 - 6
lua/lvim/core/lualine/components.lua

@@ -70,13 +70,13 @@ return {
   },
   },
   treesitter = {
   treesitter = {
     function()
     function()
-      local b = vim.api.nvim_get_current_buf()
-      if next(vim.treesitter.highlighter.active[b]) then
-        return ""
-      end
-      return ""
+      return ""
+    end,
+    color = function()
+      local buf = vim.api.nvim_get_current_buf()
+      local ts = vim.treesitter.highlighter.active[buf]
+      return { fg = ts and not vim.tbl_isempty(ts) and colors.green or colors.red }
     end,
     end,
-    color = { fg = colors.green },
     cond = conditions.hide_in_width,
     cond = conditions.hide_in_width,
   },
   },
   lsp = {
   lsp = {

+ 41 - 0
lua/lvim/core/mason.lua

@@ -0,0 +1,41 @@
+local M = {}
+
+function M.config()
+  lvim.builtin.mason = {
+    ui = {
+      keymaps = {
+        toggle_package_expand = "<CR>",
+        install_package = "i",
+        update_package = "u",
+        check_package_version = "c",
+        update_all_packages = "U",
+        check_outdated_packages = "C",
+        uninstall_package = "X",
+        cancel_installation = "<C-c>",
+        apply_language_filter = "<C-f>",
+      },
+    },
+    log_level = vim.log.levels.INFO,
+    max_concurrent_installers = 4,
+
+    github = {
+      -- The template URL to use when downloading assets from GitHub.
+      -- The placeholders are the following (in order):
+      -- 1. The repository (e.g. "rust-lang/rust-analyzer")
+      -- 2. The release version (e.g. "v0.3.0")
+      -- 3. The asset name (e.g. "rust-analyzer-v0.3.0-x86_64-unknown-linux-gnu.tar.gz")
+      download_url_template = "https://github.com/%s/releases/download/%s/%s",
+    },
+  }
+end
+
+function M.setup()
+  local status_ok, mason = pcall(require, "mason")
+  if not status_ok then
+    return
+  end
+
+  mason.setup(lvim.builtin.mason)
+end
+
+return M

+ 5 - 5
lua/lvim/core/which-key.lua

@@ -1,5 +1,4 @@
 local M = {}
 local M = {}
-
 M.config = function()
 M.config = function()
   lvim.builtin.which_key = {
   lvim.builtin.which_key = {
     ---@usage disable which-key completely [not recommended]
     ---@usage disable which-key completely [not recommended]
@@ -77,13 +76,13 @@ M.config = function()
     -- NOTE: Prefer using : over <cmd> as the latter avoids going back in normal-mode.
     -- NOTE: Prefer using : over <cmd> as the latter avoids going back in normal-mode.
     -- see https://neovim.io/doc/user/map.html#:map-cmd
     -- see https://neovim.io/doc/user/map.html#:map-cmd
     vmappings = {
     vmappings = {
-      ["/"] = { "<ESC><CMD>lua require('Comment.api').toggle_linewise_op(vim.fn.visualmode())<CR>", "Comment" },
+      ["/"] = { "<Plug>(comment_toggle_linewise_visual)", "Comment toggle linewise (visual)" },
     },
     },
     mappings = {
     mappings = {
       [";"] = { "<cmd>Alpha<CR>", "Dashboard" },
       [";"] = { "<cmd>Alpha<CR>", "Dashboard" },
       ["w"] = { "<cmd>w!<CR>", "Save" },
       ["w"] = { "<cmd>w!<CR>", "Save" },
       ["q"] = { "<cmd>lua require('lvim.utils.functions').smart_quit()<CR>", "Quit" },
       ["q"] = { "<cmd>lua require('lvim.utils.functions').smart_quit()<CR>", "Quit" },
-      ["/"] = { "<cmd>lua require('Comment.api').toggle_current_linewise()<CR>", "Comment" },
+      ["/"] = { "<Plug>(comment_toggle_linewise_current)", "Comment toggle current line" },
       ["c"] = { "<cmd>BufferKill<CR>", "Close Buffer" },
       ["c"] = { "<cmd>BufferKill<CR>", "Close Buffer" },
       ["f"] = { require("lvim.core.telescope.custom-finders").find_project_files, "Find File" },
       ["f"] = { require("lvim.core.telescope.custom-finders").find_project_files, "Find File" },
       ["h"] = { "<cmd>nohlsearch<CR>", "No Highlight" },
       ["h"] = { "<cmd>nohlsearch<CR>", "No Highlight" },
@@ -92,6 +91,7 @@ M.config = function()
         j = { "<cmd>BufferLinePick<cr>", "Jump" },
         j = { "<cmd>BufferLinePick<cr>", "Jump" },
         f = { "<cmd>Telescope buffers<cr>", "Find" },
         f = { "<cmd>Telescope buffers<cr>", "Find" },
         b = { "<cmd>BufferLineCyclePrev<cr>", "Previous" },
         b = { "<cmd>BufferLineCyclePrev<cr>", "Previous" },
+        n = { "<cmd>BufferLineCycleNext<cr>", "Next" },
         -- w = { "<cmd>BufferWipeout<cr>", "Wipeout" }, -- TODO: implement this for bufferline
         -- w = { "<cmd>BufferWipeout<cr>", "Wipeout" }, -- TODO: implement this for bufferline
         e = {
         e = {
           "<cmd>BufferLinePickClose<cr>",
           "<cmd>BufferLinePickClose<cr>",
@@ -160,7 +160,7 @@ M.config = function()
         w = { "<cmd>Telescope diagnostics<cr>", "Diagnostics" },
         w = { "<cmd>Telescope diagnostics<cr>", "Diagnostics" },
         f = { require("lvim.lsp.utils").format, "Format" },
         f = { require("lvim.lsp.utils").format, "Format" },
         i = { "<cmd>LspInfo<cr>", "Info" },
         i = { "<cmd>LspInfo<cr>", "Info" },
-        I = { "<cmd>LspInstallInfo<cr>", "Installer Info" },
+        I = { "<cmd>Mason<cr>", "Mason Info" },
         j = {
         j = {
           vim.diagnostic.goto_next,
           vim.diagnostic.goto_next,
           "Next Diagnostic",
           "Next Diagnostic",
@@ -252,7 +252,7 @@ M.config = function()
         k = { "<cmd>Telescope keymaps<cr>", "Keymaps" },
         k = { "<cmd>Telescope keymaps<cr>", "Keymaps" },
         C = { "<cmd>Telescope commands<cr>", "Commands" },
         C = { "<cmd>Telescope commands<cr>", "Commands" },
         p = {
         p = {
-          "<cmd>lua require('telescope.builtin.internal').colorscheme({enable_preview = true})<cr>",
+          "<cmd>lua require('telescope.builtin').colorscheme({enable_preview = true})<cr>",
           "Colorscheme with Preview",
           "Colorscheme with Preview",
         },
         },
       },
       },

+ 0 - 4
lua/lvim/keymappings.lua

@@ -61,10 +61,6 @@ local defaults = {
     ["<C-Left>"] = ":vertical resize -2<CR>",
     ["<C-Left>"] = ":vertical resize -2<CR>",
     ["<C-Right>"] = ":vertical resize +2<CR>",
     ["<C-Right>"] = ":vertical resize +2<CR>",
 
 
-    -- Tab switch buffer
-    ["<S-l>"] = ":BufferLineCycleNext<CR>",
-    ["<S-h>"] = ":BufferLineCyclePrev<CR>",
-
     -- Move current line / block with Alt-j/k a la vscode.
     -- Move current line / block with Alt-j/k a la vscode.
     ["<A-j>"] = ":m .+1<CR>==",
     ["<A-j>"] = ":m .+1<CR>==",
     ["<A-k>"] = ":m .-2<CR>==",
     ["<A-k>"] = ":m .-2<CR>==",

+ 5 - 9
lua/lvim/lsp/config.lua

@@ -30,7 +30,6 @@ local skipped_servers = {
   "sqlls",
   "sqlls",
   "sqls",
   "sqls",
   "stylelint_lsp",
   "stylelint_lsp",
-  "tailwindcss",
   "tflint",
   "tflint",
   "svlangserver",
   "svlangserver",
   "verible",
   "verible",
@@ -88,7 +87,6 @@ return {
   },
   },
   on_attach_callback = nil,
   on_attach_callback = nil,
   on_init_callback = nil,
   on_init_callback = nil,
-  automatic_servers_installation = true,
   automatic_configuration = {
   automatic_configuration = {
     ---@usage list of servers that the automatic installer will skip
     ---@usage list of servers that the automatic installer will skip
     skipped_servers = skipped_servers,
     skipped_servers = skipped_servers,
@@ -131,12 +129,8 @@ return {
   installer = {
   installer = {
     setup = {
     setup = {
       ensure_installed = {},
       ensure_installed = {},
-      ui = {
-        icons = {
-          server_installed = "✓",
-          server_pending = "",
-          server_uninstalled = "✗",
-        },
+      automatic_installation = {
+        exclude = {},
       },
       },
     },
     },
   },
   },
@@ -153,6 +147,8 @@ return {
     setup = {},
     setup = {},
     config = {},
     config = {},
   },
   },
-  ---@deprecated use automatic_configuration.skipped_servers instead
+  ---@deprecated use lvim.lsp.automatic_configuration.skipped_servers instead
   override = {},
   override = {},
+  ---@deprecated use lvim.lsp.installer.setup.automatic_installation instead
+  automatic_servers_installation = nil,
 }
 }

+ 4 - 1
lua/lvim/lsp/init.lua

@@ -110,7 +110,10 @@ function M.setup()
   end)
   end)
 
 
   pcall(function()
   pcall(function()
-    require("nvim-lsp-installer").setup(lvim.lsp.installer.setup)
+    require("mason-lspconfig").setup(lvim.lsp.installer.setup)
+    local util = require "lspconfig.util"
+    -- automatic_installation is handled by lsp-manager
+    util.on_setup = nil
   end)
   end)
 
 
   require("lvim.lsp.null-ls").setup()
   require("lvim.lsp.null-ls").setup()

+ 50 - 17
lua/lvim/lsp/manager.lua

@@ -1,7 +1,30 @@
 local M = {}
 local M = {}
 
 
 local Log = require "lvim.core.log"
 local Log = require "lvim.core.log"
+local fmt = string.format
 local lvim_lsp_utils = require "lvim.lsp.utils"
 local lvim_lsp_utils = require "lvim.lsp.utils"
+local is_windows = vim.loop.os_uname().version:match "Windows"
+
+local function resolve_mason_config(server_name)
+  local found, mason_config = pcall(require, "mason-lspconfig.server_configurations." .. server_name)
+  if not found then
+    Log:debug(fmt("mason configuration not found for %s", server_name))
+    return {}
+  end
+  local server_mapping = require "mason-lspconfig.mappings.server"
+  local path = require "mason-core.path"
+  local pkg_name = server_mapping.lspconfig_to_package[server_name]
+  local install_dir = path.package_prefix(pkg_name)
+  local conf = mason_config(install_dir)
+  if is_windows and conf.cmd and conf.cmd[1] then
+    local exepath = vim.fn.exepath(conf.cmd[1])
+    if exepath ~= "" then
+      conf.cmd[1] = exepath
+    end
+  end
+  Log:debug(fmt("resolved mason configuration for %s, got %s", server_name, vim.inspect(conf)))
+  return conf or {}
+end
 
 
 ---Resolve the configuration for a server by merging with the default config
 ---Resolve the configuration for a server by merging with the default config
 ---@param server_name string
 ---@param server_name string
@@ -65,35 +88,45 @@ function M.setup(server_name, user_config)
     return
     return
   end
   end
 
 
-  local servers = require "nvim-lsp-installer.servers"
-  local server_available, server = servers.get_server(server_name)
+  local server_mapping = require "mason-lspconfig.mappings.server"
+  local registry = require "mason-registry"
 
 
-  if not server_available then
+  local pkg_name = server_mapping.lspconfig_to_package[server_name]
+  if not pkg_name then
     local config = resolve_config(server_name, user_config)
     local config = resolve_config(server_name, user_config)
     launch_server(server_name, config)
     launch_server(server_name, config)
     return
     return
   end
   end
 
 
-  local install_in_progress = false
+  local should_auto_install = function(name)
+    local installer_settings = lvim.lsp.installer.setup
+    return installer_settings.automatic_installation
+      and not vim.tbl_contains(installer_settings.automatic_installation.exclude, name)
+  end
 
 
-  if not server:is_installed() then
-    if lvim.lsp.automatic_servers_installation then
+  if not registry.is_installed(pkg_name) then
+    if should_auto_install(server_name) then
       Log:debug "Automatic server installation detected"
       Log:debug "Automatic server installation detected"
-      server:install()
-      install_in_progress = true
+      vim.notify_once(string.format("Installation in progress for [%s]", server_name), vim.log.levels.INFO)
+      local pkg = registry.get_package(pkg_name)
+      pkg:install():once("closed", function()
+        if pkg:is_installed() then
+          vim.schedule(function()
+            vim.notify_once(string.format("Installation complete for [%s]", server_name), vim.log.levels.INFO)
+            -- mason config is only available once the server has been installed
+            local config = resolve_config(server_name, resolve_mason_config(server_name), user_config)
+            launch_server(server_name, config)
+          end)
+        end
+      end)
+      return
     else
     else
-      Log:debug(server.name .. " is not managed by the automatic installer")
+      Log:debug(server_name .. " is not managed by the automatic installer")
     end
     end
   end
   end
 
 
-  server:on_ready(function()
-    if install_in_progress then
-      vim.notify(string.format("Installation complete for [%s] server", server.name), vim.log.levels.INFO)
-    end
-    install_in_progress = false
-    local config = resolve_config(server_name, server:get_default_options(), user_config)
-    launch_server(server_name, config)
-  end)
+  local config = resolve_config(server_name, resolve_mason_config(server_name), user_config)
+  launch_server(server_name, config)
 end
 end
 
 
 return M
 return M

+ 11 - 1
lua/lvim/lsp/null-ls/linters.lua

@@ -6,9 +6,19 @@ local null_ls = require "null-ls"
 local services = require "lvim.lsp.null-ls.services"
 local services = require "lvim.lsp.null-ls.services"
 local method = null_ls.methods.DIAGNOSTICS
 local method = null_ls.methods.DIAGNOSTICS
 
 
+local alternative_methods = {
+  null_ls.methods.DIAGNOSTICS,
+  null_ls.methods.DIAGNOSTICS_ON_OPEN,
+  null_ls.methods.DIAGNOSTICS_ON_SAVE,
+}
+
 function M.list_registered(filetype)
 function M.list_registered(filetype)
   local registered_providers = services.list_registered_providers_names(filetype)
   local registered_providers = services.list_registered_providers_names(filetype)
-  return registered_providers[method] or {}
+  local providers_for_methods = vim.tbl_flatten(vim.tbl_map(function(m)
+    return registered_providers[m] or {}
+  end, alternative_methods))
+
+  return providers_for_methods
 end
 end
 
 
 function M.list_supported(filetype)
 function M.list_supported(filetype)

+ 8 - 0
lua/lvim/lsp/providers/tailwindcss.lua

@@ -0,0 +1,8 @@
+local opts = {
+  root_dir = function(fname)
+    local util = require "lspconfig/util"
+    return util.root_pattern("tailwind.config.js", "tailwind.config.cjs", "tailwind.js", "tailwind.cjs")(fname)
+  end,
+}
+
+return opts

+ 1 - 10
lua/lvim/lsp/templates.lua

@@ -56,21 +56,12 @@ end
 ---The files are generated to a runtimepath: "$LUNARVIM_RUNTIME_DIR/site/after/ftplugin/template.lua"
 ---The files are generated to a runtimepath: "$LUNARVIM_RUNTIME_DIR/site/after/ftplugin/template.lua"
 ---@param servers_names? table list of servers to be enabled. Will add all by default
 ---@param servers_names? table list of servers to be enabled. Will add all by default
 function M.generate_templates(servers_names)
 function M.generate_templates(servers_names)
-  servers_names = servers_names or {}
+  servers_names = servers_names or lvim_lsp_utils.get_supported_servers()
 
 
   Log:debug "Templates installation in progress"
   Log:debug "Templates installation in progress"
 
 
   M.remove_template_files()
   M.remove_template_files()
 
 
-  if vim.tbl_isempty(servers_names) then
-    local available_servers = require("nvim-lsp-installer.servers").get_available_servers()
-
-    for _, server in pairs(available_servers) do
-      table.insert(servers_names, server.name)
-      table.sort(servers_names)
-    end
-  end
-
   -- create the directory if it didn't exist
   -- create the directory if it didn't exist
   if not utils.is_directory(lvim.lsp.templates_dir) then
   if not utils.is_directory(lvim.lsp.templates_dir) then
     vim.fn.mkdir(ftplugin_dir, "p")
     vim.fn.mkdir(ftplugin_dir, "p")

+ 13 - 16
lua/lvim/lsp/utils.lua

@@ -51,37 +51,34 @@ end
 
 
 ---Get supported filetypes per server
 ---Get supported filetypes per server
 ---@param server_name string can be any server supported by nvim-lsp-installer
 ---@param server_name string can be any server supported by nvim-lsp-installer
----@return table supported filestypes as a list of strings
+---@return string[] supported filestypes as a list of strings
 function M.get_supported_filetypes(server_name)
 function M.get_supported_filetypes(server_name)
-  local status_ok, lsp_installer_servers = pcall(require, "nvim-lsp-installer.servers")
+  local status_ok, config = pcall(require, ("lspconfig.server_configurations.%s"):format(server_name))
   if not status_ok then
   if not status_ok then
     return {}
     return {}
   end
   end
 
 
-  local server_available, requested_server = lsp_installer_servers.get_server(server_name)
-  if not server_available then
-    return {}
-  end
-
-  return requested_server:get_supported_filetypes()
+  return config.default_config.filetypes or {}
 end
 end
 
 
 ---Get supported servers per filetype
 ---Get supported servers per filetype
----@param filetype string
----@return table list of names of supported servers
-function M.get_supported_servers_per_filetype(filetype)
-  local filetype_server_map = require "nvim-lsp-installer._generated.filetype_map"
-  return filetype_server_map[filetype]
+---@param filter { filetype: string | string[] }?: (optional) Used to filter the list of server names.
+---@return string[] list of names of supported servers
+function M.get_supported_servers(filter)
+  local _, supported_servers = pcall(function()
+    return require("mason-lspconfig").get_available_servers(filter)
+  end)
+  return supported_servers or {}
 end
 end
 
 
 ---Get all supported filetypes by nvim-lsp-installer
 ---Get all supported filetypes by nvim-lsp-installer
----@return table supported filestypes as a list of strings
+---@return string[] supported filestypes as a list of strings
 function M.get_all_supported_filetypes()
 function M.get_all_supported_filetypes()
-  local status_ok, lsp_installer_filetypes = pcall(require, "nvim-lsp-installer._generated.filetype_map")
+  local status_ok, filetype_server_map = pcall(require, "mason-lspconfig.mappings.filetype")
   if not status_ok then
   if not status_ok then
     return {}
     return {}
   end
   end
-  return vim.tbl_keys(lsp_installer_filetypes or {})
+  return vim.tbl_keys(filetype_server_map or {})
 end
 end
 
 
 function M.setup_document_highlight(client, bufnr)
 function M.setup_document_highlight(client, bufnr)

+ 5 - 1
lua/lvim/plugins.lua

@@ -7,8 +7,12 @@ local core_plugins = {
     "jose-elias-alvarez/null-ls.nvim",
     "jose-elias-alvarez/null-ls.nvim",
   },
   },
   { "antoinemadec/FixCursorHold.nvim" }, -- Needed while issue https://github.com/neovim/neovim/issues/12587 is still open
   { "antoinemadec/FixCursorHold.nvim" }, -- Needed while issue https://github.com/neovim/neovim/issues/12587 is still open
+  { "williamboman/mason-lspconfig.nvim" },
   {
   {
-    "williamboman/nvim-lsp-installer",
+    "williamboman/mason.nvim",
+    config = function()
+      require("lvim.core.mason").setup()
+    end,
   },
   },
   {
   {
     "lunarvim/onedarker.nvim",
     "lunarvim/onedarker.nvim",

+ 33 - 30
snapshots/default.json

@@ -1,78 +1,81 @@
 {
 {
   "Comment.nvim": {
   "Comment.nvim": {
-    "commit": "2e0572c"
+    "commit": "80e7746"
   },
   },
   "FixCursorHold.nvim": {
   "FixCursorHold.nvim": {
     "commit": "5aa5ff1"
     "commit": "5aa5ff1"
   },
   },
   "LuaSnip": {
   "LuaSnip": {
-    "commit": "be3083b"
+    "commit": "9f454cc"
   },
   },
   "alpha-nvim": {
   "alpha-nvim": {
-    "commit": "14974c3"
+    "commit": "f457f7f"
   },
   },
   "bufferline.nvim": {
   "bufferline.nvim": {
-    "commit": "d7b775a"
+    "commit": "13a532e"
   },
   },
   "cmp-buffer": {
   "cmp-buffer": {
-    "commit": "62fc67a"
+    "commit": "3022dbc"
   },
   },
   "cmp-nvim-lsp": {
   "cmp-nvim-lsp": {
     "commit": "affe808"
     "commit": "affe808"
   },
   },
   "cmp-path": {
   "cmp-path": {
-    "commit": "981baf9"
+    "commit": "447c87c"
   },
   },
   "cmp_luasnip": {
   "cmp_luasnip": {
     "commit": "a9de941"
     "commit": "a9de941"
   },
   },
   "dap-buddy.nvim": {
   "dap-buddy.nvim": {
-    "commit": "bbda2b0"
+    "commit": "3679132"
   },
   },
   "friendly-snippets": {
   "friendly-snippets": {
-    "commit": "40c306b"
+    "commit": "e5a16f9"
   },
   },
   "gitsigns.nvim": {
   "gitsigns.nvim": {
-    "commit": "bb6c3bf"
+    "commit": "1e107c9"
   },
   },
   "lua-dev.nvim": {
   "lua-dev.nvim": {
     "commit": "54149d1"
     "commit": "54149d1"
   },
   },
   "lualine.nvim": {
   "lualine.nvim": {
-    "commit": "8d956c1"
+    "commit": "3cf4540"
+  },
+  "mason-lspconfig.nvim": {
+    "commit": "74c45b3"
+  },
+  "mason.nvim": {
+    "commit": "9249238"
   },
   },
   "nlsp-settings.nvim": {
   "nlsp-settings.nvim": {
-    "commit": "6c4e1a4"
+    "commit": "1ffdeff"
   },
   },
   "null-ls.nvim": {
   "null-ls.nvim": {
-    "commit": "9c396ab"
+    "commit": "753ad51"
   },
   },
   "nvim-autopairs": {
   "nvim-autopairs": {
-    "commit": "972a797"
+    "commit": "0a18e10"
   },
   },
   "nvim-cmp": {
   "nvim-cmp": {
-    "commit": "c4dcb12"
+    "commit": "058100d"
   },
   },
   "nvim-dap": {
   "nvim-dap": {
-    "commit": "c0f43f4"
-  },
-  "nvim-lsp-installer": {
-    "commit": "45571e1"
+    "commit": "57003a0"
   },
   },
   "nvim-lspconfig": {
   "nvim-lspconfig": {
-    "commit": "3479473"
+    "commit": "636ce36"
   },
   },
   "nvim-notify": {
   "nvim-notify": {
-    "commit": "74ba257"
+    "commit": "cf5dc4f"
   },
   },
   "nvim-tree.lua": {
   "nvim-tree.lua": {
-    "commit": "08ab346"
+    "commit": "4a725c0"
   },
   },
   "nvim-treesitter": {
   "nvim-treesitter": {
-    "commit": "07b7221"
+    "commit": "f3c53d2"
   },
   },
   "nvim-ts-context-commentstring": {
   "nvim-ts-context-commentstring": {
-    "commit": "8834375"
+    "commit": "4d3a68c"
   },
   },
   "nvim-web-devicons": {
   "nvim-web-devicons": {
     "commit": "2d02a56"
     "commit": "2d02a56"
@@ -81,31 +84,31 @@
     "commit": "b00dd21"
     "commit": "b00dd21"
   },
   },
   "packer.nvim": {
   "packer.nvim": {
-    "commit": "494fd59"
+    "commit": "3a9f980"
   },
   },
   "plenary.nvim": {
   "plenary.nvim": {
-    "commit": "986ad71"
+    "commit": "a3dafaa"
   },
   },
   "popup.nvim": {
   "popup.nvim": {
     "commit": "b7404d3"
     "commit": "b7404d3"
   },
   },
   "project.nvim": {
   "project.nvim": {
-    "commit": "541115e"
+    "commit": "090bb11"
   },
   },
   "schemastore.nvim": {
   "schemastore.nvim": {
-    "commit": "fbc7c71"
+    "commit": "8f3a6e8"
   },
   },
   "structlog.nvim": {
   "structlog.nvim": {
     "commit": "232a8e2"
     "commit": "232a8e2"
   },
   },
   "telescope-fzf-native.nvim": {
   "telescope-fzf-native.nvim": {
-    "commit": "6a33ece"
+    "commit": "6791f74"
   },
   },
   "telescope.nvim": {
   "telescope.nvim": {
-    "commit": "273ccff"
+    "commit": "8dce937"
   },
   },
   "toggleterm.nvim": {
   "toggleterm.nvim": {
-    "commit": "9db6f98"
+    "commit": "f494c61"
   },
   },
   "which-key.nvim": {
   "which-key.nvim": {
     "commit": "f03a259"
     "commit": "f03a259"

+ 27 - 32
tests/minimal_lsp.lua

@@ -16,7 +16,7 @@ local package_root = join_paths(temp_dir, "nvim", "site", "pack")
 local install_path = join_paths(package_root, "packer", "start", "packer.nvim")
 local install_path = join_paths(package_root, "packer", "start", "packer.nvim")
 local compile_path = join_paths(install_path, "plugin", "packer_compiled.lua")
 local compile_path = join_paths(install_path, "plugin", "packer_compiled.lua")
 
 
--- Choose whether to use the executable that's managed by lsp-installer
+-- Choose whether to use the executable that's managed by mason
 local use_lsp_installer = true
 local use_lsp_installer = true
 
 
 local function load_plugins()
 local function load_plugins()
@@ -24,7 +24,8 @@ local function load_plugins()
     {
     {
       "wbthomason/packer.nvim",
       "wbthomason/packer.nvim",
       "neovim/nvim-lspconfig",
       "neovim/nvim-lspconfig",
-      { "williamboman/nvim-lsp-installer", disable = not use_lsp_installer },
+      "williamboman/mason-lspconfig.nvim",
+      "williamboman/mason.nvim",
     },
     },
     config = {
     config = {
       package_root = package_root,
       package_root = package_root,
@@ -44,9 +45,6 @@ _G.load_config = function()
   require("vim.lsp.log").set_format_func(vim.inspect)
   require("vim.lsp.log").set_format_func(vim.inspect)
   local nvim_lsp = require "lspconfig"
   local nvim_lsp = require "lspconfig"
   local on_attach = function(_, bufnr)
   local on_attach = function(_, bufnr)
-    local function buf_set_keymap(...)
-      vim.api.nvim_buf_set_keymap(bufnr, ...)
-    end
     local function buf_set_option(...)
     local function buf_set_option(...)
       vim.api.nvim_buf_set_option(bufnr, ...)
       vim.api.nvim_buf_set_option(bufnr, ...)
     end
     end
@@ -54,24 +52,26 @@ _G.load_config = function()
     buf_set_option("omnifunc", "v:lua.vim.lsp.omnifunc")
     buf_set_option("omnifunc", "v:lua.vim.lsp.omnifunc")
 
 
     -- Mappings.
     -- Mappings.
-    local opts = { noremap = true, silent = true }
-    buf_set_keymap("n", "gD", "<Cmd>lua vim.lsp.buf.declaration()<CR>", opts)
-    buf_set_keymap("n", "gd", "<Cmd>lua vim.lsp.buf.definition()<CR>", opts)
-    buf_set_keymap("n", "K", "<Cmd>lua vim.lsp.buf.hover()<CR>", opts)
-    buf_set_keymap("n", "gi", "<cmd>lua vim.lsp.buf.implementation()<CR>", opts)
-    buf_set_keymap("n", "<C-k>", "<cmd>lua vim.lsp.buf.signature_help()<CR>", opts)
-    buf_set_keymap("n", "<space>wa", "<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>", opts)
-    buf_set_keymap("n", "<space>wr", "<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>", opts)
-    buf_set_keymap("n", "<space>wl", "<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>", opts)
-    buf_set_keymap("n", "<space>lD", "<cmd>lua vim.lsp.buf.type_definition()<CR>", opts)
-    buf_set_keymap("n", "<space>lr", "<cmd>lua vim.lsp.buf.rename()<CR>", opts)
-    buf_set_keymap("n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", opts)
-    buf_set_keymap("n", "gl", "<cmd>lua vim.diagnostic.open_float(0,{scope='line'})<CR>", opts)
-    buf_set_keymap("n", "<space>lk", "<cmd>lua vim.diagnostic.goto_prev()<CR>", opts)
-    buf_set_keymap("n", "<space>lj", "<cmd>lua vim.diagnostic.goto_next()<CR>", opts)
-    buf_set_keymap("n", "<space>lq", "<cmd>lua vim.diagnostic.setloclist()<CR>", opts)
-    buf_set_keymap("n", "<space>li", "<cmd>LspInfo<CR>", opts)
-    buf_set_keymap("n", "<space>lI", "<cmd>LspInstallInfo<CR>", opts)
+    local opts = { buffer = bufnr, noremap = true, silent = true }
+    vim.keymap.set("n", "gD", vim.lsp.buf.declaration, opts)
+    vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts)
+    vim.keymap.set("n", "K", vim.lsp.buf.hover, opts)
+    vim.keymap.set("n", "gi", vim.lsp.buf.implementation, opts)
+    vim.keymap.set("n", "<C-k>", vim.lsp.buf.signature_help, opts)
+    vim.keymap.set("n", "<space>wa", vim.lsp.buf.add_workspace_folder, opts)
+    vim.keymap.set("n", "<space>wr", vim.lsp.buf.remove_workspace_folder, opts)
+    vim.keymap.set("n", "<space>wl", function()
+      print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
+    end, opts)
+    vim.keymap.set("n", "<space>lD", vim.lsp.buf.type_definition, opts)
+    vim.keymap.set("n", "<space>lr", vim.lsp.buf.rename, opts)
+    vim.keymap.set("n", "gr", vim.lsp.buf.references, opts)
+    vim.keymap.set("n", "gl", vim.diagnostic.open_float, opts)
+    vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, opts)
+    vim.keymap.set("n", "]d", vim.diagnostic.goto_next, opts)
+    vim.keymap.set("n", "<space>q", vim.diagnostic.setloclist, opts)
+    vim.keymap.set("n", "<space>li", "<cmd>LspInfo<CR>", opts)
+    vim.keymap.set("n", "<space>lI", "<cmd>MasonCR>", opts)
   end
   end
 
 
   -- Add the server that troubles you here, e.g. "clangd", "pyright", "tsserver"
   -- Add the server that troubles you here, e.g. "clangd", "pyright", "tsserver"
@@ -81,15 +81,6 @@ _G.load_config = function()
     on_attach = on_attach,
     on_attach = on_attach,
   }
   }
 
 
-  if use_lsp_installer then
-    local server_available, server = require("nvim-lsp-installer.servers").get_server(name)
-    if not server_available then
-      server:install()
-    end
-    local default_opts = server:get_default_options()
-    setup_opts = vim.tbl_deep_extend("force", setup_opts, default_opts)
-  end
-
   if not name then
   if not name then
     print "You have not defined a server name, please edit minimal_init.lua"
     print "You have not defined a server name, please edit minimal_init.lua"
   end
   end
@@ -99,6 +90,10 @@ _G.load_config = function()
   end
   end
 
 
   nvim_lsp[name].setup(setup_opts)
   nvim_lsp[name].setup(setup_opts)
+  if use_lsp_installer then
+    require("mason-lspconfig").setup { automatic_installation = true }
+  end
+
   print [[You can find your log at $HOME/.cache/nvim/lsp.log. Please paste in a github issue under a details tag as described in the issue template.]]
   print [[You can find your log at $HOME/.cache/nvim/lsp.log. Please paste in a github issue under a details tag as described in the issue template.]]
 end
 end
 
 

+ 5 - 1
tests/specs/lsp_spec.lua

@@ -53,10 +53,14 @@ a.describe("lsp workflow", function()
   a.it("should only include one server per generated template", function()
   a.it("should only include one server per generated template", function()
     require("lvim.lsp").setup()
     require("lvim.lsp").setup()
 
 
+    local allowed_dupes = { "tailwindcss" }
     for _, file in ipairs(vim.fn.glob(lvim.lsp.templates_dir .. "/*.lua", 1, 1)) do
     for _, file in ipairs(vim.fn.glob(lvim.lsp.templates_dir .. "/*.lua", 1, 1)) do
       local content = {}
       local content = {}
       for entry in io.lines(file) do
       for entry in io.lines(file) do
-        table.insert(content, entry)
+        local server_name = entry:match [[.*setup%("(.*)"%)]]
+        if not vim.tbl_contains(allowed_dupes, server_name) then
+          table.insert(content, server_name)
+        end
       end
       end
       local err_msg = ""
       local err_msg = ""
       if #content > 1 then
       if #content > 1 then

+ 2 - 1
utils/ci/generate_new_lockfile.lua

@@ -70,6 +70,7 @@ local function write_lockfile(verbose)
       name = name,
       name = name,
       url = url,
       url = url,
       commit = commit,
       commit = commit,
+      branch = plugin.branch or "HEAD",
     })
     })
   end
   end
 
 
@@ -90,7 +91,7 @@ local function write_lockfile(verbose)
       }
       }
     end
     end
 
 
-    local handle = call_proc("git", { args = { "ls-remote", entry.url, "HEAD" } }, on_done)
+    local handle = call_proc("git", { args = { "ls-remote", entry.url, entry.branch } }, on_done)
     assert(handle)
     assert(handle)
     table.insert(active_jobs, handle)
     table.insert(active_jobs, handle)
   end
   end

+ 4 - 2
utils/installer/config.example.lua

@@ -19,6 +19,8 @@ lvim.colorscheme = "onedarker"
 lvim.leader = "space"
 lvim.leader = "space"
 -- add your own keymapping
 -- add your own keymapping
 lvim.keys.normal_mode["<C-s>"] = ":w<cr>"
 lvim.keys.normal_mode["<C-s>"] = ":w<cr>"
+-- lvim.keys.normal_mode["<S-l>"] = ":BufferLineCycleNext<CR>"
+-- lvim.keys.normal_mode["<S-h>"] = ":BufferLineCyclePrev<CR>"
 -- unmap a default keymapping
 -- unmap a default keymapping
 -- vim.keymap.del("n", "<C-Up>")
 -- vim.keymap.del("n", "<C-Up>")
 -- override a default keymapping
 -- override a default keymapping
@@ -51,7 +53,7 @@ lvim.keys.normal_mode["<C-s>"] = ":w<cr>"
 --   d = { "<cmd>Trouble document_diagnostics<cr>", "Diagnostics" },
 --   d = { "<cmd>Trouble document_diagnostics<cr>", "Diagnostics" },
 --   q = { "<cmd>Trouble quickfix<cr>", "QuickFix" },
 --   q = { "<cmd>Trouble quickfix<cr>", "QuickFix" },
 --   l = { "<cmd>Trouble loclist<cr>", "LocationList" },
 --   l = { "<cmd>Trouble loclist<cr>", "LocationList" },
---   w = { "<cmd>Trouble workspace_diagnostics<cr>", "Wordspace Diagnostics" },
+--   w = { "<cmd>Trouble workspace_diagnostics<cr>", "Workspace Diagnostics" },
 -- }
 -- }
 
 
 -- TODO: User Config for predefined plugins
 -- TODO: User Config for predefined plugins
@@ -99,7 +101,7 @@ lvim.builtin.treesitter.highlight.enabled = true
 -- }
 -- }
 
 
 -- ---@usage disable automatic installation of servers
 -- ---@usage disable automatic installation of servers
--- lvim.lsp.automatic_servers_installation = false
+-- lvim.lsp.installer.setup.automatic_installation = false
 
 
 -- ---configure a server manually. !!Requires `:LvimCacheReset` to take effect!!
 -- ---configure a server manually. !!Requires `:LvimCacheReset` to take effect!!
 -- ---see the full default list `:lua print(vim.inspect(lvim.lsp.automatic_configuration.skipped_servers))`
 -- ---see the full default list `:lua print(vim.inspect(lvim.lsp.automatic_configuration.skipped_servers))`

+ 10 - 8
utils/installer/config_win.example.lua

@@ -36,6 +36,8 @@ lvim.colorscheme = "onedarker"
 lvim.leader = "space"
 lvim.leader = "space"
 -- add your own keymapping
 -- add your own keymapping
 lvim.keys.normal_mode["<C-s>"] = ":w<cr>"
 lvim.keys.normal_mode["<C-s>"] = ":w<cr>"
+-- lvim.keys.normal_mode["<S-l>"] = ":BufferLineCycleNext<CR>"
+-- lvim.keys.normal_mode["<S-h>"] = ":BufferLineCyclePrev<CR>"
 -- unmap a default keymapping
 -- unmap a default keymapping
 -- vim.keymap.del("n", "<C-Up>")
 -- vim.keymap.del("n", "<C-Up>")
 -- override a default keymapping
 -- override a default keymapping
@@ -79,14 +81,14 @@ lvim.builtin.terminal.active = false
 -- lvim.builtin.terminal.shell = "pwsh.exe -NoLogo"
 -- lvim.builtin.terminal.shell = "pwsh.exe -NoLogo"
 
 
 -- nvim-tree has some performance issues on windows, see kyazdani42/nvim-tree.lua#549
 -- nvim-tree has some performance issues on windows, see kyazdani42/nvim-tree.lua#549
-lvim.builtin.nvimtree.setup.diagnostics.enable = false
-lvim.builtin.nvimtree.setup.filters.custom = false
-lvim.builtin.nvimtree.setup.git.enable = false
-lvim.builtin.nvimtree.setup.update_cwd = false
-lvim.builtin.nvimtree.setup.update_focused_file.update_cwd = false
+lvim.builtin.nvimtree.setup.diagnostics.enable = nil
+lvim.builtin.nvimtree.setup.filters.custom = nil
+lvim.builtin.nvimtree.setup.git.enable = nil
+lvim.builtin.nvimtree.setup.update_cwd = nil
+lvim.builtin.nvimtree.setup.update_focused_file.update_cwd = nil
 lvim.builtin.nvimtree.setup.view.side = "left"
 lvim.builtin.nvimtree.setup.view.side = "left"
-lvim.builtin.nvimtree.setup.renderer.highlight_git = false
-lvim.builtin.nvimtree.setup.renderer.icons.show.git = false
+lvim.builtin.nvimtree.setup.renderer.highlight_git = nil
+lvim.builtin.nvimtree.setup.renderer.icons.show.git = nil
 
 
 -- if you don't want all the parsers change this to a table of the ones you want
 -- if you don't want all the parsers change this to a table of the ones you want
 lvim.builtin.treesitter.ensure_installed = {
 lvim.builtin.treesitter.ensure_installed = {
@@ -114,7 +116,7 @@ lvim.builtin.treesitter.highlight.enabled = true
 -- }
 -- }
 
 
 -- ---@usage disable automatic installation of servers
 -- ---@usage disable automatic installation of servers
--- lvim.lsp.automatic_servers_installation = false
+-- lvim.lsp.installer.setup.automatic_installation = false
 
 
 -- ---configure a server manually. !!Requires `:LvimCacheReset` to take effect!!
 -- ---configure a server manually. !!Requires `:LvimCacheReset` to take effect!!
 -- ---see the full default list `:lua print(vim.inspect(lvim.lsp.automatic_configuration.skipped_servers))`
 -- ---see the full default list `:lua print(vim.inspect(lvim.lsp.automatic_configuration.skipped_servers))`

+ 7 - 0
utils/installer/install.ps1

@@ -264,6 +264,13 @@ function create_alias {
         return
         return
     }
     }
 
 
+    try {
+        Get-Content $PROFILE -ErrorAction Stop
+    }
+    catch {
+        New-Item -Path $PROFILE -ItemType "file" -Force
+    }
+
     Add-Content -Path $PROFILE -Value $("`r`nSet-Alias lvim $lvim_bin")
     Add-Content -Path $PROFILE -Value $("`r`nSet-Alias lvim $lvim_bin")
 
 
     Write-Host 'To use the new alias in this window reload your profile with: `. $PROFILE`' -ForegroundColor Green
     Write-Host 'To use the new alias in this window reload your profile with: `. $PROFILE`' -ForegroundColor Green

+ 26 - 7
utils/installer/install.sh

@@ -26,6 +26,7 @@ declare ARGS_LOCAL=0
 declare ARGS_OVERWRITE=0
 declare ARGS_OVERWRITE=0
 declare ARGS_INSTALL_DEPENDENCIES=1
 declare ARGS_INSTALL_DEPENDENCIES=1
 declare INTERACTIVE_MODE=1
 declare INTERACTIVE_MODE=1
+declare ADDITIONAL_WARNINGS=""
 
 
 declare -a __lvim_dirs=(
 declare -a __lvim_dirs=(
   "$LUNARVIM_CONFIG_DIR"
   "$LUNARVIM_CONFIG_DIR"
@@ -148,6 +149,7 @@ function main() {
 
 
   setup_lvim
   setup_lvim
 
 
+  msg "$ADDITIONAL_WARNINGS"
   msg "Thank you for installing LunarVim!!"
   msg "Thank you for installing LunarVim!!"
   echo "You can start it by running: $INSTALL_PREFIX/bin/lvim"
   echo "You can start it by running: $INSTALL_PREFIX/bin/lvim"
   echo "Do not forget to use a font with glyphs (icons) support [https://github.com/ryanoasis/nerd-fonts]"
   echo "Do not forget to use a font with glyphs (icons) support [https://github.com/ryanoasis/nerd-fonts]"
@@ -226,7 +228,25 @@ function validate_lunarvim_files() {
   fi
   fi
 }
 }
 
 
+function validate_install_prefix() {
+  local prefix="$1"
+  case $PATH in
+    *"$prefix/bin"*)
+      return
+      ;;
+  esac
+  local profile="$HOME/.profile"
+  test -z "$ZSH_VERSION" && profile="$HOME/.zshenv"
+  ADDITIONAL_WARNINGS="[WARN] the folder $prefix/bin is not on PATH, consider adding 'export PATH=$prefix/bin:\$PATH' to your $profile"
+
+  # avoid problems when calling any verify_* function
+  export PATH="$prefix/bin:$PATH"
+}
+
 function check_system_deps() {
 function check_system_deps() {
+
+  validate_install_prefix "$INSTALL_PREFIX"
+
   if ! command -v git &>/dev/null; then
   if ! command -v git &>/dev/null; then
     print_missing_dep_msg "git"
     print_missing_dep_msg "git"
     exit 1
     exit 1
@@ -279,7 +299,6 @@ function __validate_node_installation() {
   fi
   fi
 
 
   if [ ! -d "$manager_home" ] || [ ! -w "$manager_home" ]; then
   if [ ! -d "$manager_home" ] || [ ! -w "$manager_home" ]; then
-    echo "[ERROR] Unable to install using [$pkg_manager] without administrative privileges."
     return 1
     return 1
   fi
   fi
 
 
@@ -294,21 +313,21 @@ function install_nodejs_deps() {
       return
       return
     fi
     fi
   done
   done
-  print_missing_dep_msg "${pkg_managers[@]}"
-  exit 1
+  echo "[WARN]: skipping installing optional nodejs dependencies due to insufficient permissions."
+  echo "check how to solve it: https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally"
 }
 }
 
 
 function install_python_deps() {
 function install_python_deps() {
   echo "Verifying that pip is available.."
   echo "Verifying that pip is available.."
-  if ! python3 -m ensurepip &>/dev/null; then
+  if ! python3 -m ensurepip >/dev/null; then
     if ! python3 -m pip --version &>/dev/null; then
     if ! python3 -m pip --version &>/dev/null; then
-      print_missing_dep_msg "pip"
-      exit 1
+      echo "[WARN]: skipping installing optional python dependencies"
+      return 1
     fi
     fi
   fi
   fi
   echo "Installing with pip.."
   echo "Installing with pip.."
   for dep in "${__pip_deps[@]}"; do
   for dep in "${__pip_deps[@]}"; do
-    python3 -m pip install --user "$dep"
+    python3 -m pip install --user "$dep" || return 1
   done
   done
   echo "All Python dependencies are successfully installed"
   echo "All Python dependencies are successfully installed"
 }
 }