dot

NixOS dotfiles
git clone https://git.echoz.io/dot.git
Log | Files | Refs

lsp.nix (2649B)


      1 {
      2   lib,
      3   pkgs,
      4   config,
      5   ...
      6 }:
      7 {
      8   options.programs.neovim.languageServers = lib.mkOption {
      9     type = with lib.types; attrsOf anything;
     10   };
     11 
     12   config.programs.neovim = {
     13     languageServers = {
     14       nixd = {
     15         cmd = [ (lib.getExe pkgs.nixd) ];
     16         filetypes = [ "nix" ];
     17         root_markers = [
     18           "flake.nix"
     19           ".git"
     20         ];
     21         settings.nixd.formatting.command = [ (lib.getExe pkgs.nixfmt) ];
     22       };
     23 
     24       gopls = {
     25         cmd = [ (lib.getExe pkgs.gopls) ];
     26         filetypes = [
     27           "go"
     28           "gomod"
     29         ];
     30         root_markers = [
     31           "go.work"
     32           "go.mod"
     33           ".git"
     34         ];
     35       };
     36 
     37       typescript-language-server = {
     38         cmd = [
     39           (lib.getExe pkgs.typescript-language-server)
     40           "--stdio"
     41         ];
     42         filetypes = [
     43           "javascript"
     44           "typescript"
     45         ];
     46         root_markers = [
     47           [
     48             "jsconfig.json"
     49             "tsconfig.json"
     50           ]
     51           "package.json"
     52           ".git"
     53         ];
     54         init_options.hostInfo = "neovim";
     55       };
     56 
     57       basedpyright = {
     58         cmd = [
     59           (lib.getExe' pkgs.basedpyright "basedpyright-langserver")
     60           "--stdio"
     61         ];
     62         filetypes = [ "python" ];
     63         root_markers = [
     64           "pyrightconfig.json"
     65           "pyproject.toml"
     66           "setup.py"
     67           ".git"
     68         ];
     69         settings.basedpyright = {
     70           analysis.typeCheckingMode = "basic";
     71         };
     72       };
     73 
     74       lua-language-server = {
     75         cmd = [ (lib.getExe pkgs.lua-language-server) ];
     76         filetypes = [ "lua" ];
     77         settings.Lua."diagnostics.globals" = [ "vim" ];
     78       };
     79     };
     80 
     81     customPlugins.lsp = {
     82       "plugin/lsp.lua" = # lua
     83         ''
     84           vim.opt.signcolumn = "yes"
     85           vim.opt.completeopt = { "fuzzy", "menu", "menuone", "noinsert", "popup" }
     86 
     87           vim.diagnostic.config({ virtual_text = true })
     88 
     89           vim.lsp.config('*', {
     90             root_markers = { '.git' },
     91             on_attach = function(client, bufnr)
     92               vim.lsp.completion.enable(true, client.id, bufnr, {})
     93             end,
     94           })
     95 
     96           vim.keymap.set({ 'n', 'v' }, 'gqb', vim.lsp.buf.format)
     97           vim.keymap.set({ 'n', 'v' }, '<C-W>a', vim.diagnostic.setloclist)
     98 
     99           vim.lsp.enable(${
    100             lib.generators.toLua { } (builtins.attrNames config.programs.neovim.languageServers)
    101           })
    102         '';
    103     }
    104     // (lib.mapAttrs' (name: config: {
    105       name = "lsp/${name}.lua";
    106       value = "return ${lib.generators.toLua { } config}";
    107     }) config.programs.neovim.languageServers);
    108   };
    109 }