mirror of
https://github.com/NotAShelf/neovim-flake.git
synced 2024-12-19 09:49:48 +01:00
feat: bash language server
This commit is contained in:
parent
29de5b56c0
commit
6e448cf958
7 changed files with 221 additions and 14 deletions
|
@ -72,6 +72,7 @@ inputs: let
|
||||||
python.enable = isMaximal;
|
python.enable = isMaximal;
|
||||||
dart.enable = isMaximal;
|
dart.enable = isMaximal;
|
||||||
elixir.enable = false;
|
elixir.enable = false;
|
||||||
|
bash.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.visuals = {
|
vim.visuals = {
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
# From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/booleans.nix
|
|
||||||
{lib}: {
|
{lib}: {
|
||||||
# Converts a boolean to a yes/no string. This is used in lots of
|
|
||||||
# configuration formats.
|
|
||||||
diagnosticsToLua = {
|
diagnosticsToLua = {
|
||||||
lang,
|
lang,
|
||||||
config,
|
config,
|
||||||
|
@ -22,4 +19,11 @@
|
||||||
value = diagnostics.${type}.nullConfig package;
|
value = diagnostics.${type}.nullConfig package;
|
||||||
})
|
})
|
||||||
config);
|
config);
|
||||||
|
|
||||||
|
mkEnable = desc:
|
||||||
|
lib.mkOption {
|
||||||
|
description = "Turn on ${desc} for enabled languages by default";
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = false;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{lib}:
|
{lib}:
|
||||||
with lib; let
|
with lib; let
|
||||||
diagnosticSubmodule = {...}: {
|
diagnosticSubmodule = _: {
|
||||||
options = {
|
options = {
|
||||||
type = mkOption {
|
type = mkOption {
|
||||||
description = "Type of diagnostic to enable";
|
description = "Type of diagnostic to enable";
|
||||||
|
|
121
modules/languages/bash/bash.nix
Normal file
121
modules/languages/bash/bash.nix
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with builtins; let
|
||||||
|
inherit (lib) mkOption mkEnableOption types;
|
||||||
|
|
||||||
|
cfg = config.vim.languages.bash;
|
||||||
|
|
||||||
|
defaultServer = "bash-ls";
|
||||||
|
servers = {
|
||||||
|
bash-ls = {
|
||||||
|
package = pkgs.nodePackages.bash-language-server;
|
||||||
|
lspConfig = ''
|
||||||
|
lspconfig.bashls.setup{
|
||||||
|
capabilities = capabilities;
|
||||||
|
on_attach = default_on_attach;
|
||||||
|
cmd = ${
|
||||||
|
if isList cfg.lsp.package
|
||||||
|
then nvim.lua.expToLua cfg.lsp.package
|
||||||
|
else ''{"${cfg.lsp.package}/bin/bash-language-server", "start"}''
|
||||||
|
};
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
defaultFormat = "shfmt";
|
||||||
|
formats = {
|
||||||
|
shfmt = {
|
||||||
|
package = pkgs.shfmt;
|
||||||
|
nullConfig = ''
|
||||||
|
table.insert(
|
||||||
|
ls_sources,
|
||||||
|
null_ls.builtins.formatting.shfmt.with({
|
||||||
|
command = "${pkgs.shfmt}/bin/shfmt",
|
||||||
|
})
|
||||||
|
)
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
defaultDiagnostics = ["shellcheck"];
|
||||||
|
diagnostics = {
|
||||||
|
shellcheck = {
|
||||||
|
package = pkgs.shellcheck;
|
||||||
|
nullConfig = pkg: ''
|
||||||
|
table.insert(
|
||||||
|
ls_sources,
|
||||||
|
null_ls.builtins.diagnostics.shellcheck.with({
|
||||||
|
command = "${pkg}/bin/shellcheck",
|
||||||
|
})
|
||||||
|
)
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options.vim.languages.bash = {
|
||||||
|
enable = mkEnableOption "Bash language support";
|
||||||
|
|
||||||
|
treesitter = {
|
||||||
|
enable = mkOption {
|
||||||
|
description = "Bash treesitter";
|
||||||
|
type = types.bool;
|
||||||
|
default = config.vim.languages.enableTreesitter;
|
||||||
|
};
|
||||||
|
package = lib.nvim.types.mkGrammarOption pkgs "bash";
|
||||||
|
};
|
||||||
|
|
||||||
|
lsp = {
|
||||||
|
enable = mkEnableOption "Enable Bash LSP support" // {default = config.vim.languages.enableLSP;};
|
||||||
|
|
||||||
|
server = mkOption {
|
||||||
|
description = "Bash LSP server to use";
|
||||||
|
type = with types; enum (attrNames servers);
|
||||||
|
default = defaultServer;
|
||||||
|
};
|
||||||
|
|
||||||
|
package = mkOption {
|
||||||
|
description = "bash-language-server package, or the command to run as a list of strings";
|
||||||
|
example = lib.literalExpression ''[lib.getExe pkgs.nodePackages.bash-language-server "start"]'';
|
||||||
|
type = with types; either package (listOf str);
|
||||||
|
default = pkgs.nodePackages.bash-language-server;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
format = {
|
||||||
|
enable = mkOption {
|
||||||
|
description = "Enable Bash formatting";
|
||||||
|
type = types.bool;
|
||||||
|
default = config.vim.languages.enableFormat;
|
||||||
|
};
|
||||||
|
type = mkOption {
|
||||||
|
description = "Bash formatter to use";
|
||||||
|
type = with types; enum (attrNames formats);
|
||||||
|
default = defaultFormat;
|
||||||
|
};
|
||||||
|
|
||||||
|
package = mkOption {
|
||||||
|
description = "Bash formatter package";
|
||||||
|
type = types.package;
|
||||||
|
default = formats.${cfg.format.type}.package;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
extraDiagnostics = {
|
||||||
|
enable = mkOption {
|
||||||
|
description = "Enable extra Bash diagnostics";
|
||||||
|
type = types.bool;
|
||||||
|
default = config.vim.languages.enableExtraDiagnostics;
|
||||||
|
};
|
||||||
|
types = lib.nvim.types.diagnostics {
|
||||||
|
langDesc = "Bash";
|
||||||
|
inherit diagnostics;
|
||||||
|
inherit defaultDiagnostics;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
80
modules/languages/bash/config.nix
Normal file
80
modules/languages/bash/config.nix
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
with builtins; let
|
||||||
|
cfg = config.vim.languages.bash;
|
||||||
|
diagnostics = {
|
||||||
|
shellcheck = {
|
||||||
|
package = pkgs.shellcheck;
|
||||||
|
nullConfig = pkg: ''
|
||||||
|
table.insert(
|
||||||
|
ls_sources,
|
||||||
|
null_ls.builtins.diagnostics.shellcheck.with({
|
||||||
|
command = "${pkg}/bin/shellcheck",
|
||||||
|
})
|
||||||
|
)
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
formats = {
|
||||||
|
shfmt = {
|
||||||
|
package = pkgs.shfmt;
|
||||||
|
nullConfig = ''
|
||||||
|
table.insert(
|
||||||
|
ls_sources,
|
||||||
|
null_ls.builtins.formatting.shfmt.with({
|
||||||
|
command = "${pkgs.shfmt}/bin/shfmt",
|
||||||
|
})
|
||||||
|
)
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
servers = {
|
||||||
|
bash-ls = {
|
||||||
|
package = pkgs.nodePackages.bash-language-server;
|
||||||
|
lspConfig = ''
|
||||||
|
lspconfig.bashls.setup{
|
||||||
|
capabilities = capabilities;
|
||||||
|
on_attach = default_on_attach;
|
||||||
|
cmd = ${
|
||||||
|
if isList cfg.lsp.package
|
||||||
|
then nvim.lua.expToLua cfg.lsp.package
|
||||||
|
else ''{"${cfg.lsp.package}/bin/bash-language-server", "start"}''
|
||||||
|
};
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
config = mkIf cfg.enable (mkMerge [
|
||||||
|
(mkIf cfg.treesitter.enable {
|
||||||
|
vim.treesitter.enable = true;
|
||||||
|
vim.treesitter.grammars = [cfg.treesitter.package];
|
||||||
|
})
|
||||||
|
|
||||||
|
(mkIf cfg.lsp.enable {
|
||||||
|
vim.lsp.lspconfig.enable = true;
|
||||||
|
vim.lsp.lspconfig.sources.bash-lsp = servers.${cfg.lsp.server}.lspConfig;
|
||||||
|
})
|
||||||
|
|
||||||
|
(mkIf cfg.format.enable {
|
||||||
|
vim.lsp.null-ls.enable = true;
|
||||||
|
vim.lsp.null-ls.sources.bash-format = formats.${cfg.format.type}.nullConfig;
|
||||||
|
})
|
||||||
|
|
||||||
|
(mkIf cfg.extraDiagnostics.enable {
|
||||||
|
vim.lsp.null-ls.enable = true;
|
||||||
|
vim.lsp.null-ls.sources = lib.nvim.languages.diagnosticsToLua {
|
||||||
|
lang = "bash";
|
||||||
|
config = cfg.extraDiagnostics.types;
|
||||||
|
inherit diagnostics;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
]);
|
||||||
|
}
|
6
modules/languages/bash/default.nix
Normal file
6
modules/languages/bash/default.nix
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
_: {
|
||||||
|
imports = [
|
||||||
|
./bash.nix
|
||||||
|
./config.nix
|
||||||
|
];
|
||||||
|
}
|
|
@ -1,17 +1,12 @@
|
||||||
{lib, ...}:
|
{lib, ...}: let
|
||||||
with lib; let
|
inherit (lib.nvim.languages) mkEnable;
|
||||||
mkEnable = desc:
|
|
||||||
mkOption {
|
|
||||||
description = "Turn on ${desc} for enabled languages by default";
|
|
||||||
type = types.bool;
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
in {
|
in {
|
||||||
imports = [
|
imports = [
|
||||||
./markdown
|
./markdown
|
||||||
./tidal
|
./tidal
|
||||||
./dart
|
./dart
|
||||||
./elixir
|
./elixir
|
||||||
|
./bash
|
||||||
|
|
||||||
./clang.nix
|
./clang.nix
|
||||||
./go.nix
|
./go.nix
|
||||||
|
@ -31,8 +26,8 @@ in {
|
||||||
options.vim.languages = {
|
options.vim.languages = {
|
||||||
enableLSP = mkEnable "LSP";
|
enableLSP = mkEnable "LSP";
|
||||||
enableDAP = mkEnable "Debug Adapter";
|
enableDAP = mkEnable "Debug Adapter";
|
||||||
enableTreesitter = mkEnable "treesitter";
|
enableTreesitter = mkEnable "Treesitter";
|
||||||
enableFormat = mkEnable "formatting";
|
enableFormat = mkEnable "Formatting";
|
||||||
enableExtraDiagnostics = mkEnable "extra diagnostics";
|
enableExtraDiagnostics = mkEnable "extra diagnostics";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue