mirror of
				https://github.com/NotAShelf/nvf.git
				synced 2025-11-03 20:22:21 +00:00 
			
		
		
		
	Merge 11bb5982c5 into 9aa9088564
		
	This commit is contained in:
		
				commit
				
					
						b3e5a452b2
					
				
			
		
					 29 changed files with 1258 additions and 850 deletions
				
			
		| 
						 | 
					@ -83,7 +83,8 @@ isMaximal: {
 | 
				
			||||||
      dart.enable = false;
 | 
					      dart.enable = false;
 | 
				
			||||||
      ocaml.enable = false;
 | 
					      ocaml.enable = false;
 | 
				
			||||||
      elixir.enable = false;
 | 
					      elixir.enable = false;
 | 
				
			||||||
      haskell.enable = false;
 | 
					      haskell.enable = true;
 | 
				
			||||||
 | 
					      hcl.enable = true;
 | 
				
			||||||
      ruby.enable = false;
 | 
					      ruby.enable = false;
 | 
				
			||||||
      fsharp.enable = false;
 | 
					      fsharp.enable = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
{lib}: let
 | 
					{lib}: let
 | 
				
			||||||
  inherit (builtins) isString getAttr;
 | 
					  inherit (builtins) isString getAttr;
 | 
				
			||||||
  inherit (lib.options) mkOption;
 | 
					  inherit (lib.options) mkOption;
 | 
				
			||||||
  inherit (lib.types) listOf bool str submodule attrsOf anything either nullOr;
 | 
					  inherit (lib.types) listOf bool str submodule attrsOf anything either nullOr oneOf;
 | 
				
			||||||
  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
  inherit (lib.nvim.types) luaInline;
 | 
					  inherit (lib.nvim.types) luaInline;
 | 
				
			||||||
in {
 | 
					in {
 | 
				
			||||||
| 
						 | 
					@ -62,7 +62,7 @@ in {
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      cmd = mkOption {
 | 
					      cmd = mkOption {
 | 
				
			||||||
        type = nullOr (listOf str);
 | 
					        type = nullOr (either luaInline (listOf str));
 | 
				
			||||||
        default = null;
 | 
					        default = null;
 | 
				
			||||||
        description = "Command used to start the LSP server";
 | 
					        description = "Command used to start the LSP server";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,5 +8,6 @@
 | 
				
			||||||
    ./highlight.nix
 | 
					    ./highlight.nix
 | 
				
			||||||
    ./lsp.nix
 | 
					    ./lsp.nix
 | 
				
			||||||
    ./spellcheck.nix
 | 
					    ./spellcheck.nix
 | 
				
			||||||
 | 
					    ./util.nix
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.lsp;
 | 
					  cfg = config.vim.lsp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # TODO: lspConfigurations filter on enabledServers instead of cfg.servers?
 | 
				
			||||||
  lspConfigurations =
 | 
					  lspConfigurations =
 | 
				
			||||||
    mapAttrsToList (
 | 
					    mapAttrsToList (
 | 
				
			||||||
      name: value: ''
 | 
					      name: value: ''
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										178
									
								
								modules/neovim/init/util.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								modules/neovim/init/util.nix
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,178 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  config,
 | 
				
			||||||
 | 
					  lib,
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					}: let
 | 
				
			||||||
 | 
					  inherit (builtins) filter;
 | 
				
			||||||
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.dag) entryBefore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cfg = config.vim.lsp;
 | 
				
			||||||
 | 
					in {
 | 
				
			||||||
 | 
					  config = mkMerge [
 | 
				
			||||||
 | 
					    (mkIf (cfg.servers != {}) {
 | 
				
			||||||
 | 
					      vim.luaConfigRC.lsp-util =
 | 
				
			||||||
 | 
					        entryBefore ["lsp-servers"]
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					        lua
 | 
				
			||||||
 | 
					        */
 | 
				
			||||||
 | 
					        ''
 | 
				
			||||||
 | 
					          -- Port of nvim-lspconfig util
 | 
				
			||||||
 | 
					          local util = { path = {} }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          util.default_config = {
 | 
				
			||||||
 | 
					            log_level = vim.lsp.protocol.MessageType.Warning,
 | 
				
			||||||
 | 
					            message_level = vim.lsp.protocol.MessageType.Warning,
 | 
				
			||||||
 | 
					            settings = vim.empty_dict(),
 | 
				
			||||||
 | 
					            init_options = vim.empty_dict(),
 | 
				
			||||||
 | 
					            handlers = {},
 | 
				
			||||||
 | 
					            autostart = true,
 | 
				
			||||||
 | 
					            capabilities = vim.lsp.protocol.make_client_capabilities(),
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          -- global on_setup hook
 | 
				
			||||||
 | 
					          util.on_setup = nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          do
 | 
				
			||||||
 | 
					            local validate = vim.validate
 | 
				
			||||||
 | 
					            local api = vim.api
 | 
				
			||||||
 | 
					            local lsp = vim.lsp
 | 
				
			||||||
 | 
					            local nvim_eleven = vim.fn.has 'nvim-0.11' == 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            local iswin = vim.uv.os_uname().version:match 'Windows'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            local function escape_wildcards(path)
 | 
				
			||||||
 | 
					              return path:gsub('([%[%]%?%*])', '\\%1')
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            local function is_fs_root(path)
 | 
				
			||||||
 | 
					              if iswin then
 | 
				
			||||||
 | 
					                return path:match '^%a:$'
 | 
				
			||||||
 | 
					              else
 | 
				
			||||||
 | 
					                return path == '/'
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            local function traverse_parents(path, cb)
 | 
				
			||||||
 | 
					              path = vim.uv.fs_realpath(path)
 | 
				
			||||||
 | 
					              local dir = path
 | 
				
			||||||
 | 
					              -- Just in case our algo is buggy, don't infinite loop.
 | 
				
			||||||
 | 
					              for _ = 1, 100 do
 | 
				
			||||||
 | 
					                dir = vim.fs.dirname(dir)
 | 
				
			||||||
 | 
					                if not dir then
 | 
				
			||||||
 | 
					                  return
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					                -- If we can't ascend further, then stop looking.
 | 
				
			||||||
 | 
					                if cb(dir, path) then
 | 
				
			||||||
 | 
					                  return dir, path
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					                if is_fs_root(dir) then
 | 
				
			||||||
 | 
					                  break
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            util.root_pattern = function(...)
 | 
				
			||||||
 | 
					              local patterns = util.tbl_flatten { ... }
 | 
				
			||||||
 | 
					              return function(startpath)
 | 
				
			||||||
 | 
					                startpath = util.strip_archive_subpath(startpath)
 | 
				
			||||||
 | 
					                for _, pattern in ipairs(patterns) do
 | 
				
			||||||
 | 
					                  local match = util.search_ancestors(startpath, function(path)
 | 
				
			||||||
 | 
					                    for _, p in ipairs(vim.fn.glob(table.concat({ escape_wildcards(path), pattern }, '/'), true, true)) do
 | 
				
			||||||
 | 
					                      if vim.uv.fs_stat(p) then
 | 
				
			||||||
 | 
					                        return path
 | 
				
			||||||
 | 
					                      end
 | 
				
			||||||
 | 
					                    end
 | 
				
			||||||
 | 
					                  end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  if match ~= nil then
 | 
				
			||||||
 | 
					                    return match
 | 
				
			||||||
 | 
					                  end
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            util.root_markers_with_field = function(root_files, new_names, field, fname)
 | 
				
			||||||
 | 
					              local path = vim.fn.fnamemodify(fname, ':h')
 | 
				
			||||||
 | 
					              local found = vim.fs.find(new_names, { path = path, upward = true })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              for _, f in ipairs(found or {}) do
 | 
				
			||||||
 | 
					                -- Match the given `field`.
 | 
				
			||||||
 | 
					                for line in io.lines(f) do
 | 
				
			||||||
 | 
					                  if line:find(field) then
 | 
				
			||||||
 | 
					                    root_files[#root_files + 1] = vim.fs.basename(f)
 | 
				
			||||||
 | 
					                    break
 | 
				
			||||||
 | 
					                  end
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              return root_files
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            util.insert_package_json = function(root_files, field, fname)
 | 
				
			||||||
 | 
					              return util.root_markers_with_field(root_files, { 'package.json', 'package.json5' }, field, fname)
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            util.strip_archive_subpath = function(path)
 | 
				
			||||||
 | 
					              -- Matches regex from zip.vim / tar.vim
 | 
				
			||||||
 | 
					              path = vim.fn.substitute(path, 'zipfile://\\(.\\{-}\\)::[^\\\\].*$', '\\1', ''')
 | 
				
			||||||
 | 
					              path = vim.fn.substitute(path, 'tarfile:\\(.\\{-}\\)::.*$', '\\1', ''')
 | 
				
			||||||
 | 
					              return path
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            util.get_typescript_server_path = function(root_dir)
 | 
				
			||||||
 | 
					              local project_roots = vim.fs.find('node_modules', { path = root_dir, upward = true, limit = math.huge })
 | 
				
			||||||
 | 
					              for _, project_root in ipairs(project_roots) do
 | 
				
			||||||
 | 
					                local typescript_path = project_root .. '/typescript'
 | 
				
			||||||
 | 
					                local stat = vim.loop.fs_stat(typescript_path)
 | 
				
			||||||
 | 
					                if stat and stat.type == 'directory' then
 | 
				
			||||||
 | 
					                  return typescript_path .. '/lib'
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					              return '''
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            util.search_ancestors = function(startpath, func)
 | 
				
			||||||
 | 
					              if nvim_eleven then
 | 
				
			||||||
 | 
					                validate('func', func, 'function')
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					              if func(startpath) then
 | 
				
			||||||
 | 
					                return startpath
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					              local guard = 100
 | 
				
			||||||
 | 
					              for path in vim.fs.parents(startpath) do
 | 
				
			||||||
 | 
					                -- Prevent infinite recursion if our algorithm breaks
 | 
				
			||||||
 | 
					                guard = guard - 1
 | 
				
			||||||
 | 
					                if guard == 0 then
 | 
				
			||||||
 | 
					                  return
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if func(path) then
 | 
				
			||||||
 | 
					                  return path
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            util.path.is_descendant = function(root, path)
 | 
				
			||||||
 | 
					              if not path then
 | 
				
			||||||
 | 
					                return false
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              local function cb(dir, _)
 | 
				
			||||||
 | 
					                return dir == root
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              local dir, _ = traverse_parents(path, cb)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              return dir == root
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            util.tbl_flatten = function(t)
 | 
				
			||||||
 | 
					              --- @diagnostic disable-next-line:deprecated
 | 
				
			||||||
 | 
					              return nvim_eleven and vim.iter(t):flatten(math.huge):totable() or vim.tbl_flatten(t)
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  ];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -4,12 +4,24 @@
 | 
				
			||||||
  lib,
 | 
					  lib,
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
}: let
 | 
					}: let
 | 
				
			||||||
 | 
					  inherit (builtins) attrNames;
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.types) package;
 | 
					  inherit (lib.types) package enum listOf;
 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.assembly;
 | 
					  cfg = config.vim.languages.assembly;
 | 
				
			||||||
 | 
					  defaultServers = ["asm-lsp"];
 | 
				
			||||||
 | 
					  servers = {
 | 
				
			||||||
 | 
					    asm-lsp = {
 | 
				
			||||||
 | 
					      enable = true;
 | 
				
			||||||
 | 
					      cmd = [(getExe pkgs.asm-lsp)];
 | 
				
			||||||
 | 
					      filetypes = ["asm" "vmasm"];
 | 
				
			||||||
 | 
					      root_markers = [".asm-lsp.toml" ".git"];
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
in {
 | 
					in {
 | 
				
			||||||
  options.vim.languages.assembly = {
 | 
					  options.vim.languages.assembly = {
 | 
				
			||||||
    enable = mkEnableOption "Assembly support";
 | 
					    enable = mkEnableOption "Assembly support";
 | 
				
			||||||
| 
						 | 
					@ -20,12 +32,11 @@ in {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Assembly LSP support (asm-lsp)" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Assembly LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					      servers = mkOption {
 | 
				
			||||||
      package = mkOption {
 | 
					        description = "Assembly LSP server to use";
 | 
				
			||||||
        type = package;
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        default = pkgs.asm-lsp;
 | 
					        default = defaultServers;
 | 
				
			||||||
        description = "asm-lsp package";
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -36,14 +47,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.asm-lsp = ''
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
        lspconfig.asm_lsp.setup {
 | 
					          name = n;
 | 
				
			||||||
          capabilities = capabilities,
 | 
					          value = servers.${n};
 | 
				
			||||||
          on_attach = default_on_attach,
 | 
					        })
 | 
				
			||||||
          cmd = {"${cfg.lsp.package}/bin/asm-lsp"},
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,25 +11,34 @@
 | 
				
			||||||
  inherit (lib.meta) getExe;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.types) enum either listOf package str;
 | 
					  inherit (lib.types) enum either listOf package str;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.nvim.lua) expToLua;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption diagnostics;
 | 
					  inherit (lib.nvim.types) mkGrammarOption diagnostics;
 | 
				
			||||||
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.astro;
 | 
					  cfg = config.vim.languages.astro;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "astro";
 | 
					  defaultServers = ["astro"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    astro = {
 | 
					    astro = {
 | 
				
			||||||
      package = pkgs.astro-language-server;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.astro-language-server) "--stdio"];
 | 
				
			||||||
        lspconfig.astro.setup {
 | 
					      filetypes = ["astro"];
 | 
				
			||||||
          capabilities = capabilities,
 | 
					      root_markers = ["package.json" "tsconfig.json" "jsconfig.json" ".git"];
 | 
				
			||||||
          on_attach = attach_keymaps,
 | 
					      init_options = {
 | 
				
			||||||
          cmd = ${
 | 
					        typescript = {};
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					      };
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					      before_init =
 | 
				
			||||||
          else ''{"${cfg.lsp.package}/bin/astro-ls", "--stdio"}''
 | 
					        mkLuaInline
 | 
				
			||||||
        }
 | 
					        /*
 | 
				
			||||||
        }
 | 
					        lua
 | 
				
			||||||
      '';
 | 
					        */
 | 
				
			||||||
 | 
					        ''
 | 
				
			||||||
 | 
					          function(_, config)
 | 
				
			||||||
 | 
					            if config.init_options and config.init_options.typescript and not config.init_options.typescript.tsdk then
 | 
				
			||||||
 | 
					              config.init_options.typescript.tsdk = util.get_typescript_server_path(config.root_dir)
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,18 +90,10 @@ in {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Astro LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Astro LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					      servers = mkOption {
 | 
				
			||||||
      server = mkOption {
 | 
					 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					 | 
				
			||||||
        default = defaultServer;
 | 
					 | 
				
			||||||
        description = "Astro LSP server to use";
 | 
					        description = "Astro LSP server to use";
 | 
				
			||||||
      };
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
 | 
					        default = defaultServers;
 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
        example = ''[lib.getExe pkgs.astro-language-server "--minify" "--stdio"]'';
 | 
					 | 
				
			||||||
        description = "Astro LSP server package, or the command to run as a list of strings";
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -130,8 +131,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.astro-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.format.enable {
 | 
					    (mkIf cfg.format.enable {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,26 +10,25 @@
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.lists) isList;
 | 
				
			||||||
  inherit (lib.types) enum either package listOf str bool;
 | 
					  inherit (lib.types) enum either package listOf str bool;
 | 
				
			||||||
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
  inherit (lib.nvim.types) diagnostics mkGrammarOption;
 | 
					  inherit (lib.nvim.types) diagnostics mkGrammarOption;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.nvim.lua) expToLua;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.bash;
 | 
					  cfg = config.vim.languages.bash;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "bash-ls";
 | 
					  defaultServers = ["bash-ls"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    bash-ls = {
 | 
					    bash-ls = {
 | 
				
			||||||
      package = pkgs.bash-language-server;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.bash-language-server) "start"];
 | 
				
			||||||
        lspconfig.bashls.setup{
 | 
					      filetypes = ["bash" "sh"];
 | 
				
			||||||
          capabilities = capabilities;
 | 
					      root_markers = [".git"];
 | 
				
			||||||
          on_attach = default_on_attach;
 | 
					      settings = {
 | 
				
			||||||
          cmd = ${
 | 
					        basheIde = {
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					          globPattern = mkLuaInline "vim.env.GLOB_PATTERN or '*@(.sh|.inc|.bash|.command)'";
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					 | 
				
			||||||
          else ''{"${cfg.lsp.package}/bin/bash-language-server",  "start"}''
 | 
					 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        }
 | 
					      };
 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,19 +55,11 @@ in {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Enable Bash LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Bash LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					      servers = mkOption {
 | 
				
			||||||
      server = mkOption {
 | 
					 | 
				
			||||||
        description = "Bash LSP server to use";
 | 
					        description = "Bash LSP server to use";
 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        default = defaultServer;
 | 
					        default = defaultServers;
 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        description = "bash-language-server package, or the command to run as a list of strings";
 | 
					 | 
				
			||||||
        example = literalExpression ''[lib.getExe pkgs.bash-language-server "start"]'';
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = pkgs.bash-language-server;
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,8 +99,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.bash-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.format.enable {
 | 
					    (mkIf cfg.format.enable {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,15 +4,27 @@
 | 
				
			||||||
  lib,
 | 
					  lib,
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
}: let
 | 
					}: let
 | 
				
			||||||
 | 
					  inherit (builtins) attrNames;
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.meta) getExe;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.lists) isList;
 | 
				
			||||||
  inherit (lib.types) either listOf package str;
 | 
					  inherit (lib.types) enum either listOf package str;
 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.nvim.lua) expToLua;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.clojure;
 | 
					  cfg = config.vim.languages.clojure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  defaultServers = ["clojure-lsp"];
 | 
				
			||||||
 | 
					  servers = {
 | 
				
			||||||
 | 
					    clojure-lsp = {
 | 
				
			||||||
 | 
					      enable = true;
 | 
				
			||||||
 | 
					      cmd = [(getExe pkgs.clojure-lsp)];
 | 
				
			||||||
 | 
					      filetypes = ["clojure" "edn"];
 | 
				
			||||||
 | 
					      root_markers = ["project.clj" "deps.edn" "build.boot" "shadow-cljs.edn" ".git" "bb.edn"];
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
in {
 | 
					in {
 | 
				
			||||||
  options.vim.languages.clojure = {
 | 
					  options.vim.languages.clojure = {
 | 
				
			||||||
    enable = mkEnableOption "Clojure language support";
 | 
					    enable = mkEnableOption "Clojure language support";
 | 
				
			||||||
| 
						 | 
					@ -24,28 +36,22 @@ in {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Clojure LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Clojure LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
      package = mkOption {
 | 
					      servers = mkOption {
 | 
				
			||||||
        type = either package (listOf str);
 | 
					        description = "Clojure LSP server to use";
 | 
				
			||||||
        default = pkgs.clojure-lsp;
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        description = "Clojure LSP";
 | 
					        default = defaultServers;
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  config = mkIf cfg.enable (mkMerge [
 | 
					  config = mkIf cfg.enable (mkMerge [
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.clojure-lsp = ''
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
        lspconfig.clojure_lsp.setup {
 | 
					          name = n;
 | 
				
			||||||
          capabilities = capabilities;
 | 
					          value = servers.${n};
 | 
				
			||||||
          on_attach = default_on_attach;
 | 
					        })
 | 
				
			||||||
          cmd = ${
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					 | 
				
			||||||
          else ''{"${getExe cfg.lsp.package}"}''
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.treesitter.enable {
 | 
					    (mkIf cfg.treesitter.enable {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,6 +6,7 @@
 | 
				
			||||||
}: let
 | 
					}: let
 | 
				
			||||||
  inherit (builtins) attrNames;
 | 
					  inherit (builtins) attrNames;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.trivial) boolToString;
 | 
					  inherit (lib.trivial) boolToString;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.lists) isList;
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
| 
						 | 
					@ -14,26 +15,31 @@
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.nvim.lua) expToLua;
 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
  inherit (lib.nvim.dag) entryAfter;
 | 
					  inherit (lib.nvim.dag) entryAfter;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.dart;
 | 
					  cfg = config.vim.languages.dart;
 | 
				
			||||||
  ftcfg = cfg.flutter-tools;
 | 
					  ftcfg = cfg.flutter-tools;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "dart";
 | 
					  defaultServers = ["dart"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    dart = {
 | 
					    dart = {
 | 
				
			||||||
      package = pkgs.dart;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.dart) "language-server" "--protocol=lsp"];
 | 
				
			||||||
        lspconfig.dartls.setup{
 | 
					      filetypes = ["dart"];
 | 
				
			||||||
          capabilities = capabilities;
 | 
					      root_markers = ["pubspec.yaml"];
 | 
				
			||||||
          on_attach=default_on_attach;
 | 
					      init_options = {
 | 
				
			||||||
          cmd = ${
 | 
					        onlyAnalyzeProjectsWithOpenFiles = true;
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					        suggestFromUnimportedLibraries = true;
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					        closingLabels = true;
 | 
				
			||||||
          else ''{"${cfg.lsp.package}/bin/dart", "language-server", "--protocol=lsp"}''
 | 
					        outline = true;
 | 
				
			||||||
 | 
					        flutterOutline = true;
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      settings = {
 | 
				
			||||||
 | 
					        dart = {
 | 
				
			||||||
 | 
					          completeFunctionCalls = true;
 | 
				
			||||||
 | 
					          showTodos = true;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
          ${optionalString (cfg.lsp.opts != null) "init_options = ${cfg.lsp.dartOpts}"}
 | 
					      };
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
in {
 | 
					in {
 | 
				
			||||||
| 
						 | 
					@ -46,23 +52,11 @@ in {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Dart LSP support";
 | 
					      enable = mkEnableOption "Dart LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
      server = mkOption {
 | 
					      servers = mkOption {
 | 
				
			||||||
        description = "The Dart LSP server to use";
 | 
					        description = "Dart LSP server to use";
 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        default = defaultServer;
 | 
					        default = defaultServers;
 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
        example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]'';
 | 
					 | 
				
			||||||
        description = "Dart LSP server package, or the command to run as a list of strings";
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      opts = mkOption {
 | 
					 | 
				
			||||||
        type = nullOr str;
 | 
					 | 
				
			||||||
        default = null;
 | 
					 | 
				
			||||||
        description = "Options to pass to Dart LSP server";
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -131,19 +125,23 @@ in {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  config.vim = mkIf cfg.enable (mkMerge [
 | 
					  config = mkIf cfg.enable (mkMerge [
 | 
				
			||||||
    (mkIf cfg.treesitter.enable {
 | 
					    (mkIf cfg.treesitter.enable {
 | 
				
			||||||
      treesitter.enable = true;
 | 
					      vim.treesitter.enable = true;
 | 
				
			||||||
      treesitter.grammars = [cfg.treesitter.package];
 | 
					      vim.treesitter.grammars = [cfg.treesitter.package];
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      lsp.lspconfig.sources.dart-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf ftcfg.enable {
 | 
					    (mkIf ftcfg.enable {
 | 
				
			||||||
      startPlugins = [
 | 
					      vim.startPlugins = [
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
          if ftcfg.enableNoResolvePatch
 | 
					          if ftcfg.enableNoResolvePatch
 | 
				
			||||||
          then "flutter-tools-patched"
 | 
					          then "flutter-tools-patched"
 | 
				
			||||||
| 
						 | 
					@ -152,7 +150,7 @@ in {
 | 
				
			||||||
        "plenary-nvim"
 | 
					        "plenary-nvim"
 | 
				
			||||||
      ];
 | 
					      ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      pluginRC.flutter-tools = entryAfter ["lsp-setup"] ''
 | 
					      vim.pluginRC.flutter-tools = entryAfter ["lsp-servers"] ''
 | 
				
			||||||
        require('flutter-tools').setup {
 | 
					        require('flutter-tools').setup {
 | 
				
			||||||
          ${optionalString (ftcfg.flutterPackage != null) "flutter_path = \"${ftcfg.flutterPackage}/bin/flutter\","}
 | 
					          ${optionalString (ftcfg.flutterPackage != null) "flutter_path = \"${ftcfg.flutterPackage}/bin/flutter\","}
 | 
				
			||||||
          lsp = {
 | 
					          lsp = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,29 +8,37 @@
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.lists) isList;
 | 
				
			||||||
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.types) enum either listOf package str;
 | 
					  inherit (lib.types) enum either listOf package str;
 | 
				
			||||||
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.nvim.lua) expToLua;
 | 
				
			||||||
  inherit (lib.nvim.dag) entryAnywhere;
 | 
					  inherit (lib.nvim.dag) entryAnywhere;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.elixir;
 | 
					  cfg = config.vim.languages.elixir;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "elixirls";
 | 
					  defaultServers = ["elixirls"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    elixirls = {
 | 
					    elixirls = {
 | 
				
			||||||
      package = pkgs.elixir-ls;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.elixir-ls)];
 | 
				
			||||||
        -- elixirls setup
 | 
					      filetypes = ["elixir" "eelixir" "heex" "surface"];
 | 
				
			||||||
        lspconfig.elixirls.setup {
 | 
					      root_dir =
 | 
				
			||||||
          capabilities = capabilities,
 | 
					        mkLuaInline
 | 
				
			||||||
          on_attach = default_on_attach,
 | 
					        /*
 | 
				
			||||||
          cmd = ${
 | 
					        lua
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					        */
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					        ''
 | 
				
			||||||
          else ''{"${cfg.lsp.package}/bin/elixir-ls"}''
 | 
					          function(bufnr, on_dir)
 | 
				
			||||||
        }
 | 
					            local fname = vim.api.nvim_buf_get_name(bufnr)
 | 
				
			||||||
        }
 | 
					            local matches = vim.fs.find({ 'mix.exs' }, { upward = true, limit = 2, path = fname })
 | 
				
			||||||
      '';
 | 
					            local child_or_root_path, maybe_umbrella_path = unpack(matches)
 | 
				
			||||||
 | 
					            local root_dir = vim.fs.dirname(maybe_umbrella_path or child_or_root_path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            on_dir(root_dir)
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,18 +62,10 @@ in {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Elixir LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Elixir LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					      servers = mkOption {
 | 
				
			||||||
      server = mkOption {
 | 
					 | 
				
			||||||
        description = "Elixir LSP server to use";
 | 
					        description = "Elixir LSP server to use";
 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        default = defaultServer;
 | 
					        default = defaultServers;
 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        description = "Elixir LSP server package, or the command to run as a list of strings";
 | 
					 | 
				
			||||||
        example = ''[lib.getExe pkgs.jdt-language-server " - data " " ~/.cache/jdtls/workspace "]'';
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -97,8 +97,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.elixir-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.format.enable {
 | 
					    (mkIf cfg.format.enable {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,27 +8,21 @@
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.lists) isList;
 | 
				
			||||||
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.types) enum either listOf package str;
 | 
					  inherit (lib.types) enum either listOf package str;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.nvim.lua) expToLua;
 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.gleam;
 | 
					  cfg = config.vim.languages.gleam;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "gleam";
 | 
					  defaultServers = ["gleam"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    gleam = {
 | 
					    gleam = {
 | 
				
			||||||
      package = pkgs.gleam;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.gleam) "lsp"];
 | 
				
			||||||
        lspconfig.gleam.setup{
 | 
					      filetypes = ["gleam"];
 | 
				
			||||||
          capabilities = capabilities,
 | 
					      root_markers = ["gleam.toml" ".git"];
 | 
				
			||||||
          on_attach = default_on_attach,
 | 
					 | 
				
			||||||
          cmd = ${
 | 
					 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					 | 
				
			||||||
          else ''{"${cfg.lsp.package}/bin/gleam", "lsp"}''
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
in {
 | 
					in {
 | 
				
			||||||
| 
						 | 
					@ -42,17 +36,10 @@ in {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Gleam LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Gleam LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					      servers = mkOption {
 | 
				
			||||||
      server = mkOption {
 | 
					 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					 | 
				
			||||||
        default = defaultServer;
 | 
					 | 
				
			||||||
        description = "Gleam LSP server to use";
 | 
					        description = "Gleam LSP server to use";
 | 
				
			||||||
      };
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
 | 
					        default = defaultServers;
 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
        description = "Gleam LSP server package, or the command to run as a list of strings";
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -64,8 +51,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.gleam-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,17 +4,67 @@
 | 
				
			||||||
  pkgs,
 | 
					  pkgs,
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
}: let
 | 
					}: let
 | 
				
			||||||
  inherit (builtins) isList;
 | 
					  inherit (builtins) isList attrNames;
 | 
				
			||||||
  inherit (lib.types) either package listOf str;
 | 
					  inherit (lib.types) either package enum listOf str;
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.strings) optionalString;
 | 
					  inherit (lib.strings) optionalString;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
  inherit (lib.nvim.dag) entryAfter;
 | 
					  inherit (lib.nvim.dag) entryAfter entryBefore;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.nvim.lua) expToLua;
 | 
				
			||||||
 | 
					  inherit (lib.meta) getExe';
 | 
				
			||||||
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
  inherit (pkgs) haskellPackages;
 | 
					  inherit (pkgs) haskellPackages;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.lua) toLuaObject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.haskell;
 | 
					  cfg = config.vim.languages.haskell;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  defaultServers = ["hls"];
 | 
				
			||||||
 | 
					  servers = {
 | 
				
			||||||
 | 
					    hls = {
 | 
				
			||||||
 | 
					      enable = false;
 | 
				
			||||||
 | 
					      cmd = [(getExe' pkgs.haskellPackages.haskell-language-server "haskell-language-server-wrapper") "--lsp"];
 | 
				
			||||||
 | 
					      filetypes = ["haskell" "lhaskell"];
 | 
				
			||||||
 | 
					      on_attach =
 | 
				
			||||||
 | 
					        mkLuaInline
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					        lua
 | 
				
			||||||
 | 
					        */
 | 
				
			||||||
 | 
					        ''
 | 
				
			||||||
 | 
					          function(client, bufnr)
 | 
				
			||||||
 | 
					              local ht = require("haskell-tools")
 | 
				
			||||||
 | 
					              default_on_attach(client, bufnr, ht)
 | 
				
			||||||
 | 
					              local opts = { noremap = true, silent = true, buffer = bufnr }
 | 
				
			||||||
 | 
					              vim.keymap.set('n', '<localleader>cl', vim.lsp.codelens.run, opts)
 | 
				
			||||||
 | 
					              vim.keymap.set('n', '<localleader>hs', ht.hoogle.hoogle_signature, opts)
 | 
				
			||||||
 | 
					              vim.keymap.set('n', '<localleader>ea', ht.lsp.buf_eval_all, opts)
 | 
				
			||||||
 | 
					              vim.keymap.set('n', '<localleader>rr', ht.repl.toggle, opts)
 | 
				
			||||||
 | 
					              vim.keymap.set('n', '<localleader>rf', function()
 | 
				
			||||||
 | 
					                ht.repl.toggle(vim.api.nvim_buf_get_name(0))
 | 
				
			||||||
 | 
					              end, opts)
 | 
				
			||||||
 | 
					              vim.keymap.set('n', '<localleader>rq', ht.repl.quit, opts)
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					      root_dir =
 | 
				
			||||||
 | 
					        mkLuaInline
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					        lua
 | 
				
			||||||
 | 
					        */
 | 
				
			||||||
 | 
					        ''
 | 
				
			||||||
 | 
					          function(bufnr, on_dir)
 | 
				
			||||||
 | 
					            local fname = vim.api.nvim_buf_get_name(bufnr)
 | 
				
			||||||
 | 
					            on_dir(util.root_pattern('hie.yaml', 'stack.yaml', 'cabal.project', '*.cabal', 'package.yaml')(fname))
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					      settings = {
 | 
				
			||||||
 | 
					        haskell = {
 | 
				
			||||||
 | 
					          formattingProvider = "ormolu";
 | 
				
			||||||
 | 
					          cabalFormattingProvider = "cabalfmt";
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
in {
 | 
					in {
 | 
				
			||||||
  options.vim.languages.haskell = {
 | 
					  options.vim.languages.haskell = {
 | 
				
			||||||
    enable = mkEnableOption "Haskell support";
 | 
					    enable = mkEnableOption "Haskell support";
 | 
				
			||||||
| 
						 | 
					@ -25,12 +75,11 @@ in {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "LSP support for Haskell" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Haskell LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
      package = mkOption {
 | 
					      servers = mkOption {
 | 
				
			||||||
        description = "Haskell LSP package or command to run the Haskell LSP";
 | 
					        description = "Haskell LSP server to use";
 | 
				
			||||||
        example = ''[ (lib.getExe pkgs.haskellPackages.haskell-language-server) "--debug" ]'';
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        default = haskellPackages.haskell-language-server;
 | 
					        default = defaultServers;
 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,7 +106,7 @@ in {
 | 
				
			||||||
        startPlugins = ["haskell-tools-nvim"];
 | 
					        startPlugins = ["haskell-tools-nvim"];
 | 
				
			||||||
        luaConfigRC.haskell-tools-nvim =
 | 
					        luaConfigRC.haskell-tools-nvim =
 | 
				
			||||||
          entryAfter
 | 
					          entryAfter
 | 
				
			||||||
          ["lsp-setup"]
 | 
					          ["lsp-servers"]
 | 
				
			||||||
          ''
 | 
					          ''
 | 
				
			||||||
            vim.g.haskell_tools = {
 | 
					            vim.g.haskell_tools = {
 | 
				
			||||||
            ${optionalString cfg.lsp.enable ''
 | 
					            ${optionalString cfg.lsp.enable ''
 | 
				
			||||||
| 
						 | 
					@ -67,25 +116,7 @@ in {
 | 
				
			||||||
                  enable = true,
 | 
					                  enable = true,
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
              },
 | 
					              },
 | 
				
			||||||
              hls = {
 | 
					              hls = ${toLuaObject servers.hls}
 | 
				
			||||||
                cmd = ${
 | 
					 | 
				
			||||||
                if isList cfg.lsp.package
 | 
					 | 
				
			||||||
                then expToLua cfg.lsp.package
 | 
					 | 
				
			||||||
                else ''{"${cfg.lsp.package}/bin/haskell-language-server-wrapper", "--lsp"}''
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
                on_attach = function(client, bufnr, ht)
 | 
					 | 
				
			||||||
                  default_on_attach(client, bufnr, ht)
 | 
					 | 
				
			||||||
                  local opts = { noremap = true, silent = true, buffer = bufnr }
 | 
					 | 
				
			||||||
                  vim.keymap.set('n', '<localleader>cl', vim.lsp.codelens.run, opts)
 | 
					 | 
				
			||||||
                  vim.keymap.set('n', '<localleader>hs', ht.hoogle.hoogle_signature, opts)
 | 
					 | 
				
			||||||
                  vim.keymap.set('n', '<localleader>ea', ht.lsp.buf_eval_all, opts)
 | 
					 | 
				
			||||||
                  vim.keymap.set('n', '<localleader>rr', ht.repl.toggle, opts)
 | 
					 | 
				
			||||||
                  vim.keymap.set('n', '<localleader>rf', function()
 | 
					 | 
				
			||||||
                    ht.repl.toggle(vim.api.nvim_buf_get_name(0))
 | 
					 | 
				
			||||||
                  end, opts)
 | 
					 | 
				
			||||||
                  vim.keymap.set('n', '<localleader>rq', ht.repl.quit, opts)
 | 
					 | 
				
			||||||
                end,
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
            ''}
 | 
					            ''}
 | 
				
			||||||
            ${optionalString cfg.dap.enable ''
 | 
					            ${optionalString cfg.dap.enable ''
 | 
				
			||||||
              dap = {
 | 
					              dap = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,22 +8,19 @@
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.meta) getExe;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.types) package bool enum;
 | 
					  inherit (lib.types) package bool enum listOf;
 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.hcl;
 | 
					  cfg = config.vim.languages.hcl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "terraform-ls";
 | 
					  defaultServers = ["terraform-ls"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    terraform-ls = {
 | 
					    terraform-ls = {
 | 
				
			||||||
      package = pkgs.terraform-ls;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.terraform-ls) "serve"];
 | 
				
			||||||
        lspconfig.terraformls.setup {
 | 
					      filetypes = ["terraform" "terraform-vars"];
 | 
				
			||||||
          capabilities = capabilities,
 | 
					      root_markers = [".terraform" ".git"];
 | 
				
			||||||
          on_attach=default_on_attach,
 | 
					 | 
				
			||||||
          cmd = {"${lib.getExe cfg.lsp.package}", "serve"},
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,12 +40,11 @@ in {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "HCL LSP support (terraform-ls)" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "HCL LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
      # TODO: (maybe, is it better?) it would be cooler to use vscode-extensions.hashicorp.hcl probably, shouldn't be too hard
 | 
					      servers = mkOption {
 | 
				
			||||||
      package = mkOption {
 | 
					        description = "HCL LSP server to use";
 | 
				
			||||||
        type = package;
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        default = servers.${defaultServer}.package;
 | 
					        default = defaultServers;
 | 
				
			||||||
        description = "HCL language server package (terraform-ls)";
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -96,10 +92,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources = lib.optionalAttrs (! config.vim.languages.terraform.lsp.enable) {
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
        terraform-ls = servers.${cfg.lsp.server}.lspConfig;
 | 
					          name = n;
 | 
				
			||||||
      };
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.format.enable {
 | 
					    (mkIf cfg.format.enable {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,44 +4,37 @@
 | 
				
			||||||
  lib,
 | 
					  lib,
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
}: let
 | 
					}: let
 | 
				
			||||||
  inherit (builtins) attrNames;
 | 
					  inherit (builtins) attrNames head;
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.types) enum either listOf package str;
 | 
					  inherit (lib.types) enum listOf;
 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.helm;
 | 
					  cfg = config.vim.languages.helm;
 | 
				
			||||||
  yamlCfg = config.vim.languages.yaml;
 | 
					  yamlCfg = config.vim.languages.yaml;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  helmCmd =
 | 
					  defaultServers = ["helm-ls"];
 | 
				
			||||||
    if isList cfg.lsp.package
 | 
					 | 
				
			||||||
    then cfg.lsp.package
 | 
					 | 
				
			||||||
    else ["${cfg.lsp.package}/bin/helm_ls" "serve"];
 | 
					 | 
				
			||||||
  yamlCmd =
 | 
					 | 
				
			||||||
    if isList yamlCfg.lsp.package
 | 
					 | 
				
			||||||
    then builtins.elemAt yamlCfg.lsp.package 0
 | 
					 | 
				
			||||||
    else "${yamlCfg.lsp.package}/bin/yaml-language-server";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  defaultServer = "helm-ls";
 | 
					 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    helm-ls = {
 | 
					    helm-ls = {
 | 
				
			||||||
      package = pkgs.helm-ls;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.helm-ls) "serve"];
 | 
				
			||||||
        lspconfig.helm_ls.setup {
 | 
					      filetypes = ["helm" "yaml.helm-values"];
 | 
				
			||||||
          capabilities = capabilities,
 | 
					      root_markers = ["Chart.yaml"];
 | 
				
			||||||
          on_attach = default_on_attach,
 | 
					      capabilities = {
 | 
				
			||||||
          cmd = ${expToLua helmCmd},
 | 
					        didChangeWatchedFiles = {
 | 
				
			||||||
          settings = {
 | 
					          dynamicRegistration = true;
 | 
				
			||||||
            ['helm-ls'] = {
 | 
					        };
 | 
				
			||||||
              yamlls = {
 | 
					      };
 | 
				
			||||||
                  path = "${yamlCmd}"
 | 
					      settings = {
 | 
				
			||||||
              }
 | 
					        helm-ls = {
 | 
				
			||||||
            }
 | 
					          yamlls = {
 | 
				
			||||||
          }
 | 
					            # TODO: Determine if this is a good enough solution
 | 
				
			||||||
        }
 | 
					            path = (head yamlCfg.lsp.servers).cmd;
 | 
				
			||||||
      '';
 | 
					          };
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
in {
 | 
					in {
 | 
				
			||||||
| 
						 | 
					@ -55,17 +48,10 @@ in {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Helm LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Helm LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					      servers = mkOption {
 | 
				
			||||||
      server = mkOption {
 | 
					 | 
				
			||||||
        description = "Helm LSP server to use";
 | 
					        description = "Helm LSP server to use";
 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        default = defaultServer;
 | 
					        default = defaultServers;
 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        description = "Helm LSP server package";
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -77,8 +63,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.helm-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,12 +7,59 @@
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.meta) getExe;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (builtins) attrNames;
 | 
				
			||||||
  inherit (lib.types) either listOf package str;
 | 
					  inherit (lib.types) listOf enum;
 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.dag) entryBefore;
 | 
				
			||||||
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.java;
 | 
					  cfg = config.vim.languages.java;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  defaultServers = ["jdtls"];
 | 
				
			||||||
 | 
					  servers = {
 | 
				
			||||||
 | 
					    jdtls = {
 | 
				
			||||||
 | 
					      enable = true;
 | 
				
			||||||
 | 
					      cmd =
 | 
				
			||||||
 | 
					        mkLuaInline
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					        lua
 | 
				
			||||||
 | 
					        */
 | 
				
			||||||
 | 
					        ''
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            '${getExe pkgs.jdt-language-server}',
 | 
				
			||||||
 | 
					            '-configuration',
 | 
				
			||||||
 | 
					            get_jdtls_config_dir(),
 | 
				
			||||||
 | 
					            '-data',
 | 
				
			||||||
 | 
					            get_jdtls_workspace_dir(),
 | 
				
			||||||
 | 
					            get_jdtls_jvm_args(),
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					      filetypes = ["java"];
 | 
				
			||||||
 | 
					      root_markers = [
 | 
				
			||||||
 | 
					        # Multi-module projects
 | 
				
			||||||
 | 
					        ".git"
 | 
				
			||||||
 | 
					        "build.gradle"
 | 
				
			||||||
 | 
					        "build.gradle.kts"
 | 
				
			||||||
 | 
					        # Single-module projects
 | 
				
			||||||
 | 
					        "build.xml" # Ant
 | 
				
			||||||
 | 
					        "pom.xml" # Maven
 | 
				
			||||||
 | 
					        "settings.gradle" # Gradle
 | 
				
			||||||
 | 
					        "settings.gradle.kts" # Gradle
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					      init_options = {
 | 
				
			||||||
 | 
					        workspace = mkLuaInline "get_jdtls_workspace_dir()";
 | 
				
			||||||
 | 
					        jvm_args = {};
 | 
				
			||||||
 | 
					        os_config = mkLuaInline "nil";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      handlers = {
 | 
				
			||||||
 | 
					        "textDocument/codeAction" = mkLuaInline "jdtls_on_textdocument_codeaction";
 | 
				
			||||||
 | 
					        "textDocument/rename" = mkLuaInline "jdtls_on_textdocument_rename";
 | 
				
			||||||
 | 
					        "workspace/applyEdit" = mkLuaInline "jdtls_on_workspace_applyedit";
 | 
				
			||||||
 | 
					        "language/status" = mkLuaInline "vim.schedule_wrap(jdtls_on_language_status)";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
in {
 | 
					in {
 | 
				
			||||||
  options.vim.languages.java = {
 | 
					  options.vim.languages.java = {
 | 
				
			||||||
    enable = mkEnableOption "Java language support";
 | 
					    enable = mkEnableOption "Java language support";
 | 
				
			||||||
| 
						 | 
					@ -23,30 +70,107 @@ in {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Java LSP support (java-language-server)" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Java LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
      package = mkOption {
 | 
					      servers = mkOption {
 | 
				
			||||||
        description = "java language server package, or the command to run as a list of strings";
 | 
					        description = "Java LSP server to use";
 | 
				
			||||||
        example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]'';
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        type = either package (listOf str);
 | 
					        default = defaultServers;
 | 
				
			||||||
        default = pkgs.jdt-language-server;
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  config = mkIf cfg.enable (mkMerge [
 | 
					  config = mkIf cfg.enable (mkMerge [
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.luaConfigRC.jdtls-util =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.jdtls = ''
 | 
					        entryBefore ["lsp-servers"]
 | 
				
			||||||
        lspconfig.jdtls.setup {
 | 
					        /*
 | 
				
			||||||
          capabilities = capabilities,
 | 
					        lua
 | 
				
			||||||
          on_attach = default_on_attach,
 | 
					        */
 | 
				
			||||||
          cmd = ${
 | 
					        ''
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					          local jdtls_handlers = require 'vim.lsp.handlers'
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					
 | 
				
			||||||
          else ''{"${getExe cfg.lsp.package}", "-data", vim.fn.stdpath("cache").."/jdtls/workspace"}''
 | 
					          local jdtls_env = {
 | 
				
			||||||
        },
 | 
					            HOME = vim.uv.os_homedir(),
 | 
				
			||||||
        }
 | 
					            XDG_CACHE_HOME = os.getenv 'XDG_CACHE_HOME',
 | 
				
			||||||
      '';
 | 
					            JDTLS_JVM_ARGS = os.getenv 'JDTLS_JVM_ARGS',
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          local function get_cache_dir()
 | 
				
			||||||
 | 
					            return jdtls_env.XDG_CACHE_HOME and jdtls_env.XDG_CACHE_HOME or jdtls_env.HOME .. '/.cache'
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          local function get_jdtls_cache_dir()
 | 
				
			||||||
 | 
					            return get_cache_dir() .. '/jdtls'
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          local function get_jdtls_config_dir()
 | 
				
			||||||
 | 
					            return get_jdtls_cache_dir() .. '/config'
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          local function get_jdtls_workspace_dir()
 | 
				
			||||||
 | 
					            return get_jdtls_cache_dir() .. '/workspace'
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          local function get_jdtls_jvm_args()
 | 
				
			||||||
 | 
					            local args = {}
 | 
				
			||||||
 | 
					            for a in string.gmatch((jdtls_env.JDTLS_JVM_ARGS or '''), '%S+') do
 | 
				
			||||||
 | 
					              local arg = string.format('--jvm-arg=%s', a)
 | 
				
			||||||
 | 
					              table.insert(args, arg)
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					            return unpack(args)
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          -- TextDocument version is reported as 0, override with nil so that
 | 
				
			||||||
 | 
					          -- the client doesn't think the document is newer and refuses to update
 | 
				
			||||||
 | 
					          -- See: https://github.com/eclipse/eclipse.jdt.ls/issues/1695
 | 
				
			||||||
 | 
					          local function jdtls_fix_zero_version(workspace_edit)
 | 
				
			||||||
 | 
					            if workspace_edit and workspace_edit.documentChanges then
 | 
				
			||||||
 | 
					              for _, change in pairs(workspace_edit.documentChanges) do
 | 
				
			||||||
 | 
					                local text_document = change.textDocument
 | 
				
			||||||
 | 
					                if text_document and text_document.version and text_document.version == 0 then
 | 
				
			||||||
 | 
					                  text_document.version = nil
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					            return workspace_edit
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          local function jdtls_on_textdocument_codeaction(err, actions, ctx)
 | 
				
			||||||
 | 
					            for _, action in ipairs(actions) do
 | 
				
			||||||
 | 
					              -- TODO: (steelsojka) Handle more than one edit?
 | 
				
			||||||
 | 
					              if action.command == 'java.apply.workspaceEdit' then -- 'action' is Command in java format
 | 
				
			||||||
 | 
					                action.edit = jdtls_fix_zero_version(action.edit or action.arguments[1])
 | 
				
			||||||
 | 
					              elseif type(action.command) == 'table' and action.command.command == 'java.apply.workspaceEdit' then -- 'action' is CodeAction in java format
 | 
				
			||||||
 | 
					                action.edit = jdtls_fix_zero_version(action.edit or action.command.arguments[1])
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            jdtls_handlers[ctx.method](err, actions, ctx)
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          local function jdtls_on_textdocument_rename(err, workspace_edit, ctx)
 | 
				
			||||||
 | 
					            jdtls_handlers[ctx.method](err, jdtls_fix_zero_version(workspace_edit), ctx)
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          local function jdtls_on_workspace_applyedit(err, workspace_edit, ctx)
 | 
				
			||||||
 | 
					            jdtls_handlers[ctx.method](err, jdtls_fix_zero_version(workspace_edit), ctx)
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          -- Non-standard notification that can be used to display progress
 | 
				
			||||||
 | 
					          local function jdtls_on_language_status(_, result)
 | 
				
			||||||
 | 
					            local command = vim.api.nvim_command
 | 
				
			||||||
 | 
					            command 'echohl ModeMsg'
 | 
				
			||||||
 | 
					            command(string.format('echo "%s"', result.message))
 | 
				
			||||||
 | 
					            command 'echohl None'
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      vim.lsp.servers =
 | 
				
			||||||
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.treesitter.enable {
 | 
					    (mkIf cfg.treesitter.enable {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,63 +4,82 @@
 | 
				
			||||||
  config,
 | 
					  config,
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
}: let
 | 
					}: let
 | 
				
			||||||
  inherit (builtins) attrNames isList;
 | 
					  inherit (builtins) attrNames;
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.types) either listOf package str enum bool nullOr;
 | 
					  inherit (lib.types) listOf enum;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.strings) optionalString;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.dag) entryBefore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "julials";
 | 
					  defaultServers = ["jdtls"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    julials = {
 | 
					    jdtls = {
 | 
				
			||||||
      package = pkgs.julia.withPackages ["LanguageServer"];
 | 
					      enable = true;
 | 
				
			||||||
      internalFormatter = true;
 | 
					      cmd =
 | 
				
			||||||
      lspConfig = ''
 | 
					        mkLuaInline
 | 
				
			||||||
        lspconfig.julials.setup {
 | 
					        /*
 | 
				
			||||||
          capabilities = capabilities,
 | 
					        lua
 | 
				
			||||||
          on_attach = default_on_attach,
 | 
					        */
 | 
				
			||||||
          cmd = ${
 | 
					        ''
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					          {
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					            '${getExe (pkgs.julia.withPackages ["LanguageServer"])}',
 | 
				
			||||||
          else ''
 | 
					            '--startup-file=no',
 | 
				
			||||||
            {
 | 
					            '--history-file=no',
 | 
				
			||||||
              "${optionalString (cfg.lsp.package != null) "${cfg.lsp.package}/bin/"}julia",
 | 
					            '-e',
 | 
				
			||||||
              "--startup-file=no",
 | 
					            [[
 | 
				
			||||||
              "--history-file=no",
 | 
					              # Load LanguageServer.jl: attempt to load from ~/.julia/environments/nvim-lspconfig
 | 
				
			||||||
              "--eval",
 | 
					              # with the regular load path as a fallback
 | 
				
			||||||
              [[
 | 
					              ls_install_path = joinpath(
 | 
				
			||||||
                using LanguageServer
 | 
					                  get(DEPOT_PATH, 1, joinpath(homedir(), ".julia")),
 | 
				
			||||||
 | 
					                  "environments", "nvim-lspconfig"
 | 
				
			||||||
                depot_path = get(ENV, "JULIA_DEPOT_PATH", "")
 | 
					              )
 | 
				
			||||||
                project_path = let
 | 
					              pushfirst!(LOAD_PATH, ls_install_path)
 | 
				
			||||||
                    dirname(something(
 | 
					              using LanguageServer
 | 
				
			||||||
                        ## 1. Finds an explicitly set project (JULIA_PROJECT)
 | 
					              popfirst!(LOAD_PATH)
 | 
				
			||||||
                        Base.load_path_expand((
 | 
					              depot_path = get(ENV, "JULIA_DEPOT_PATH", "")
 | 
				
			||||||
                            p = get(ENV, "JULIA_PROJECT", nothing);
 | 
					              project_path = let
 | 
				
			||||||
                            p === nothing ? nothing : isempty(p) ? nothing : p
 | 
					                  dirname(something(
 | 
				
			||||||
                        )),
 | 
					                      ## 1. Finds an explicitly set project (JULIA_PROJECT)
 | 
				
			||||||
                        ## 2. Look for a Project.toml file in the current working directory,
 | 
					                      Base.load_path_expand((
 | 
				
			||||||
                        ##    or parent directories, with $HOME as an upper boundary
 | 
					                          p = get(ENV, "JULIA_PROJECT", nothing);
 | 
				
			||||||
                        Base.current_project(),
 | 
					                          p === nothing ? nothing : isempty(p) ? nothing : p
 | 
				
			||||||
                        ## 3. First entry in the load path
 | 
					                      )),
 | 
				
			||||||
                        get(Base.load_path(), 1, nothing),
 | 
					                      ## 2. Look for a Project.toml file in the current working directory,
 | 
				
			||||||
                        ## 4. Fallback to default global environment,
 | 
					                      ##    or parent directories, with $HOME as an upper boundary
 | 
				
			||||||
                        ##    this is more or less unreachable
 | 
					                      Base.current_project(),
 | 
				
			||||||
                        Base.load_path_expand("@v#.#"),
 | 
					                      ## 3. First entry in the load path
 | 
				
			||||||
                    ))
 | 
					                      get(Base.load_path(), 1, nothing),
 | 
				
			||||||
                end
 | 
					                      ## 4. Fallback to default global environment,
 | 
				
			||||||
                @info "Running language server" VERSION pwd() project_path depot_path
 | 
					                      ##    this is more or less unreachable
 | 
				
			||||||
                server = LanguageServer.LanguageServerInstance(stdin, stdout, project_path, depot_path)
 | 
					                      Base.load_path_expand("@v#.#"),
 | 
				
			||||||
                server.runlinter = true
 | 
					                  ))
 | 
				
			||||||
                run(server)
 | 
					              end
 | 
				
			||||||
              ]]
 | 
					              @info "Running language server" VERSION pwd() project_path depot_path
 | 
				
			||||||
            }
 | 
					              server = LanguageServer.LanguageServerInstance(stdin, stdout, project_path, depot_path)
 | 
				
			||||||
          ''
 | 
					              server.runlinter = true
 | 
				
			||||||
        }
 | 
					              run(server)
 | 
				
			||||||
        }
 | 
					            ]],
 | 
				
			||||||
      '';
 | 
					          }
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					      filetypes = ["julia"];
 | 
				
			||||||
 | 
					      root_markers = ["Project.toml" "JuliaProject.toml"];
 | 
				
			||||||
 | 
					      on_attach =
 | 
				
			||||||
 | 
					        mkLuaInline
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					        lua
 | 
				
			||||||
 | 
					        */
 | 
				
			||||||
 | 
					        ''
 | 
				
			||||||
 | 
					          function(_, bufnr)
 | 
				
			||||||
 | 
					              vim.api.nvim_buf_create_user_command(bufnr, 'LspJuliaActivateEnv', activate_julia_env, {
 | 
				
			||||||
 | 
					                desc = 'Activate a Julia environment',
 | 
				
			||||||
 | 
					                nargs = '?',
 | 
				
			||||||
 | 
					                complete = 'file',
 | 
				
			||||||
 | 
					              })
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -76,11 +95,10 @@ in {
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      lsp = {
 | 
					      lsp = {
 | 
				
			||||||
        enable = mkOption {
 | 
					        enable = mkEnableOption "Java LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
          type = bool;
 | 
					        servers = mkOption {
 | 
				
			||||||
          default = config.vim.lsp.enable;
 | 
					 | 
				
			||||||
          description = ''
 | 
					          description = ''
 | 
				
			||||||
            Whether to enable Julia LSP support.
 | 
					            Julia LSP Server to Use
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ::: {.note}
 | 
					            ::: {.note}
 | 
				
			||||||
            The entirety of Julia is bundled with nvf, if you enable this
 | 
					            The entirety of Julia is bundled with nvf, if you enable this
 | 
				
			||||||
| 
						 | 
					@ -92,21 +110,8 @@ in {
 | 
				
			||||||
            Julia in your devshells.
 | 
					            Julia in your devshells.
 | 
				
			||||||
            :::
 | 
					            :::
 | 
				
			||||||
          '';
 | 
					          '';
 | 
				
			||||||
        };
 | 
					          type = listOf (enum (attrNames servers));
 | 
				
			||||||
 | 
					          default = defaultServers;
 | 
				
			||||||
        server = mkOption {
 | 
					 | 
				
			||||||
          type = enum (attrNames servers);
 | 
					 | 
				
			||||||
          default = defaultServer;
 | 
					 | 
				
			||||||
          description = "Julia LSP server to use";
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        package = mkOption {
 | 
					 | 
				
			||||||
          description = ''
 | 
					 | 
				
			||||||
            Julia LSP server package, `null` to use the Julia binary in {env}`PATH`, or
 | 
					 | 
				
			||||||
            the command to run as a list of strings.
 | 
					 | 
				
			||||||
          '';
 | 
					 | 
				
			||||||
          type = nullOr (either package (listOf str));
 | 
					 | 
				
			||||||
          default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
| 
						 | 
					@ -119,8 +124,70 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.luaConfigRC.julia-util =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.julia-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        entryBefore ["lsp-servers"]
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					        lua
 | 
				
			||||||
 | 
					        */
 | 
				
			||||||
 | 
					        ''
 | 
				
			||||||
 | 
					          local function activate_julia_env(path)
 | 
				
			||||||
 | 
					            assert(vim.fn.has 'nvim-0.10' == 1, 'requires Nvim 0.10 or newer')
 | 
				
			||||||
 | 
					            local bufnr = vim.api.nvim_get_current_buf()
 | 
				
			||||||
 | 
					            local julials_clients = vim.lsp.get_clients { bufnr = bufnr, name = 'julials' }
 | 
				
			||||||
 | 
					            assert(
 | 
				
			||||||
 | 
					              #julials_clients > 0,
 | 
				
			||||||
 | 
					              'method julia/activateenvironment is not supported by any servers active on the current buffer'
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            local function _activate_env(environment)
 | 
				
			||||||
 | 
					              if environment then
 | 
				
			||||||
 | 
					                for _, julials_client in ipairs(julials_clients) do
 | 
				
			||||||
 | 
					                  julials_client:notify('julia/activateenvironment', { envPath = environment })
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					                vim.notify('Julia environment activated: \n`' .. environment .. '`', vim.log.levels.INFO)
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					            if path then
 | 
				
			||||||
 | 
					              path = vim.fs.normalize(vim.fn.fnamemodify(vim.fn.expand(path), ':p'))
 | 
				
			||||||
 | 
					              local found_env = false
 | 
				
			||||||
 | 
					              for _, project_file in ipairs(root_files) do
 | 
				
			||||||
 | 
					                local file = vim.uv.fs_stat(vim.fs.joinpath(path, project_file))
 | 
				
			||||||
 | 
					                if file and file.type then
 | 
				
			||||||
 | 
					                  found_env = true
 | 
				
			||||||
 | 
					                  break
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					              if not found_env then
 | 
				
			||||||
 | 
					                vim.notify('Path is not a julia environment: \n`' .. path .. '`', vim.log.levels.WARN)
 | 
				
			||||||
 | 
					                return
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					              _activate_env(path)
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					              local depot_paths = vim.env.JULIA_DEPOT_PATH
 | 
				
			||||||
 | 
					                  and vim.split(vim.env.JULIA_DEPOT_PATH, vim.fn.has 'win32' == 1 and ';' or ':')
 | 
				
			||||||
 | 
					                or { vim.fn.expand '~/.julia' }
 | 
				
			||||||
 | 
					              local environments = {}
 | 
				
			||||||
 | 
					              vim.list_extend(environments, vim.fs.find(root_files, { type = 'file', upward = true, limit = math.huge }))
 | 
				
			||||||
 | 
					              for _, depot_path in ipairs(depot_paths) do
 | 
				
			||||||
 | 
					                local depot_env = vim.fs.joinpath(vim.fs.normalize(depot_path), 'environments')
 | 
				
			||||||
 | 
					                vim.list_extend(
 | 
				
			||||||
 | 
					                  environments,
 | 
				
			||||||
 | 
					                  vim.fs.find(function(name, env_path)
 | 
				
			||||||
 | 
					                    return vim.tbl_contains(root_files, name) and string.sub(env_path, #depot_env + 1):match '^/[^/]*$'
 | 
				
			||||||
 | 
					                  end, { path = depot_env, type = 'file', limit = math.huge })
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					              environments = vim.tbl_map(vim.fs.dirname, environments)
 | 
				
			||||||
 | 
					              vim.ui.select(environments, { prompt = 'Select a Julia environment' }, _activate_env)
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      vim.lsp.servers =
 | 
				
			||||||
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,16 +4,47 @@
 | 
				
			||||||
  lib,
 | 
					  lib,
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
}: let
 | 
					}: let
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption literalExpression;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.meta) getExe;
 | 
					  inherit (lib.meta) getExe' getExe;
 | 
				
			||||||
  inherit (lib.types) either package listOf str;
 | 
					  inherit (builtins) attrNames;
 | 
				
			||||||
 | 
					  inherit (lib.types) enum listOf;
 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption diagnostics;
 | 
					  inherit (lib.nvim.types) mkGrammarOption diagnostics;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.kotlin;
 | 
					  cfg = config.vim.languages.kotlin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  defaultServers = ["kotlin-language-server"];
 | 
				
			||||||
 | 
					  servers = {
 | 
				
			||||||
 | 
					    kotlin-language-server = {
 | 
				
			||||||
 | 
					      enable = true;
 | 
				
			||||||
 | 
					      cmd = [(getExe' pkgs.kotlin-language-server "kotlin-language-server")];
 | 
				
			||||||
 | 
					      filetypes = ["kotlin"];
 | 
				
			||||||
 | 
					      root_markers = [
 | 
				
			||||||
 | 
					        "settings.gradle" # Gradle (multi-project)
 | 
				
			||||||
 | 
					        "settings.gradle.kts" # Gradle (multi-project)
 | 
				
			||||||
 | 
					        "build.xml" # Ant
 | 
				
			||||||
 | 
					        "pom.xml" # Maven
 | 
				
			||||||
 | 
					        "build.gradle" # Gradle
 | 
				
			||||||
 | 
					        "build.gradle.kts" # gradle
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					      init_options = {
 | 
				
			||||||
 | 
					        storagePath = mkLuaInline "
 | 
				
			||||||
 | 
					        vim.fs.root(vim.fn.expand '%:p:h',
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            'settings.gradle', -- Gradle (multi-project)
 | 
				
			||||||
 | 
					            'settings.gradle.kts', -- Gradle (multi-project)
 | 
				
			||||||
 | 
					            'build.xml', -- Ant
 | 
				
			||||||
 | 
					            'pom.xml', -- Maven
 | 
				
			||||||
 | 
					            'build.gradle', -- Gradle
 | 
				
			||||||
 | 
					            'build.gradle.kts', -- Gradle
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        )";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultDiagnosticsProvider = ["ktlint"];
 | 
					  defaultDiagnosticsProvider = ["ktlint"];
 | 
				
			||||||
  diagnosticsProviders = {
 | 
					  diagnosticsProviders = {
 | 
				
			||||||
    ktlint = {
 | 
					    ktlint = {
 | 
				
			||||||
| 
						 | 
					@ -31,22 +62,10 @@ in {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Kotlin LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Kotlin LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					      servers = mkOption {
 | 
				
			||||||
      package = mkOption {
 | 
					        description = "Kotlin LSP server to use";
 | 
				
			||||||
        description = "kotlin_language_server package with Kotlin runtime";
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        type = either package (listOf str);
 | 
					        default = defaultServers;
 | 
				
			||||||
        example = literalExpression ''
 | 
					 | 
				
			||||||
          pkgs.symlinkJoin {
 | 
					 | 
				
			||||||
            name = "kotlin-language-server-wrapped";
 | 
					 | 
				
			||||||
            paths = [pkgs.kotlin-language-server];
 | 
					 | 
				
			||||||
            nativeBuildInputs = [pkgs.makeBinaryWrapper];
 | 
					 | 
				
			||||||
            postBuild = '''
 | 
					 | 
				
			||||||
              wrapProgram $out/bin/kotlin-language-server \
 | 
					 | 
				
			||||||
                --prefix PATH : ''${pkgs.kotlin}/bin
 | 
					 | 
				
			||||||
            ''';
 | 
					 | 
				
			||||||
          };
 | 
					 | 
				
			||||||
        '';
 | 
					 | 
				
			||||||
        default = pkgs.kotlin-language-server;
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -78,23 +97,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.kotlin_language_server = ''
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
        lspconfig.kotlin_language_server.setup {
 | 
					          name = n;
 | 
				
			||||||
          capabilities = capabilities,
 | 
					          value = servers.${n};
 | 
				
			||||||
          root_dir = lspconfig.util.root_pattern("main.kt", ".git"),
 | 
					        })
 | 
				
			||||||
          on_attach=default_on_attach,
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
          init_options = {
 | 
					 | 
				
			||||||
          -- speeds up the startup time for the LSP
 | 
					 | 
				
			||||||
            storagePath = vim.fn.stdpath('state') .. '/kotlin',
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          cmd = ${
 | 
					 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					 | 
				
			||||||
          else ''{"${cfg.lsp.package}/bin/kotlin-language-server"}''
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,13 +8,32 @@
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.meta) getExe;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.types) bool enum listOf package;
 | 
				
			||||||
  inherit (lib.types) bool either enum listOf package str;
 | 
					 | 
				
			||||||
  inherit (lib.nvim.types) diagnostics mkGrammarOption;
 | 
					  inherit (lib.nvim.types) diagnostics mkGrammarOption;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					 | 
				
			||||||
  inherit (lib.nvim.dag) entryBefore;
 | 
					  inherit (lib.nvim.dag) entryBefore;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.lua;
 | 
					  cfg = config.vim.languages.lua;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  defaultServers = ["lua-language-server"];
 | 
				
			||||||
 | 
					  servers = {
 | 
				
			||||||
 | 
					    lua-language-server = {
 | 
				
			||||||
 | 
					      enable = true;
 | 
				
			||||||
 | 
					      cmd = [(getExe pkgs.lua-language-server)];
 | 
				
			||||||
 | 
					      filetypes = ["lua"];
 | 
				
			||||||
 | 
					      root_markers = [
 | 
				
			||||||
 | 
					        ".luarc.json"
 | 
				
			||||||
 | 
					        ".luarc.jsonc"
 | 
				
			||||||
 | 
					        ".luacheckrc"
 | 
				
			||||||
 | 
					        ".stylua.toml"
 | 
				
			||||||
 | 
					        "stylua.toml"
 | 
				
			||||||
 | 
					        "selene.toml"
 | 
				
			||||||
 | 
					        "selene.yml"
 | 
				
			||||||
 | 
					        ".git"
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultFormat = "stylua";
 | 
					  defaultFormat = "stylua";
 | 
				
			||||||
  formats = {
 | 
					  formats = {
 | 
				
			||||||
    stylua = {
 | 
					    stylua = {
 | 
				
			||||||
| 
						 | 
					@ -43,12 +62,11 @@ in {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Lua LSP support via LuaLS" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Lua LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					      servers = mkOption {
 | 
				
			||||||
      package = mkOption {
 | 
					        description = "Lua LSP server to use";
 | 
				
			||||||
        description = "LuaLS package, or the command to run as a list of strings";
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        type = either package (listOf str);
 | 
					        default = defaultServers;
 | 
				
			||||||
        default = pkgs.lua-language-server;
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      lazydev.enable = mkEnableOption "lazydev.nvim integration, useful for neovim plugin developers";
 | 
					      lazydev.enable = mkEnableOption "lazydev.nvim integration, useful for neovim plugin developers";
 | 
				
			||||||
| 
						 | 
					@ -91,23 +109,17 @@ in {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.enable (mkMerge [
 | 
					    (mkIf cfg.enable (mkMerge [
 | 
				
			||||||
      (mkIf cfg.lsp.enable {
 | 
					      (mkIf cfg.lsp.enable {
 | 
				
			||||||
        vim.lsp.lspconfig.enable = true;
 | 
					        vim.lsp.servers =
 | 
				
			||||||
        vim.lsp.lspconfig.sources.lua-lsp = ''
 | 
					          mapListToAttrs (n: {
 | 
				
			||||||
          lspconfig.lua_ls.setup {
 | 
					            name = n;
 | 
				
			||||||
            capabilities = capabilities;
 | 
					            value = servers.${n};
 | 
				
			||||||
            on_attach = default_on_attach;
 | 
					          })
 | 
				
			||||||
            cmd = ${
 | 
					          cfg.lsp.servers;
 | 
				
			||||||
            if isList cfg.lsp.package
 | 
					 | 
				
			||||||
            then expToLua cfg.lsp.package
 | 
					 | 
				
			||||||
            else ''{"${getExe cfg.lsp.package}"}''
 | 
					 | 
				
			||||||
          };
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        '';
 | 
					 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (mkIf cfg.lsp.lazydev.enable {
 | 
					      (mkIf cfg.lsp.lazydev.enable {
 | 
				
			||||||
        vim.startPlugins = ["lazydev-nvim"];
 | 
					        vim.startPlugins = ["lazydev-nvim"];
 | 
				
			||||||
        vim.pluginRC.lazydev = entryBefore ["lua-lsp"] ''
 | 
					        vim.pluginRC.lazydev = entryBefore ["lsp-servers"] ''
 | 
				
			||||||
          require("lazydev").setup({
 | 
					          require("lazydev").setup({
 | 
				
			||||||
            enabled = function(root_dir)
 | 
					            enabled = function(root_dir)
 | 
				
			||||||
              return not vim.uv.fs_stat(root_dir .. "/.luarc.json")
 | 
					              return not vim.uv.fs_stat(root_dir .. "/.luarc.json")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,28 +8,20 @@
 | 
				
			||||||
  inherit (lib.meta) getExe;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.types) bool enum package listOf str nullOr;
 | 
				
			||||||
  inherit (lib.types) bool enum either package listOf str nullOr;
 | 
					  inherit (lib.nvim.lua) toLuaObject;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua toLuaObject;
 | 
					 | 
				
			||||||
  inherit (lib.nvim.types) diagnostics mkGrammarOption mkPluginSetupOption;
 | 
					  inherit (lib.nvim.types) diagnostics mkGrammarOption mkPluginSetupOption;
 | 
				
			||||||
  inherit (lib.nvim.dag) entryAnywhere;
 | 
					  inherit (lib.nvim.dag) entryAnywhere;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.markdown;
 | 
					  cfg = config.vim.languages.markdown;
 | 
				
			||||||
  defaultServer = "marksman";
 | 
					  defaultServers = ["marksman"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    marksman = {
 | 
					    marksman = {
 | 
				
			||||||
      package = pkgs.marksman;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.marksman) "server"];
 | 
				
			||||||
        lspconfig.marksman.setup{
 | 
					      filetypes = ["markdown" "markdown.mdx"];
 | 
				
			||||||
          capabilities = capabilities;
 | 
					      root_markers = [".marksman.toml" ".git"];
 | 
				
			||||||
          on_attach = default_on_attach;
 | 
					 | 
				
			||||||
          cmd = ${
 | 
					 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					 | 
				
			||||||
          else ''{"${cfg.lsp.package}/bin/marksman", "server"}''
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,19 +59,12 @@ in {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Enable Markdown LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Markdown LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      server = mkOption {
 | 
					      servers = mkOption {
 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					 | 
				
			||||||
        default = defaultServer;
 | 
					 | 
				
			||||||
        description = "Markdown LSP server to use";
 | 
					        description = "Markdown LSP server to use";
 | 
				
			||||||
      };
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
 | 
					        default = defaultServers;
 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
        example = ''[lib.getExe pkgs.jdt-language-server " - data " " ~/.cache/jdtls/workspace "]'';
 | 
					 | 
				
			||||||
        description = "Markdown LSP server package, or the command to run as a list of strings";
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -161,8 +146,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.markdown-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.format.enable {
 | 
					    (mkIf cfg.format.enable {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,31 +6,34 @@
 | 
				
			||||||
}: let
 | 
					}: let
 | 
				
			||||||
  inherit (builtins) attrNames;
 | 
					  inherit (builtins) attrNames;
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
 | 
					  inherit (lib.meta) getExe';
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.types) enum listOf package;
 | 
				
			||||||
  inherit (lib.types) enum either listOf package str;
 | 
					 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.nim;
 | 
					  cfg = config.vim.languages.nim;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "nimlsp";
 | 
					  defaultServers = ["nimlsp"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    nimlsp = {
 | 
					    nimlsp = {
 | 
				
			||||||
      package = pkgs.nimlsp;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe' pkgs.nimlsp "nimlsp")];
 | 
				
			||||||
        lspconfig.nimls.setup{
 | 
					      filetypes = ["nim"];
 | 
				
			||||||
          capabilities = capabilities;
 | 
					      root_dir =
 | 
				
			||||||
          on_attach = default_on_attach;
 | 
					        mkLuaInline
 | 
				
			||||||
          cmd = ${
 | 
					        /*
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					        lua
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					        */
 | 
				
			||||||
          else ''
 | 
					        ''
 | 
				
			||||||
            {"${cfg.lsp.package}/bin/nimlsp"}
 | 
					          function(bufnr, on_dir)
 | 
				
			||||||
          ''
 | 
					              local fname = vim.api.nvim_buf_get_name(bufnr)
 | 
				
			||||||
        };
 | 
					              on_dir(
 | 
				
			||||||
        }
 | 
					                util.root_pattern '*.nimble'(fname) or vim.fs.dirname(vim.fs.find('.git', { path = fname, upward = true })[1])
 | 
				
			||||||
      '';
 | 
					              )
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,17 +57,11 @@ in {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Nim LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Nim LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
      server = mkOption {
 | 
					 | 
				
			||||||
        description = "Nim LSP server to use";
 | 
					 | 
				
			||||||
        type = str;
 | 
					 | 
				
			||||||
        default = defaultServer;
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      package = mkOption {
 | 
					      servers = mkOption {
 | 
				
			||||||
        description = "Nim LSP server package, or the command to run as a list of strings";
 | 
					        description = "Nim LSP server to use";
 | 
				
			||||||
        example = ''[lib.getExe pkgs.nimlsp]'';
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        type = either package (listOf str);
 | 
					        default = defaultServers;
 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -100,8 +97,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.nim-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.format.enable {
 | 
					    (mkIf cfg.format.enable {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,90 +9,43 @@
 | 
				
			||||||
  inherit (lib.meta) getExe;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.types) enum package listOf;
 | 
				
			||||||
  inherit (lib.strings) optionalString;
 | 
					 | 
				
			||||||
  inherit (lib.types) anything attrsOf enum either listOf nullOr package str;
 | 
					 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption diagnostics;
 | 
					  inherit (lib.nvim.types) mkGrammarOption diagnostics;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua toLuaObject;
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.nix;
 | 
					  cfg = config.vim.languages.nix;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useFormat = "on_attach = default_on_attach";
 | 
					  formattingCmd = mkIf (cfg.format.enable && cfg.lsp.enable) {
 | 
				
			||||||
  noFormat = "on_attach = attach_keymaps";
 | 
					    formatting = mkMerge [
 | 
				
			||||||
 | 
					      (mkIf (cfg.format.type == "alejandra") {
 | 
				
			||||||
 | 
					        command = ["${cfg.format.package}/bin/alejandra" "--quiet"];
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      (mkIf (cfg.format.type == "nixfmt") {
 | 
				
			||||||
 | 
					        command = ["${cfg.format.package}/bin/nixfmt"];
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "nil";
 | 
					  defaultServers = ["nil"];
 | 
				
			||||||
  packageToCmd = package: defaultCmd:
 | 
					 | 
				
			||||||
    if isList package
 | 
					 | 
				
			||||||
    then expToLua package
 | 
					 | 
				
			||||||
    else ''{"${package}/bin/${defaultCmd}"}'';
 | 
					 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    nil = {
 | 
					    nil = {
 | 
				
			||||||
      package = pkgs.nil;
 | 
					      enable = true;
 | 
				
			||||||
      internalFormatter = true;
 | 
					      cmd = [(getExe pkgs.nil)];
 | 
				
			||||||
      lspConfig = ''
 | 
					      settings = {
 | 
				
			||||||
        lspconfig.nil_ls.setup{
 | 
					        nil = formattingCmd;
 | 
				
			||||||
          capabilities = capabilities,
 | 
					      };
 | 
				
			||||||
        ${
 | 
					      filetypes = ["nix"];
 | 
				
			||||||
          if cfg.format.enable
 | 
					      root_markers = [".git" "flake.nix"];
 | 
				
			||||||
          then useFormat
 | 
					 | 
				
			||||||
          else noFormat
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
          cmd = ${packageToCmd cfg.lsp.package "nil"},
 | 
					 | 
				
			||||||
        ${optionalString cfg.format.enable ''
 | 
					 | 
				
			||||||
          settings = {
 | 
					 | 
				
			||||||
            ["nil"] = {
 | 
					 | 
				
			||||||
          ${optionalString (cfg.format.type == "alejandra")
 | 
					 | 
				
			||||||
            ''
 | 
					 | 
				
			||||||
              formatting = {
 | 
					 | 
				
			||||||
                command = {"${cfg.format.package}/bin/alejandra", "--quiet"},
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
            ''}
 | 
					 | 
				
			||||||
          ${optionalString (cfg.format.type == "nixfmt")
 | 
					 | 
				
			||||||
            ''
 | 
					 | 
				
			||||||
              formatting = {
 | 
					 | 
				
			||||||
                command = {"${cfg.format.package}/bin/nixfmt"},
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
            ''}
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
        ''}
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    nixd = {
 | 
					    nixd = {
 | 
				
			||||||
      package = pkgs.nixd;
 | 
					      enable = true;
 | 
				
			||||||
      internalFormatter = true;
 | 
					      cmd = [(getExe pkgs.nixd)];
 | 
				
			||||||
      lspConfig = ''
 | 
					      settings = {
 | 
				
			||||||
        lspconfig.nixd.setup{
 | 
					        nixd = formattingCmd;
 | 
				
			||||||
          capabilities = capabilities,
 | 
					      };
 | 
				
			||||||
        ${
 | 
					      filetypes = ["nix"];
 | 
				
			||||||
          if cfg.format.enable
 | 
					      root_markers = [".git" "flake.nix"];
 | 
				
			||||||
          then useFormat
 | 
					 | 
				
			||||||
          else noFormat
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
          cmd = ${packageToCmd cfg.lsp.package "nixd"},
 | 
					 | 
				
			||||||
        ${optionalString cfg.format.enable ''
 | 
					 | 
				
			||||||
          settings = {
 | 
					 | 
				
			||||||
            nixd = {
 | 
					 | 
				
			||||||
          ${optionalString (cfg.format.type == "alejandra")
 | 
					 | 
				
			||||||
            ''
 | 
					 | 
				
			||||||
              formatting = {
 | 
					 | 
				
			||||||
                command = {"${cfg.format.package}/bin/alejandra", "--quiet"},
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
            ''}
 | 
					 | 
				
			||||||
          ${optionalString (cfg.format.type == "nixfmt")
 | 
					 | 
				
			||||||
            ''
 | 
					 | 
				
			||||||
              formatting = {
 | 
					 | 
				
			||||||
                command = {"${cfg.format.package}/bin/nixfmt"},
 | 
					 | 
				
			||||||
              },
 | 
					 | 
				
			||||||
            ''}
 | 
					 | 
				
			||||||
          options = ${toLuaObject cfg.lsp.options},
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
        ''}
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -144,23 +97,10 @@ in {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Nix LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Nix LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
      server = mkOption {
 | 
					      servers = mkOption {
 | 
				
			||||||
        description = "Nix LSP server to use";
 | 
					        description = "Nix LSP server to use";
 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        default = defaultServer;
 | 
					        default = defaultServers;
 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        description = "Nix LSP server package, or the command to run as a list of strings";
 | 
					 | 
				
			||||||
        example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]'';
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      options = mkOption {
 | 
					 | 
				
			||||||
        type = nullOr (attrsOf anything);
 | 
					 | 
				
			||||||
        default = null;
 | 
					 | 
				
			||||||
        description = "Options to pass to nixd LSP server";
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -201,13 +141,6 @@ in {
 | 
				
			||||||
            ${concatStringsSep ", " (attrNames formats)}
 | 
					            ${concatStringsSep ", " (attrNames formats)}
 | 
				
			||||||
          '';
 | 
					          '';
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          assertion = cfg.lsp.server != "rnix";
 | 
					 | 
				
			||||||
          message = ''
 | 
					 | 
				
			||||||
            rnix-lsp has been archived upstream. Please use one of the following available language servers:
 | 
					 | 
				
			||||||
            ${concatStringsSep ", " (attrNames servers)}
 | 
					 | 
				
			||||||
          '';
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      ];
 | 
					      ];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -217,11 +150,15 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.nix-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf (cfg.format.enable && (!cfg.lsp.enable || !servers.${cfg.lsp.server}.internalFormatter)) {
 | 
					    (mkIf (cfg.format.enable && !cfg.lsp.enable) {
 | 
				
			||||||
      vim.formatter.conform-nvim = {
 | 
					      vim.formatter.conform-nvim = {
 | 
				
			||||||
        enable = true;
 | 
					        enable = true;
 | 
				
			||||||
        setupOpts.formatters_by_ft.nix = [cfg.format.type];
 | 
					        setupOpts.formatters_by_ft.nix = [cfg.format.type];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,27 +5,30 @@
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
}: let
 | 
					}: let
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.types) str either package listOf;
 | 
					  inherit (lib.types) enum listOf;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
  inherit (builtins) isList;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					  inherit (builtins) attrNames;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "nushell";
 | 
					  defaultServers = ["nushell"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    nushell = {
 | 
					    nushell = {
 | 
				
			||||||
      package = pkgs.nushell;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.nushell) "--no-config-file" "--lsp"];
 | 
				
			||||||
        lspconfig.nushell.setup{
 | 
					      filetypes = ["nu"];
 | 
				
			||||||
          capabilities = capabilities,
 | 
					      root_dir =
 | 
				
			||||||
          on_attach = default_on_attach,
 | 
					        mkLuaInline
 | 
				
			||||||
          cmd = ${
 | 
					        /*
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					        lua
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					        */
 | 
				
			||||||
          else ''{"${cfg.lsp.package}/bin/nu", "--no-config-file", "--lsp"}''
 | 
					        ''
 | 
				
			||||||
        }
 | 
					          function(bufnr, on_dir)
 | 
				
			||||||
        }
 | 
					            on_dir(vim.fs.root(bufnr, { '.git' }) or vim.fs.dirname(vim.api.nvim_buf_get_name(bufnr)))
 | 
				
			||||||
      '';
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,17 +44,11 @@ in {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Nu LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Nu LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
      server = mkOption {
 | 
					 | 
				
			||||||
        type = str;
 | 
					 | 
				
			||||||
        default = defaultServer;
 | 
					 | 
				
			||||||
        description = "Nu LSP server to use";
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      package = mkOption {
 | 
					      servers = mkOption {
 | 
				
			||||||
        type = either package (listOf str);
 | 
					        description = "Nu LSP server to use";
 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        example = ''[(lib.getExe pkgs.nushell) "--lsp"]'';
 | 
					        default = defaultServers;
 | 
				
			||||||
        description = "Nu LSP server package, or the command to run as a list of strings";
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -63,8 +60,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.nu-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,28 +8,50 @@
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.meta) getExe;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.types) enum listOf package;
 | 
				
			||||||
  inherit (lib.types) either enum listOf package str;
 | 
					 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.ocaml;
 | 
					  cfg = config.vim.languages.ocaml;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "ocaml-lsp";
 | 
					  defaultServers = ["ocaml-lsp"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    ocaml-lsp = {
 | 
					    ocaml-lsp = {
 | 
				
			||||||
      package = pkgs.ocamlPackages.ocaml-lsp;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.ocamlPackages.ocaml-lsp)];
 | 
				
			||||||
        lspconfig.ocamllsp.setup {
 | 
					      filetypes = ["ocaml" "menhir" "ocamlinterface" "ocamllex" "reason" "dune"];
 | 
				
			||||||
          capabilities = capabilities,
 | 
					      root_dir =
 | 
				
			||||||
          on_attach = default_on_attach,
 | 
					        mkLuaInline
 | 
				
			||||||
            cmd = ${
 | 
					        /*
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					        lua
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					        */
 | 
				
			||||||
          else ''{"${getExe cfg.lsp.package}"}''
 | 
					        ''
 | 
				
			||||||
        };
 | 
					          function(bufnr, on_dir)
 | 
				
			||||||
        }
 | 
					            local fname = vim.api.nvim_buf_get_name(bufnr)
 | 
				
			||||||
      '';
 | 
					            on_dir(util.root_pattern('*.opam', 'esy.json', 'package.json', '.git', 'dune-project', 'dune-workspace')(fname))
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					      get_language_id =
 | 
				
			||||||
 | 
					        mkLuaInline
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					        lua
 | 
				
			||||||
 | 
					        */
 | 
				
			||||||
 | 
					        ''
 | 
				
			||||||
 | 
					          function(_, ftype)
 | 
				
			||||||
 | 
					            local language_id_of = {
 | 
				
			||||||
 | 
					              menhir = 'ocaml.menhir',
 | 
				
			||||||
 | 
					              ocaml = 'ocaml',
 | 
				
			||||||
 | 
					              ocamlinterface = 'ocaml.interface',
 | 
				
			||||||
 | 
					              ocamllex = 'ocaml.ocamllex',
 | 
				
			||||||
 | 
					              reason = 'reason',
 | 
				
			||||||
 | 
					              dune = 'dune',
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return language_id_of[ftype]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,16 +71,12 @@ in {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "OCaml LSP support (ocaml-lsp)" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "OCaml LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
      server = mkOption {
 | 
					
 | 
				
			||||||
        description = "OCaml LSP server to user";
 | 
					      servers = mkOption {
 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					        description = "OCaml LSP server to use";
 | 
				
			||||||
        default = defaultServer;
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
      };
 | 
					        default = defaultServers;
 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        description = "OCaml language server package, or the command to run as a list of strings";
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -79,8 +97,12 @@ in {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  config = mkIf cfg.enable (mkMerge [
 | 
					  config = mkIf cfg.enable (mkMerge [
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.ocaml-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.treesitter.enable {
 | 
					    (mkIf cfg.treesitter.enable {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,26 +7,28 @@
 | 
				
			||||||
  inherit (builtins) attrNames;
 | 
					  inherit (builtins) attrNames;
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.types) listOf enum;
 | 
				
			||||||
  inherit (lib.types) either listOf package str enum;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "ols";
 | 
					  defaultServers = ["ols"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    ols = {
 | 
					    ols = {
 | 
				
			||||||
      package = pkgs.ols;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.ols)];
 | 
				
			||||||
        lspconfig.ols.setup {
 | 
					      filetypes = ["odin"];
 | 
				
			||||||
          capabilities = capabilities,
 | 
					      root_dir =
 | 
				
			||||||
          on_attach = default_on_attach,
 | 
					        mkLuaInline
 | 
				
			||||||
          cmd = ${
 | 
					        /*
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					        lua
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					        */
 | 
				
			||||||
          else "{'${cfg.lsp.package}/bin/ols'}"
 | 
					        ''
 | 
				
			||||||
        }
 | 
					          function(bufnr, on_dir)
 | 
				
			||||||
        }
 | 
					            local fname = vim.api.nvim_buf_get_name(bufnr)
 | 
				
			||||||
      '';
 | 
					            on_dir(util.root_pattern('ols.json', '.git', '*.odin')(fname))
 | 
				
			||||||
 | 
					          end'';
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,16 +45,10 @@ in {
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Odin LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Odin LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      server = mkOption {
 | 
					      servers = mkOption {
 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					 | 
				
			||||||
        default = defaultServer;
 | 
					 | 
				
			||||||
        description = "Odin LSP server to use";
 | 
					        description = "Odin LSP server to use";
 | 
				
			||||||
      };
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
 | 
					        default = defaultServers;
 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        description = "Ols package, or the command to run as a list of strings";
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = pkgs.ols;
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -64,8 +60,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.odin-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,81 +8,60 @@
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.meta) getExe;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.types) enum listOf;
 | 
				
			||||||
  inherit (lib.types) enum either listOf package str;
 | 
					 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.php;
 | 
					  cfg = config.vim.languages.php;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "phpactor";
 | 
					  defaultServers = ["phpactor"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    phpactor = {
 | 
					    phpactor = {
 | 
				
			||||||
      package = pkgs.phpactor;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.phpactor) "language-server"];
 | 
				
			||||||
        lspconfig.phpactor.setup{
 | 
					      filetypes = ["php"];
 | 
				
			||||||
          capabilities = capabilities,
 | 
					      root_markers = [".git" "composer.json" ".phpactor.json" ".phpactor.yml"];
 | 
				
			||||||
          on_attach = default_on_attach,
 | 
					      workspace_required = true;
 | 
				
			||||||
          cmd = ${
 | 
					 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					 | 
				
			||||||
          else ''
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              "${getExe cfg.lsp.package}",
 | 
					 | 
				
			||||||
              "language-server"
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
          ''
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    phan = {
 | 
					    phan = {
 | 
				
			||||||
      package = pkgs.php81Packages.phan;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [
 | 
				
			||||||
        lspconfig.phan.setup{
 | 
					        (getExe pkgs.php81Packages.phan)
 | 
				
			||||||
          capabilities = capabilities,
 | 
					        "-m"
 | 
				
			||||||
          on_attach = default_on_attach,
 | 
					        "json"
 | 
				
			||||||
          cmd = ${
 | 
					        "--no-color"
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					        "--no-progress-bar"
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					        "-x"
 | 
				
			||||||
          else ''
 | 
					        "-u"
 | 
				
			||||||
              {
 | 
					        "-S"
 | 
				
			||||||
                "${getExe cfg.lsp.package}",
 | 
					        "--language-server-on-stdin"
 | 
				
			||||||
                "-m",
 | 
					        "--allow-polyfill-parser"
 | 
				
			||||||
                "json",
 | 
					      ];
 | 
				
			||||||
                "--no-color",
 | 
					      filetypes = ["php"];
 | 
				
			||||||
                "--no-progress-bar",
 | 
					      root_dir =
 | 
				
			||||||
                "-x",
 | 
					        mkLuaInline
 | 
				
			||||||
                "-u",
 | 
					        /*
 | 
				
			||||||
                "-S",
 | 
					        lua
 | 
				
			||||||
                "--language-server-on-stdin",
 | 
					        */
 | 
				
			||||||
                "--allow-polyfill-parser"
 | 
					        ''
 | 
				
			||||||
            },
 | 
					          function(bufnr, on_dir)
 | 
				
			||||||
          ''
 | 
					            local fname = vim.api.nvim_buf_get_name(bufnr)
 | 
				
			||||||
        }
 | 
					            local cwd = assert(vim.uv.cwd())
 | 
				
			||||||
        }
 | 
					            local root = vim.fs.root(fname, { 'composer.json', '.git' })
 | 
				
			||||||
      '';
 | 
					
 | 
				
			||||||
 | 
					            -- prefer cwd if root is a descendant
 | 
				
			||||||
 | 
					            on_dir(root and vim.fs.relpath(cwd, root) and cwd)
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    intelephense = {
 | 
					    intelephense = {
 | 
				
			||||||
      package = pkgs.intelephense;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.intelephense) "--stdio"];
 | 
				
			||||||
        lspconfig.intelephense.setup{
 | 
					      filetypes = ["php"];
 | 
				
			||||||
          capabilities = capabilities,
 | 
					      root_markers = ["composer.json" ".git"];
 | 
				
			||||||
          on_attach = default_on_attach,
 | 
					 | 
				
			||||||
          cmd = ${
 | 
					 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					 | 
				
			||||||
          else ''
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              "${getExe cfg.lsp.package}",
 | 
					 | 
				
			||||||
              "--stdio"
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
          ''
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
in {
 | 
					in {
 | 
				
			||||||
| 
						 | 
					@ -97,17 +76,10 @@ in {
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "PHP LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "PHP LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      server = mkOption {
 | 
					      servers = mkOption {
 | 
				
			||||||
        description = "PHP LSP server to use";
 | 
					        description = "PHP LSP server to use";
 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        default = defaultServer;
 | 
					        default = defaultServers;
 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        description = "PHP LSP server package, or the command to run as a list of strings";
 | 
					 | 
				
			||||||
        example = ''[lib.getExe pkgs.jdt-language-server " - data " " ~/.cache/jdtls/workspace "]'';
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -117,11 +89,14 @@ in {
 | 
				
			||||||
      vim.treesitter.enable = true;
 | 
					      vim.treesitter.enable = true;
 | 
				
			||||||
      vim.treesitter.grammars = [cfg.treesitter.package];
 | 
					      vim.treesitter.grammars = [cfg.treesitter.package];
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig = {
 | 
					      vim.lsp.servers =
 | 
				
			||||||
        enable = true;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
        sources.php-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					          name = n;
 | 
				
			||||||
      };
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,57 +8,114 @@
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption literalExpression;
 | 
					  inherit (lib.options) mkEnableOption mkOption literalExpression;
 | 
				
			||||||
  inherit (lib.meta) getExe;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.types) enum listOf package str bool;
 | 
				
			||||||
  inherit (lib.types) enum either listOf package str bool;
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.dag) entryBefore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.python;
 | 
					  cfg = config.vim.languages.python;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "basedpyright";
 | 
					  defaultServers = ["basedpyright"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    pyright = {
 | 
					    pyright = {
 | 
				
			||||||
      package = pkgs.pyright;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.pyright) "--stdio"];
 | 
				
			||||||
        lspconfig.pyright.setup{
 | 
					      filetypes = ["python"];
 | 
				
			||||||
          capabilities = capabilities;
 | 
					      root_markers = [
 | 
				
			||||||
          on_attach = default_on_attach;
 | 
					        "pyproject.toml"
 | 
				
			||||||
          cmd = ${
 | 
					        "setup.py"
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					        "setup.cfg"
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					        "requirements.txt"
 | 
				
			||||||
          else ''{"${cfg.lsp.package}/bin/pyright-langserver", "--stdio"}''
 | 
					        "Pipfile"
 | 
				
			||||||
        }
 | 
					        "pyrightconfig.json"
 | 
				
			||||||
        }
 | 
					        ".git"
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					      settings = {
 | 
				
			||||||
 | 
					        python = {
 | 
				
			||||||
 | 
					          analysis = {
 | 
				
			||||||
 | 
					            autoSearchPaths = true;
 | 
				
			||||||
 | 
					            useLibraryCodeForTypes = true;
 | 
				
			||||||
 | 
					            diagnosticMode = "openFilesOnly";
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      on_attach = mkLuaInline ''
 | 
				
			||||||
 | 
					        function(client, bufnr)
 | 
				
			||||||
 | 
					          vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightOrganizeImports', function()
 | 
				
			||||||
 | 
					            client:exec_cmd({
 | 
				
			||||||
 | 
					              command = 'pyright.organizeimports',
 | 
				
			||||||
 | 
					              arguments = { vim.uri_from_bufnr(bufnr) },
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					          end, {
 | 
				
			||||||
 | 
					            desc = 'Organize Imports',
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					          vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightSetPythonPath', function(opts)
 | 
				
			||||||
 | 
					            set_python_path('pyright', opts.args)
 | 
				
			||||||
 | 
					          end, {
 | 
				
			||||||
 | 
					            desc = 'Reconfigure pyright with the provided python path',
 | 
				
			||||||
 | 
					            nargs = 1,
 | 
				
			||||||
 | 
					            complete = 'file',
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
      '';
 | 
					      '';
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    basedpyright = {
 | 
					    basedpyright = {
 | 
				
			||||||
      package = pkgs.basedpyright;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.basedpyright) "--stdio"];
 | 
				
			||||||
        lspconfig.basedpyright.setup{
 | 
					      filetypes = ["python"];
 | 
				
			||||||
          capabilities = capabilities;
 | 
					      root_markers = [
 | 
				
			||||||
          on_attach = default_on_attach;
 | 
					        "pyproject.toml"
 | 
				
			||||||
          cmd = ${
 | 
					        "setup.py"
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					        "setup.cfg"
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					        "requirements.txt"
 | 
				
			||||||
          else ''{"${cfg.lsp.package}/bin/basedpyright-langserver", "--stdio"}''
 | 
					        "Pipfile"
 | 
				
			||||||
        }
 | 
					        "pyrightconfig.json"
 | 
				
			||||||
        }
 | 
					        ".git"
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					      settings = {
 | 
				
			||||||
 | 
					        basedpyright = {
 | 
				
			||||||
 | 
					          analysis = {
 | 
				
			||||||
 | 
					            autoSearchPaths = true;
 | 
				
			||||||
 | 
					            useLibraryCodeForTypes = true;
 | 
				
			||||||
 | 
					            diagnosticMode = "openFilesOnly";
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      on_attach = mkLuaInline ''
 | 
				
			||||||
 | 
					        function(client, bufnr)
 | 
				
			||||||
 | 
					          vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightOrganizeImports', function()
 | 
				
			||||||
 | 
					            client:exec_cmd({
 | 
				
			||||||
 | 
					              command = 'basedpyright.organizeimports',
 | 
				
			||||||
 | 
					              arguments = { vim.uri_from_bufnr(bufnr) },
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					          end, {
 | 
				
			||||||
 | 
					            desc = 'Organize Imports',
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightSetPythonPath', function(opts)
 | 
				
			||||||
 | 
					            set_python_path('basedpyright', opts.args)
 | 
				
			||||||
 | 
					          end, {
 | 
				
			||||||
 | 
					            desc = 'Reconfigure basedpyright with the provided python path',
 | 
				
			||||||
 | 
					            nargs = 1,
 | 
				
			||||||
 | 
					            complete = 'file',
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
      '';
 | 
					      '';
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    python-lsp-server = {
 | 
					    python-lsp-server = {
 | 
				
			||||||
      package = pkgs.python3Packages.python-lsp-server;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.python3Packages.python-lsp-server)];
 | 
				
			||||||
        lspconfig.pylsp.setup{
 | 
					      filetypes = ["python"];
 | 
				
			||||||
          capabilities = capabilities;
 | 
					      root_markers = [
 | 
				
			||||||
          on_attach = default_on_attach;
 | 
					        "pyproject.toml"
 | 
				
			||||||
          cmd = ${
 | 
					        "setup.py"
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					        "setup.cfg"
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					        "requirements.txt"
 | 
				
			||||||
          else ''{"${cfg.lsp.package}/bin/pylsp"}''
 | 
					        "Pipfile"
 | 
				
			||||||
        }
 | 
					        ".git"
 | 
				
			||||||
        }
 | 
					      ];
 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -171,17 +228,10 @@ in {
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "Python LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Python LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      server = mkOption {
 | 
					      servers = mkOption {
 | 
				
			||||||
        description = "Python LSP server to use";
 | 
					        description = "Python LSP server to use";
 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        default = defaultServer;
 | 
					        default = defaultServers;
 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        description = "python LSP server package, or the command to run as a list of strings";
 | 
					 | 
				
			||||||
        example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]'';
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -234,8 +284,34 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.luaConfigRC.python-util =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.python-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        entryBefore ["lsp-servers"]
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					        lua
 | 
				
			||||||
 | 
					        */
 | 
				
			||||||
 | 
					        ''
 | 
				
			||||||
 | 
					          local function set_python_path(server_name, path)
 | 
				
			||||||
 | 
					            local clients = vim.lsp.get_clients {
 | 
				
			||||||
 | 
					              bufnr = vim.api.nvim_get_current_buf(),
 | 
				
			||||||
 | 
					              name = server_name,
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            for _, client in ipairs(clients) do
 | 
				
			||||||
 | 
					              if client.settings then
 | 
				
			||||||
 | 
					                client.settings.python = vim.tbl_deep_extend('force', client.settings.python or {}, { pythonPath = path })
 | 
				
			||||||
 | 
					              else
 | 
				
			||||||
 | 
					                client.config.settings = vim.tbl_deep_extend('force', client.config.settings, { python = { pythonPath = path } })
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					              client.notify('workspace/didChangeConfiguration', { settings = nil })
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      vim.lsp.servers =
 | 
				
			||||||
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.format.enable {
 | 
					    (mkIf cfg.format.enable {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,10 +7,11 @@
 | 
				
			||||||
  inherit (builtins) attrNames;
 | 
					  inherit (builtins) attrNames;
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption literalExpression;
 | 
					  inherit (lib.options) mkEnableOption mkOption literalExpression;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.types) enum listOf package;
 | 
				
			||||||
  inherit (lib.types) enum either listOf package str;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.r;
 | 
					  cfg = config.vim.languages.r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,22 +51,16 @@
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "r_language_server";
 | 
					  defaultServers = ["r_language_server"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    r_language_server = {
 | 
					    r_language_server = {
 | 
				
			||||||
      package = pkgs.writeShellScriptBin "r_lsp" ''
 | 
					      enable = true;
 | 
				
			||||||
        ${r-with-languageserver}/bin/R --slave -e "languageserver::run()"
 | 
					      cmd = [(getExe r-with-languageserver) "--no-echo" "-e" "languageserver::run()"];
 | 
				
			||||||
      '';
 | 
					      filetypes = ["r" "rmd" "quarto"];
 | 
				
			||||||
      lspConfig = ''
 | 
					      root_dir = mkLuaInline ''
 | 
				
			||||||
        lspconfig.r_language_server.setup{
 | 
					        function(bufnr, on_dir)
 | 
				
			||||||
          capabilities = capabilities;
 | 
					          on_dir(vim.fs.root(bufnr, '.git') or vim.uv.os_homedir())
 | 
				
			||||||
          on_attach = default_on_attach;
 | 
					        end
 | 
				
			||||||
          cmd = ${
 | 
					 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					 | 
				
			||||||
          else ''{"${lib.getExe cfg.lsp.package}"}''
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      '';
 | 
					      '';
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -81,17 +76,10 @@ in {
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "R LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "R LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      server = mkOption {
 | 
					      servers = mkOption {
 | 
				
			||||||
        description = "R LSP server to use";
 | 
					        description = "R LSP server to use";
 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        default = defaultServer;
 | 
					        default = defaultServers;
 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        description = "R LSP server package, or the command to run as a list of strings";
 | 
					 | 
				
			||||||
        example = literalExpression "[ (lib.getExe pkgs.jdt-language-server) \"-data\" \"~/.cache/jdtls/workspace\" ]";
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,8 +115,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.r-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,10 +7,10 @@
 | 
				
			||||||
  inherit (builtins) attrNames;
 | 
					  inherit (builtins) attrNames;
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkEnableOption mkOption;
 | 
				
			||||||
  inherit (lib.modules) mkIf mkMerge;
 | 
					  inherit (lib.modules) mkIf mkMerge;
 | 
				
			||||||
  inherit (lib.lists) isList;
 | 
					  inherit (lib.meta) getExe;
 | 
				
			||||||
  inherit (lib.types) enum either listOf package str;
 | 
					  inherit (lib.types) enum listOf;
 | 
				
			||||||
  inherit (lib.nvim.types) mkGrammarOption;
 | 
					  inherit (lib.nvim.types) mkGrammarOption;
 | 
				
			||||||
  inherit (lib.nvim.lua) expToLua;
 | 
					  inherit (lib.nvim.attrsets) mapListToAttrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.languages.yaml;
 | 
					  cfg = config.vim.languages.yaml;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,23 +25,22 @@
 | 
				
			||||||
      end''
 | 
					      end''
 | 
				
			||||||
    else "on_attach = default_on_attach";
 | 
					    else "on_attach = default_on_attach";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defaultServer = "yaml-language-server";
 | 
					  defaultServers = ["yaml-language-server"];
 | 
				
			||||||
  servers = {
 | 
					  servers = {
 | 
				
			||||||
    yaml-language-server = {
 | 
					    yaml-language-server = {
 | 
				
			||||||
      package = pkgs.yaml-language-server;
 | 
					      enable = true;
 | 
				
			||||||
      lspConfig = ''
 | 
					      cmd = [(getExe pkgs.yaml-language-server) "--stdio"];
 | 
				
			||||||
 | 
					      filetypes = ["yaml" "yaml.docker-compose" "yaml.gitlab" "yaml.helm-values"];
 | 
				
			||||||
 | 
					      root_markers = [".git"];
 | 
				
			||||||
        lspconfig.yamlls.setup {
 | 
					      on_attach = onAttach;
 | 
				
			||||||
          capabilities = capabilities,
 | 
					      # -- https://github.com/redhat-developer/vscode-redhat-telemetry#how-to-disable-telemetry-reporting
 | 
				
			||||||
          ${onAttach},
 | 
					      settings = {
 | 
				
			||||||
          cmd = ${
 | 
					        redhat = {
 | 
				
			||||||
          if isList cfg.lsp.package
 | 
					          telemetry = {
 | 
				
			||||||
          then expToLua cfg.lsp.package
 | 
					            enabled = false;
 | 
				
			||||||
          else ''{"${cfg.lsp.package}/bin/yaml-language-server", "--stdio"}''
 | 
					          };
 | 
				
			||||||
        },
 | 
					        };
 | 
				
			||||||
        }
 | 
					      };
 | 
				
			||||||
      '';
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
in {
 | 
					in {
 | 
				
			||||||
| 
						 | 
					@ -55,18 +54,11 @@ in {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lsp = {
 | 
					    lsp = {
 | 
				
			||||||
      enable = mkEnableOption "YAML LSP support" // {default = config.vim.lsp.enable;};
 | 
					      enable = mkEnableOption "Yaml LSP support" // {default = config.vim.lsp.enable;};
 | 
				
			||||||
 | 
					      servers = mkOption {
 | 
				
			||||||
      server = mkOption {
 | 
					        description = "Yaml LSP server to use";
 | 
				
			||||||
        type = enum (attrNames servers);
 | 
					        type = listOf (enum (attrNames servers));
 | 
				
			||||||
        default = defaultServer;
 | 
					        default = defaultServers;
 | 
				
			||||||
        description = "YAML LSP server to use";
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      package = mkOption {
 | 
					 | 
				
			||||||
        type = either package (listOf str);
 | 
					 | 
				
			||||||
        default = servers.${cfg.lsp.server}.package;
 | 
					 | 
				
			||||||
        description = "YAML LSP server package";
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -78,8 +70,12 @@ in {
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (mkIf cfg.lsp.enable {
 | 
					    (mkIf cfg.lsp.enable {
 | 
				
			||||||
      vim.lsp.lspconfig.enable = true;
 | 
					      vim.lsp.servers =
 | 
				
			||||||
      vim.lsp.lspconfig.sources.yaml-lsp = servers.${cfg.lsp.server}.lspConfig;
 | 
					        mapListToAttrs (n: {
 | 
				
			||||||
 | 
					          name = n;
 | 
				
			||||||
 | 
					          value = servers.${n};
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        cfg.lsp.servers;
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue