languages: convert modules to new LSP option set format
Some checks failed
Check for typos in the source tree / check-typos (push) Has been cancelled

This commit is contained in:
raf 2025-02-16 12:49:10 +03:00
commit 5bc627f4e4
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
10 changed files with 406 additions and 180 deletions

View file

@ -4,12 +4,34 @@
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) enum either listOf package str;
inherit (lib.lists) isList;
inherit (lib.meta) getExe;
inherit (lib.generators) mkLuaInline;
inherit (lib.nvim.lua) expToLua toLuaObject;
inherit (lib.nvim.languages) lspOptions;
inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.types) mkGrammarOption;
cfg = config.vim.languages.assembly; cfg = config.vim.languages.assembly;
defaultServer = "asm_lsp";
servers = {
asm_lsp = {
package = pkgs.asm-lsp;
options = {
capabilities = mkLuaInline "capabilities";
on_attach = mkLuaInline "default_on_attach";
filetypes = ["asm" "vasm"];
cmd =
if isList cfg.lsp.package
then expToLua cfg.lsp.package
else ["${getExe cfg.lsp.package}"];
};
};
};
in { in {
options.vim.languages.assembly = { options.vim.languages.assembly = {
enable = mkEnableOption "Assembly support"; enable = mkEnableOption "Assembly support";
@ -22,28 +44,46 @@ in {
lsp = { lsp = {
enable = mkEnableOption "Assembly LSP support (asm-lsp)" // {default = config.vim.languages.enableLSP;}; enable = mkEnableOption "Assembly LSP support (asm-lsp)" // {default = config.vim.languages.enableLSP;};
server = mkOption {
description = "Assembly LSP server to use";
type = enum (attrNames servers);
default = defaultServer;
};
package = mkOption { package = mkOption {
type = package; description = "asm-lsp LSP server package, or the command to run as a list of strings";
default = pkgs.asm-lsp; example = ''[lib.getExe pkgs.asm-lsp "--quiet"]'';
description = "asm-lsp package"; type = either package (listOf str);
default = servers.${cfg.lsp.server}.package;
};
options = mkOption {
type = lspOptions;
default = servers.${cfg.lsp.server}.options;
description = ''
LSP options for Assembly language support.
This option is freeform, you may add options that are not set by default
and they will be merged into the final table passed to lspconfig.
'';
}; };
}; };
}; };
config = mkIf cfg.enable (mkMerge [ config = mkIf cfg.enable (mkMerge [
(mkIf cfg.treesitter.enable { (mkIf cfg.treesitter.enable {
vim.treesitter.enable = true; vim.treesitter = {
vim.treesitter.grammars = [cfg.treesitter.package]; enable = true;
grammars = [cfg.treesitter.package];
};
}) })
(mkIf cfg.lsp.enable { (mkIf cfg.lsp.enable {
vim.lsp.lspconfig.enable = true; vim.lsp.lspconfig = {
vim.lsp.lspconfig.sources.asm-lsp = '' enable = true;
lspconfig.asm_lsp.setup { sources.asm-lsp = ''
capabilities = capabilities, lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options})
on_attach = default_on_attach, '';
cmd = {"${cfg.lsp.package}/bin/asm-lsp"}, };
}
'';
}) })
]); ]);
} }

View file

@ -7,11 +7,12 @@
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.types) enum either listOf package str;
inherit (lib.lists) isList; inherit (lib.lists) isList;
inherit (lib.meta) getExe; inherit (lib.meta) getExe;
inherit (lib.types) enum either listOf package str; inherit (lib.generators) mkLuaInline;
inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.lua) expToLua toLuaObject;
inherit (lib.nvim.languages) diagnosticsToLua; inherit (lib.nvim.languages) diagnosticsToLua lspOptions;
inherit (lib.nvim.types) mkGrammarOption diagnostics; inherit (lib.nvim.types) mkGrammarOption diagnostics;
cfg = config.vim.languages.astro; cfg = config.vim.languages.astro;
@ -20,17 +21,16 @@
servers = { servers = {
astro = { astro = {
package = pkgs.astro-language-server; package = pkgs.astro-language-server;
lspConfig = '' options = {
lspconfig.astro.setup { capabilities = mkLuaInline "capabilities";
capabilities = capabilities; on_attach = mkLuaInline "attach_keymaps";
on_attach = attach_keymaps, filetypes = ["astro"];
cmd = ${ init_options = {typescript = {};};
cmd =
if isList cfg.lsp.package if isList cfg.lsp.package
then expToLua cfg.lsp.package then expToLua cfg.lsp.package
else ''{"${cfg.lsp.package}/bin/astro-ls", "--stdio"}'' else ["${getExe cfg.lsp.package}" "--stdio"];
} };
}
'';
}; };
}; };
@ -83,8 +83,7 @@ in {
treesitter = { treesitter = {
enable = mkEnableOption "Astro treesitter" // {default = config.vim.languages.enableTreesitter;}; enable = mkEnableOption "Astro treesitter" // {default = config.vim.languages.enableTreesitter;};
package = mkGrammarOption pkgs "astro";
astroPackage = mkGrammarOption pkgs "astro";
}; };
lsp = { lsp = {
@ -96,6 +95,17 @@ in {
default = defaultServer; default = defaultServer;
}; };
options = mkOption {
type = lspOptions;
default = servers.${cfg.lsp.server}.options;
description = ''
LSP options for Astro language support.
This option is freeform, you may add options that are not set by default
and they will be merged into the final table passed to lspconfig.
'';
};
package = mkOption { package = mkOption {
description = "Astro LSP server package, or the command to run as a list of strings"; description = "Astro LSP server package, or the command to run as a list of strings";
example = ''[lib.getExe pkgs.astro-language-server "--minify" "--stdio"]''; example = ''[lib.getExe pkgs.astro-language-server "--minify" "--stdio"]'';
@ -134,12 +144,14 @@ in {
config = mkIf cfg.enable (mkMerge [ config = mkIf cfg.enable (mkMerge [
(mkIf cfg.treesitter.enable { (mkIf cfg.treesitter.enable {
vim.treesitter.enable = true; vim.treesitter.enable = true;
vim.treesitter.grammars = [cfg.treesitter.astroPackage]; vim.treesitter.grammars = [cfg.treesitter.package];
}) })
(mkIf cfg.lsp.enable { (mkIf cfg.lsp.enable {
vim.lsp.lspconfig.enable = true; vim.lsp.lspconfig.enable = true;
vim.lsp.lspconfig.sources.astro-lsp = servers.${cfg.lsp.server}.lspConfig; vim.lsp.lspconfig.sources.astro-lsp = ''
lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options})
'';
}) })
(mkIf cfg.format.enable { (mkIf cfg.format.enable {

View file

@ -7,11 +7,13 @@
inherit (builtins) attrNames; inherit (builtins) attrNames;
inherit (lib.options) mkOption mkEnableOption literalExpression; inherit (lib.options) mkOption mkEnableOption literalExpression;
inherit (lib.modules) mkIf mkMerge; inherit (lib.modules) mkIf mkMerge;
inherit (lib.types) enum either listOf package str bool;
inherit (lib.lists) isList; inherit (lib.lists) isList;
inherit (lib.types) enum either package listOf str bool; inherit (lib.meta) getExe;
inherit (lib.nvim.languages) diagnosticsToLua; inherit (lib.generators) mkLuaInline;
inherit (lib.nvim.types) diagnostics mkGrammarOption; inherit (lib.nvim.lua) expToLua toLuaObject;
inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.languages) diagnosticsToLua lspOptions;
inherit (lib.nvim.types) mkGrammarOption diagnostics;
cfg = config.vim.languages.bash; cfg = config.vim.languages.bash;
@ -19,17 +21,15 @@
servers = { servers = {
bash-ls = { bash-ls = {
package = pkgs.bash-language-server; package = pkgs.bash-language-server;
lspConfig = '' options = {
lspconfig.bashls.setup{ capabilities = mkLuaInline "capabilities";
capabilities = capabilities; on_attach = mkLuaInline "default_on_attach";
on_attach = default_on_attach; filetypes = ["bash" "sh"];
cmd = ${ cmd =
if isList cfg.lsp.package if isList cfg.lsp.package
then expToLua cfg.lsp.package then expToLua cfg.lsp.package
else ''{"${cfg.lsp.package}/bin/bash-language-server", "start"}'' else ["${getExe cfg.lsp.package}" "start"];
}; };
}
'';
}; };
}; };
@ -87,6 +87,17 @@ in {
type = either package (listOf str); type = either package (listOf str);
default = pkgs.bash-language-server; default = pkgs.bash-language-server;
}; };
options = mkOption {
type = lspOptions;
default = servers.${cfg.lsp.server}.options;
description = ''
LSP options for Bash language support.
This option is freeform, you may add options that are not set by default
and they will be merged into the final table passed to lspconfig.
'';
};
}; };
format = { format = {
@ -126,7 +137,9 @@ in {
(mkIf cfg.lsp.enable { (mkIf cfg.lsp.enable {
vim.lsp.lspconfig.enable = true; vim.lsp.lspconfig.enable = true;
vim.lsp.lspconfig.sources.bash-lsp = servers.${cfg.lsp.server}.lspConfig; vim.lsp.lspconfig.sources.bash-lsp = ''
lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options})
'';
}) })
(mkIf cfg.format.enable { (mkIf cfg.format.enable {

View file

@ -5,48 +5,62 @@
... ...
}: let }: let
inherit (builtins) attrNames; inherit (builtins) attrNames;
inherit (lib.lists) isList;
inherit (lib.strings) optionalString;
inherit (lib.options) mkEnableOption mkOption;
inherit (lib.types) bool enum package either listOf str nullOr;
inherit (lib.modules) mkIf mkMerge; inherit (lib.modules) mkIf mkMerge;
inherit (lib.nvim.lua) expToLua; inherit (lib.options) mkEnableOption mkOption;
inherit (lib.types) bool enum package either listOf str;
inherit (lib.lists) isList;
inherit (lib.generators) mkLuaInline;
inherit (lib.nvim.lua) expToLua toLuaObject;
inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.types) mkGrammarOption;
inherit (lib.nvim.languages) lspOptions;
inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.dag) entryAfter;
packageToCmd = package: defaultCmd:
if isList cfg.lsp.package
then expToLua cfg.lsp.package
else ''{ "${cfg.lsp.package}/bin/${defaultCmd}" }'';
cfg = config.vim.languages.clang; cfg = config.vim.languages.clang;
packageToCmd = package: defaultCmd:
if isList package
then expToLua package
else ''{ "${package}/bin/${defaultCmd}" }'';
defaultServer = "clangd"; defaultServer = "clangd";
servers = { servers = {
ccls = { ccls = {
package = pkgs.ccls; package = pkgs.ccls;
lspConfig = '' options = {
lspconfig.ccls.setup{ capabilities = mkLuaInline "capabilities";
capabilities = capabilities; on_attach = mkLuaInline "default_on_attach";
on_attach=default_on_attach; filetypes = ["c" "cpp" "objc" "objcpp" "cuda"];
cmd = ${packageToCmd cfg.lsp.package "ccls"}; offset_encoding = "utf-32";
${optionalString (cfg.lsp.opts != null) "init_options = ${cfg.lsp.opts}"} cmd =
} if isList cfg.lsp.package
''; then expToLua cfg.lsp.package
else ["${packageToCmd cfg.lsp.package "ccls"}"];
single_file_support = false; # upstream default
};
}; };
clangd = { clangd = {
package = pkgs.clang-tools; package = pkgs.clang-tools;
lspConfig = '' options = {
local clangd_cap = capabilities capabilities = mkLuaInline ''
-- use same offsetEncoding as null-ls {
clangd_cap.offsetEncoding = {"utf-16"} offsetEncoding = { "utf-8", "utf-16" },
lspconfig.clangd.setup{ textDocument = {
capabilities = clangd_cap; completion = {
on_attach=default_on_attach; editsNearCursor = true
cmd = ${packageToCmd cfg.lsp.package "clangd"}; }
${optionalString (cfg.lsp.opts != null) "init_options = ${cfg.lsp.opts}"} }
} '';
''; on_attach = mkLuaInline "default_on_attach";
filetypes = ["c" "cpp" "objc" "objcpp" "cuda" "proto"];
offset_encoding = "utf-32";
cmd =
if isList cfg.lsp.package
then expToLua cfg.lsp.package
else ["${packageToCmd cfg.lsp.package "clangd"}"];
single_file_support = false; # upstream default
};
}; };
}; };
@ -60,6 +74,7 @@
command = '${cfg.dap.package}/bin/lldb-dap', command = '${cfg.dap.package}/bin/lldb-dap',
name = 'lldb' name = 'lldb'
} }
dap.configurations.cpp = { dap.configurations.cpp = {
{ {
name = 'Launch', name = 'Launch',
@ -98,10 +113,10 @@ in {
}; };
lsp = { lsp = {
enable = mkEnableOption "clang LSP support" // {default = config.vim.languages.enableLSP;}; enable = mkEnableOption "C/C++ LSP support" // {default = config.vim.languages.enableLSP;};
server = mkOption { server = mkOption {
description = "The clang LSP server to use"; description = "The C/C++ LSP server to use";
type = enum (attrNames servers); type = enum (attrNames servers);
default = defaultServer; default = defaultServer;
}; };
@ -113,10 +128,15 @@ in {
default = servers.${cfg.lsp.server}.package; default = servers.${cfg.lsp.server}.package;
}; };
opts = mkOption { options = mkOption {
description = "Options to pass to clang LSP server"; type = lspOptions;
type = nullOr str; default = servers.${cfg.lsp.server}.options;
default = null; description = ''
LSP options for C/C++ language support.
This option is freeform, you may add options that are not set by default
and they will be merged into the final table passed to lspconfig.
'';
}; };
}; };
@ -126,11 +146,13 @@ in {
type = bool; type = bool;
default = config.vim.languages.enableDAP; default = config.vim.languages.enableDAP;
}; };
debugger = mkOption { debugger = mkOption {
description = "clang debugger to use"; description = "clang debugger to use";
type = enum (attrNames debuggers); type = enum (attrNames debuggers);
default = defaultDebugger; default = defaultDebugger;
}; };
package = mkOption { package = mkOption {
description = "clang debugger package."; description = "clang debugger package.";
type = package; type = package;
@ -151,8 +173,9 @@ in {
(mkIf cfg.lsp.enable { (mkIf cfg.lsp.enable {
vim.lsp.lspconfig.enable = true; vim.lsp.lspconfig.enable = true;
vim.lsp.lspconfig.sources.clang-lsp = ''
vim.lsp.lspconfig.sources.clang-lsp = servers.${cfg.lsp.server}.lspConfig; lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options})
'';
}) })
(mkIf cfg.dap.enable { (mkIf cfg.dap.enable {

View file

@ -6,13 +6,14 @@
... ...
}: let }: let
inherit (builtins) attrNames; inherit (builtins) attrNames;
inherit (lib.options) mkEnableOption mkOption;
inherit (lib.types) either listOf package str enum;
inherit (lib.modules) mkIf mkMerge; inherit (lib.modules) mkIf mkMerge;
inherit (lib.options) mkOption mkEnableOption;
inherit (lib.types) either listOf package str enum;
inherit (lib.lists) isList; inherit (lib.lists) isList;
inherit (lib.strings) optionalString; inherit (lib.strings) optionalString;
inherit (lib.generators) mkLuaInline;
inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.types) mkGrammarOption;
inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.lua) expToLua toLuaObject;
lspKeyConfig = config.vim.lsp.mappings; lspKeyConfig = config.vim.lsp.mappings;
lspKeyOptions = options.vim.lsp.mappings; lspKeyOptions = options.vim.lsp.mappings;
@ -22,6 +23,11 @@
in in
optionalString (key != null) "vim.keymap.set('n', '${key}', ${action}, {buffer=bufnr, noremap=true, silent=true, desc='${desc}'})"; optionalString (key != null) "vim.keymap.set('n', '${key}', ${action}, {buffer=bufnr, noremap=true, silent=true, desc='${desc}'})";
packageToCmd = package: defaultCmd:
if isList package
then expToLua package
else ''{ "${package}/bin/${defaultCmd}" }'';
# Omnisharp doesn't have colors in popup docs for some reason, and I've also # Omnisharp doesn't have colors in popup docs for some reason, and I've also
# seen mentions of it being way slower, so until someone finds missing # seen mentions of it being way slower, so until someone finds missing
# functionality, this will be the default. # functionality, this will be the default.
@ -30,10 +36,10 @@
omnisharp = { omnisharp = {
package = pkgs.omnisharp-roslyn; package = pkgs.omnisharp-roslyn;
internalFormatter = true; internalFormatter = true;
lspConfig = '' options = {
lspconfig.omnisharp.setup { capabilities = mkLuaInline "capabilities";
capabilities = capabilities, on_attach = mkLuaInline ''
on_attach = function(client, bufnr) function(client, bufnr)
default_on_attach(client, bufnr) default_on_attach(client, bufnr)
local oe = require("omnisharp_extended") local oe = require("omnisharp_extended")
@ -42,35 +48,40 @@
${mkLspBinding "listReferences" "oe.lsp_references"} ${mkLspBinding "listReferences" "oe.lsp_references"}
${mkLspBinding "listImplementations" "oe.lsp_implementation"} ${mkLspBinding "listImplementations" "oe.lsp_implementation"}
end, end,
cmd = ${ '';
filetypes = ["cs" "vb"];
cmd =
if isList cfg.lsp.package if isList cfg.lsp.package
then expToLua cfg.lsp.package then expToLua cfg.lsp.package
else "{'${cfg.lsp.package}/bin/OmniSharp'}" else ["${packageToCmd cfg.lsp.package "OmniSharp"}"];
} single_file_support = false; # upstream default
} init_options = {};
''; handlers = {
"textDocument/definition" = mkLuaInline "extended_handler";
"textDocument/typeDefinition" = mkLuaInline "extended_handler";
};
};
}; };
csharp_ls = { csharp_ls = {
package = pkgs.csharp-ls; package = pkgs.csharp-ls;
internalFormatter = true; internalFormatter = true;
lspConfig = '' options = {
local extended_handler = require("csharpls_extended").handler capabilities = mkLuaInline "capabilities";
on_attach = mkLuaInline "default_on_attach";
lspconfig.csharp_ls.setup { filetypes = ["cs"];
capabilities = capabilities, offset_encoding = "utf-32";
on_attach = default_on_attach, cmd =
handlers = {
["textDocument/definition"] = extended_handler,
["textDocument/typeDefinition"] = extended_handler
},
cmd = ${
if isList cfg.lsp.package if isList cfg.lsp.package
then expToLua cfg.lsp.package then expToLua cfg.lsp.package
else "{'${cfg.lsp.package}/bin/csharp-ls'}" else ["${packageToCmd cfg.lsp.package "csharp-ls"}"];
} single_file_support = false; # upstream default
} init_options = {AutomaticWorkspaceInit = true;};
''; handlers = {
"textDocument/definition" = mkLuaInline "extended_handler";
"textDocument/typeDefinition" = mkLuaInline "extended_handler";
};
};
}; };
}; };
@ -116,7 +127,9 @@ in {
(mkIf cfg.lsp.enable { (mkIf cfg.lsp.enable {
vim.startPlugins = extraServerPlugins.${cfg.lsp.server} or []; vim.startPlugins = extraServerPlugins.${cfg.lsp.server} or [];
vim.lsp.lspconfig.enable = true; vim.lsp.lspconfig.enable = true;
vim.lsp.lspconfig.sources.csharp-lsp = servers.${cfg.lsp.server}.lspConfig; vim.lsp.lspconfig.sources.csharp-lsp = ''
lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options})
'';
}) })
]); ]);
} }

View file

@ -1,15 +1,38 @@
{ {
pkgs,
config, config,
pkgs,
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) enum either listOf package str;
inherit (lib.lists) isList;
inherit (lib.meta) getExe;
inherit (lib.generators) mkLuaInline;
inherit (lib.nvim.lua) expToLua toLuaObject;
inherit (lib.nvim.languages) lspOptions;
inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.types) mkGrammarOption;
cfg = config.vim.languages.cue; cfg = config.vim.languages.cue;
defaultServer = "cue";
servers = {
cue = {
package = pkgs.cue;
options = {
capabilities = mkLuaInline "capabilities";
on_attach = mkLuaInline "default_on_attach";
filetypes = ["cue"];
cmd =
if isList cfg.lsp.package
then expToLua cfg.lsp.package
else ["${getExe cfg.lsp.package}"];
single_file_support = true;
};
};
};
in { in {
options.vim.languages.cue = { options.vim.languages.cue = {
enable = mkEnableOption "CUE language support"; enable = mkEnableOption "CUE language support";
@ -23,10 +46,29 @@ in {
lsp = { lsp = {
enable = mkEnableOption "CUE LSP support" // {default = config.vim.languages.enableLSP;}; enable = mkEnableOption "CUE LSP support" // {default = config.vim.languages.enableLSP;};
server = mkOption {
description = "CUE LSP server to use";
type = enum (attrNames servers);
default = defaultServer;
};
package = mkOption { package = mkOption {
type = package; type = either package (listOf str);
default = pkgs.cue; default = servers.${cfg.lsp.server}.package;
description = "cue lsp implementation"; description = ''
CUE LSP server package, or the command to run as a list of strings
'';
};
options = mkOption {
type = lspOptions;
default = servers.${cfg.lsp.server}.options;
description = ''
LSP options for CUE language support.
This option is freeform, you may add options that are not set by default
and they will be merged into the final table passed to lspconfig.
'';
}; };
}; };
}; };
@ -38,14 +80,12 @@ in {
}) })
(mkIf cfg.lsp.enable { (mkIf cfg.lsp.enable {
vim.lsp.lspconfig.enable = true; vim.lsp.lspconfig = {
vim.lsp.lspconfig.sources.cue-lsp = '' enable = true;
lspconfig.cue.setup { sources.cue-lsp = ''
capabilities = capabilities, lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options})
on_attach = default_on_attach, '';
cmd = {"${cfg.lsp.package}/bin/cue", "lsp"}, };
}
'';
}) })
]); ]);
} }

View file

@ -6,12 +6,15 @@
}: let }: let
inherit (builtins) attrNames; inherit (builtins) attrNames;
inherit (lib.modules) mkIf mkMerge; inherit (lib.modules) mkIf mkMerge;
inherit (lib.trivial) boolToString;
inherit (lib.lists) isList;
inherit (lib.options) mkEnableOption mkOption; inherit (lib.options) mkEnableOption mkOption;
inherit (lib.types) enum either listOf package nullOr str bool; inherit (lib.types) enum either listOf package str bool;
inherit (lib.lists) isList;
inherit (lib.strings) optionalString; inherit (lib.strings) optionalString;
inherit (lib.nvim.lua) expToLua; inherit (lib.trivial) boolToString;
inherit (lib.meta) getExe;
inherit (lib.generators) mkLuaInline;
inherit (lib.nvim.lua) expToLua toLuaObject;
inherit (lib.nvim.languages) lspOptions;
inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.types) mkGrammarOption;
inherit (lib.nvim.dag) entryAnywhere; inherit (lib.nvim.dag) entryAnywhere;
@ -22,18 +25,29 @@
servers = { servers = {
dart = { dart = {
package = pkgs.dart; package = pkgs.dart;
lspConfig = '' options = {
lspconfig.dartls.setup{ capabilities = mkLuaInline "capabilities";
capabilities = capabilities; on_attach = mkLuaInline "default_on_attach";
on_attach=default_on_attach; filetypes = ["dart"];
cmd = ${ cmd =
if isList cfg.lsp.package if isList cfg.lsp.package
then expToLua cfg.lsp.package then expToLua cfg.lsp.package
else ''{"${cfg.lsp.package}/bin/dart", "language-server", "--protocol=lsp"}'' else ["${getExe cfg.lsp.package}" "language-server" "--protocol=lsp"];
single_file_support = true;
init_options = {
closingLabels = true;
flutterOutline = true;
onlyAnalyzeProjectsWithOpenFiles = true;
outline = true;
suggestFromUnimportedLibraries = true;
}; };
${optionalString (cfg.lsp.opts != null) "init_options = ${cfg.lsp.dartOpts}"} settings = {
} dart = {
''; completeFunctionCalls = true;
showTodos = true;
};
};
};
}; };
}; };
in { in {
@ -52,6 +66,7 @@ in {
type = enum (attrNames servers); type = enum (attrNames servers);
default = defaultServer; default = defaultServer;
}; };
package = mkOption { package = mkOption {
type = either package (listOf str); type = either package (listOf str);
default = servers.${cfg.lsp.server}.package; default = servers.${cfg.lsp.server}.package;
@ -59,10 +74,15 @@ in {
description = "Dart LSP server package, or the command to run as a list of strings"; description = "Dart LSP server package, or the command to run as a list of strings";
}; };
opts = mkOption { options = mkOption {
type = nullOr str; type = lspOptions;
default = null; default = servers.${cfg.lsp.server}.options;
description = "Options to pass to Dart LSP server"; description = ''
LSP options for Dart language support.
This option is freeform, you may add options that are not set by default
and they will be merged into the final table passed to lspconfig.
'';
}; };
}; };
@ -129,8 +149,12 @@ in {
}) })
(mkIf cfg.lsp.enable { (mkIf cfg.lsp.enable {
vim.lsp.lspconfig.enable = true; vim.lsp.lspconfig = {
vim.lsp.lspconfig.sources.dart-lsp = servers.${cfg.lsp.server}.lspConfig; enable = true;
sources.dart-lsp = ''
lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options})
'';
};
}) })
(mkIf ftcfg.enable { (mkIf ftcfg.enable {

View file

@ -7,10 +7,13 @@
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) enum either listOf package str; inherit (lib.types) enum either listOf package str;
inherit (lib.lists) isList;
inherit (lib.meta) getExe;
inherit (lib.generators) mkLuaInline;
inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.types) mkGrammarOption;
inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.lua) expToLua toLuaObject;
inherit (lib.nvim.languages) lspOptions;
inherit (lib.nvim.dag) entryAnywhere; inherit (lib.nvim.dag) entryAnywhere;
cfg = config.vim.languages.elixir; cfg = config.vim.languages.elixir;
@ -19,18 +22,15 @@
servers = { servers = {
elixirls = { elixirls = {
package = pkgs.elixir-ls; package = pkgs.elixir-ls;
lspConfig = '' options = {
-- elixirls setup capabilities = mkLuaInline "capabilities";
lspconfig.elixirls.setup { on_attach = mkLuaInline "default_on_attach";
capabilities = capabilities, filetypes = ["elixir" "eelixir" "heex" "surface"];
on_attach = default_on_attach, cmd =
cmd = ${
if isList cfg.lsp.package if isList cfg.lsp.package
then expToLua cfg.lsp.package then expToLua cfg.lsp.package
else ''{"${cfg.lsp.package}/bin/elixir-ls"}'' else ["${getExe cfg.lsp.package}"];
} };
}
'';
}; };
}; };
@ -72,6 +72,17 @@ in {
type = either package (listOf str); type = either package (listOf str);
default = servers.${cfg.lsp.server}.package; default = servers.${cfg.lsp.server}.package;
}; };
options = mkOption {
type = lspOptions;
default = servers.${cfg.lsp.server}.options;
description = ''
LSP options for Elixir language support.
This option is freeform, you may add options that are not set by default
and they will be merged into the final table passed to lspconfig.
'';
};
}; };
format = { format = {
@ -102,8 +113,12 @@ in {
}) })
(mkIf cfg.lsp.enable { (mkIf cfg.lsp.enable {
vim.lsp.lspconfig.enable = true; vim.lsp.lspconfig = {
vim.lsp.lspconfig.sources.elixir-lsp = servers.${cfg.lsp.server}.lspConfig; enable = true;
sources.elixir-lsp = ''
lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options})
'';
};
}) })
(mkIf cfg.format.enable { (mkIf cfg.format.enable {

View file

@ -7,11 +7,13 @@
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.meta) getExe;
inherit (lib.lists) isList;
inherit (lib.types) bool enum either listOf package str; inherit (lib.types) bool enum either listOf package str;
inherit (lib.lists) isList;
inherit (lib.meta) getExe;
inherit (lib.generators) mkLuaInline;
inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.types) mkGrammarOption;
inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.languages) lspOptions;
inherit (lib.nvim.lua) expToLua toLuaObject;
inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.dag) entryAfter;
cfg = config.vim.languages.go; cfg = config.vim.languages.go;
@ -20,17 +22,16 @@
servers = { servers = {
gopls = { gopls = {
package = pkgs.gopls; package = pkgs.gopls;
lspConfig = '' options = {
lspconfig.gopls.setup { capabilities = mkLuaInline "capabilities";
capabilities = capabilities; on_attach = mkLuaInline "default_on_attach";
on_attach = default_on_attach; filetypes = ["go" "gomod" "gowork" "gotmpl"];
cmd = ${ cmd =
if isList cfg.lsp.package if isList cfg.lsp.package
then expToLua cfg.lsp.package then expToLua cfg.lsp.package
else ''{"${cfg.lsp.package}/bin/gopls", "serve"}'' else ["${getExe cfg.lsp.package}" "serve"];
}, single_file_support = true;
} };
'';
}; };
}; };
@ -102,6 +103,17 @@ in {
type = either package (listOf str); type = either package (listOf str);
default = servers.${cfg.lsp.server}.package; default = servers.${cfg.lsp.server}.package;
}; };
options = mkOption {
type = lspOptions;
default = servers.${cfg.lsp.server}.options;
description = ''
LSP options for Go language support.
This option is freeform, you may add options that are not set by default
and they will be merged into the final table passed to lspconfig.
'';
};
}; };
format = { format = {
@ -148,8 +160,12 @@ in {
}) })
(mkIf cfg.lsp.enable { (mkIf cfg.lsp.enable {
vim.lsp.lspconfig.enable = true; vim.lsp.lspconfig = {
vim.lsp.lspconfig.sources.go-lsp = servers.${cfg.lsp.server}.lspConfig; enable = true;
sources.go-lsp = ''
lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options})
'';
};
}) })
(mkIf cfg.format.enable { (mkIf cfg.format.enable {

View file

@ -8,6 +8,11 @@
inherit (lib.options) mkEnableOption mkOption; inherit (lib.options) mkEnableOption mkOption;
inherit (lib.modules) mkIf mkMerge; inherit (lib.modules) mkIf mkMerge;
inherit (lib.types) package bool enum; inherit (lib.types) package bool enum;
inherit (lib.lists) isList;
inherit (lib.meta) getExe;
inherit (lib.generators) mkLuaInline;
inherit (lib.lua) expToLua toLuaObject;
inherit (lib.nvim.languages) lspOptions;
inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.types) mkGrammarOption;
cfg = config.vim.languages.hcl; cfg = config.vim.languages.hcl;
@ -16,13 +21,15 @@
servers = { servers = {
terraform-ls = { terraform-ls = {
package = pkgs.terraform-ls; package = pkgs.terraform-ls;
lspConfig = '' options = {
lspconfig.terraformls.setup { capabilities = mkLuaInline "capabilities";
capabilities = capabilities, on_attach = mkLuaInline "default_on_attach";
on_attach=default_on_attach, filetypes = ["terraform" "hcl"];
cmd = {"${lib.getExe cfg.lsp.package}", "serve"}, cmd =
} if isList cfg.lsp.package
''; then expToLua cfg.lsp.package
else ["${getExe cfg.lsp.package}" "serve"];
};
}; };
}; };
@ -51,12 +58,30 @@ in {
lsp = { lsp = {
enable = mkEnableOption "HCL LSP support (terraform-ls)" // {default = config.vim.languages.enableLSP;}; enable = mkEnableOption "HCL LSP support (terraform-ls)" // {default = config.vim.languages.enableLSP;};
# TODO: (maybe, is it better?) it would be cooler to use vscode-extensions.hashicorp.hcl probably, shouldn't be too hard # TODO: (maybe, is it better?) it would be cooler to use vscode-extensions.hashicorp.hcl probably, shouldn't be too hard
package = mkOption { package = mkOption {
type = package; type = package;
default = servers.${defaultServer}.package; default = servers.${defaultServer}.package;
description = "HCL language server package (terraform-ls)"; description = "HCL language server package (terraform-ls)";
}; };
server = mkOption {
description = "HCL LSP server to use";
type = enum (attrNames servers);
default = defaultServer;
};
options = mkOption {
type = lspOptions;
default = servers.${cfg.lsp.server}.options;
description = ''
LSP options for HCL language support.
This option is freeform, you may add options that are not set by default
and they will be merged into the final table passed to lspconfig.
'';
};
}; };
format = { format = {
@ -65,11 +90,13 @@ in {
default = config.vim.languages.enableFormat; default = config.vim.languages.enableFormat;
description = "Enable HCL formatting"; description = "Enable HCL formatting";
}; };
type = mkOption { type = mkOption {
type = enum (attrNames formats); type = enum (attrNames formats);
default = defaultFormat; default = defaultFormat;
description = "HCL formatter to use"; description = "HCL formatter to use";
}; };
package = mkOption { package = mkOption {
type = package; type = package;
default = formats.${cfg.format.type}.package; default = formats.${cfg.format.type}.package;
@ -80,7 +107,7 @@ in {
config = mkIf cfg.enable (mkMerge [ config = mkIf cfg.enable (mkMerge [
{ {
# hcl style official: https://developer.hashicorp.com/terraform/language/style#code-formatting # HCL style official: https://developer.hashicorp.com/terraform/language/style#code-formatting
vim.pluginRC.hcl = '' vim.pluginRC.hcl = ''
vim.api.nvim_create_autocmd("FileType", { vim.api.nvim_create_autocmd("FileType", {
pattern = "hcl", pattern = "hcl",
@ -97,15 +124,18 @@ in {
.set('hcl', '#%s') .set('hcl', '#%s')
''; '';
} }
(mkIf cfg.treesitter.enable { (mkIf cfg.treesitter.enable {
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.enable = true; vim.lsp.lspconfig = {
vim.lsp.lspconfig.sources = lib.optionalAttrs (! config.vim.languages.terraform.lsp.enable) { enable = true;
terraform-ls = servers.${cfg.lsp.server}.lspConfig; sources.hcl-lsp = lib.optionalString (!config.vim.languages.terraform.lsp.enable) ''
lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options})
'';
}; };
}) })