nixvim-config/plugins/lsp.nix
2025-05-29 14:20:00 -07:00

172 lines
4.8 KiB
Nix

{ pkgs, ... }:
{
environment.systemPackages = [
pkgs.nodePackages.eslint
pkgs.nodePackages.prettier
];
programs.nixvim = {
keymaps = [
{
key = "gD";
action = "<cmd>lua vim.lsp.buf.declaration()<CR>";
options = { noremap = true; };
}
{
key = "gd";
action = "<cmd>lua vim.lsp.buf.definition()<CR>";
options = { noremap = true; };
}
{
key = "gi";
action = "<cmd>lua vim.lsp.buf.implementation()<CR>";
options = { noremap = true; };
}
{
key = "gk";
action = "<cmd>lua vim.lsp.buf.signature_help()<CR>";
options = { noremap = true; };
}
{
key = "K";
action = "<cmd>lua vim.lsp.buf.hover()<CR>";
options = { noremap = true; };
}
{
key = "<leader>wa";
action = "<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>";
options = { noremap = true; };
}
{
key = "<leader>wr";
action = "<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>";
options = { noremap = true; };
}
{
key = "<leader>wl";
action = "<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>";
options = { noremap = true; };
}
{
key = "<leader>D";
action = "<cmd>lua vim.lsp.buf.type_definition()<CR>";
options = { noremap = true; };
}
{
key = "<leader>r";
action = "<cmd>lua vim.lsp.buf.rename()<CR>";
options = { noremap = true; };
}
{
key = "<leader>ca";
action = "<cmd>lua vim.lsp.buf.code_action()<CR>";
options = { noremap = true; };
}
{
key = "<leader>e";
action = "<cmd>lua vim.diagnostic.open_float()<CR>";
options = { noremap = true; };
}
{
key = "<leader>q";
action = "<cmd>lua vim.diagnostic.setloclist()<CR>";
options = { noremap = true; };
}
{
key = "<leader>f";
action = "<cmd>lua vim.lsp.buf.formatting()<CR>";
options = { noremap = true; };
}
{
key = "gr";
action = "<cmd>lua vim.lsp.buf.references()<CR>";
options = { noremap = true; };
}
];
plugins.lsp = {
enable = true;
onAttach = ''
-- Set capabilities for the LSP client from blink-cmp
-- client.config.capabilities = require('blink.cmp').get_lsp_capabilities(client.config.capabilities)
local active_clients = vim.lsp.get_active_clients()
if client.name == "denols" then
for _, client_ in pairs(active_clients) do
-- stop tsserver if denols is already active
if client_.name == "ts_ls" then
client_.stop()
end
end
elseif client.name == "ts_ls" then
for _, client_ in pairs(active_clients) do
-- prevent tsserver from starting if denols is already active
if client_.name == "denols" then
client.stop()
end
end
end
'';
servers = {
## Needs a package
# awk_ls.enable = true;
bashls.enable = true;
clangd.enable = true;
cmake.enable = true;
## Needs a package
# css_variables.enable = true;
cssls.enable = true;
## Needs a package
# cssmodules_ls.enable = true;
## Needs a package
# custom_elements_ls.enable = true;
denols = {
enable = true;
rootMarkers = [ "require('lspconfig').util.root_pattern('deno.json', 'deno.jsonc')" ];
};
dockerls.enable = true; # Docker
eslint.enable = true;
gopls = { # Golang
enable = true;
autostart = true;
};
## Needs a package
# graphql.enable = true;
html.enable = true;
java_language_server.enable = true;
lua_ls = { # Lua
enable = true;
settings.telemetry.enable = false;
};
marksman.enable = true;
nil_ls.enable = true;
## Using nil_ls
# nixd.enable = true;
postgres_lsp.enable = true;
pyright.enable = true;
rust_analyzer = {
enable = true;
installRustc = true;
installCargo = true;
};
sqls.enable = true;
## Needs a package
# sqlls.enable = true;
stylelint_lsp.enable = true;
tailwindcss.enable = true;
ts_ls = {
enable = true;
rootMarkers = [ "require('lspconfig').util.root_pattern('package.json')" ];
settings = {
single_file_support = false;
};
};
yamlls.enable = true; # YAML
};
};
extraPackages = with pkgs; [
eslint
];
};
}