Skip to content

Commit

Permalink
Merge pull request #142 from NotAShelf/bash-lsp
Browse files Browse the repository at this point in the history
languages/bash: add LSP
  • Loading branch information
NotAShelf authored Oct 23, 2023
2 parents 29de5b5 + 599d487 commit 6546362
Show file tree
Hide file tree
Showing 7 changed files with 214 additions and 11 deletions.
1 change: 1 addition & 0 deletions configuration.nix
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ inputs: let
python.enable = isMaximal;
dart.enable = isMaximal;
elixir.enable = false;
bash.enable = isMaximal;
};

vim.visuals = {
Expand Down
7 changes: 7 additions & 0 deletions lib/languages.nix
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,11 @@
value = diagnostics.${type}.nullConfig package;
})
config);

mkEnable = desc:
lib.mkOption {
description = "Turn on ${desc} for enabled languages by default";
type = lib.types.bool;
default = false;
};
}
2 changes: 1 addition & 1 deletion lib/types/languages.nix
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{lib}:
with lib; let
diagnosticSubmodule = {...}: {
diagnosticSubmodule = _: {
options = {
type = mkOption {
description = "Type of diagnostic to enable";
Expand Down
114 changes: 114 additions & 0 deletions modules/languages/bash/bash.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
{
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 = mkEnableOption "Bash treesitter" // {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 = mkEnableOption "extra Bash diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;};

types = lib.nvim.types.diagnostics {
langDesc = "Bash";
inherit diagnostics;
inherit defaultDiagnostics;
};
};
};
}
80 changes: 80 additions & 0 deletions modules/languages/bash/config.nix
Original file line number Diff line number Diff line change
@@ -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 changes: 6 additions & 0 deletions modules/languages/bash/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
_: {
imports = [
./bash.nix
./config.nix
];
}
15 changes: 5 additions & 10 deletions modules/languages/default.nix
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
{lib, ...}:
with lib; let
mkEnable = desc:
mkOption {
description = "Turn on ${desc} for enabled languages by default";
type = types.bool;
default = false;
};
{lib, ...}: let
inherit (lib.nvim.languages) mkEnable;
in {
imports = [
./markdown
./tidal
./dart
./elixir
./bash

./clang.nix
./go.nix
Expand All @@ -31,8 +26,8 @@ in {
options.vim.languages = {
enableLSP = mkEnable "LSP";
enableDAP = mkEnable "Debug Adapter";
enableTreesitter = mkEnable "treesitter";
enableFormat = mkEnable "formatting";
enableTreesitter = mkEnable "Treesitter";
enableFormat = mkEnable "Formatting";
enableExtraDiagnostics = mkEnable "extra diagnostics";
};
}

0 comments on commit 6546362

Please sign in to comment.