{ config, lib, pkgs, ... }: with lib; with lib.my; let cfg = config.modules.editors.neovim; dev = config.modules.dev; in { options.modules.editors.neovim = { enable = mkBoolOpt false; }; config = mkIf cfg.enable { user.packages = with pkgs; [ (neovim.override { configure = { customRC = '' luafile ~/.config/nvim/init.lua ''; packages.myPlugins = with pkgs.vimPlugins; { start = [ (nvim-treesitter.withPlugins ( plugins: with plugins; [ bash c cmake cpp css dockerfile elm glsl graphql haskell http html java javascript jsdoc json json5 latex lua markdown ninja nix org perl php pug python regex rst ruby rust scala scss toml tsx typescript vim yaml zig ] )) nvim-treesitter-context nvim-treesitter-textobjects nvim-lspconfig ]; }; }; }) ] ++ # Install appropriate language servers (if dev.cc.enable then [ ccls # C/C++ ] else []) ++ (if dev.java.enable then [ java-language-server # Java ltex-ls # LaTeX ] else []) ++ (if dev.lua.enable then [ sumneko-lua-language-server # Lua ] else []) ++ (if dev.node.enable then [ nodePackages.bash-language-server # Bash nodePackages.dockerfile-language-server-nodejs # Dockerfile nodePackages.graphql-language-service-cli # GraphQL nodePackages.purescript-language-server # PureScript nodePackages.svelte-language-server # Svelte nodePackages.typescript-language-server # JavaScript/TypeScript nodePackages.vim-language-server # Vim nodePackages.vscode-langservers-extracted # HTML, CSS, JSON, ESLint nodePackages.vue-language-server # Vue.js nodePackages.yaml-language-server # YAML ] else []) ++ (if dev.python.enable then [ cmake-language-server # CMake python310Packages.python-lsp-server # Python ] else []) ++ (if dev.rust.enable then [ rust-analyzer # Rust ] else []) ++ (if dev.scala.enable then [ metals # Scala ] else []) ++ (if dev.zig.enable then [ zls # Zig ] else []); home.configFile = { "nvim/init.lua".source = ./init.lua; "nvim/lua" = { source = ./lua; recursive = true; }; "nvim/lua/config/lsp.lua".text = '' -- This file is autogenerated, do not edit. ${if dev.cc.enable then "require('config.lsp.cc')\n" else ""} ${if dev.java.enable then "require('config.lsp.java')\n" else ""} ${if dev.lua.enable then "require('config.lsp.lua')\n" else ""} ${if dev.node.enable then "require('config.lsp.node')\n" else ""} ${if dev.python.enable then "require('config.lsp.python')\n" else ""} ${if dev.rust.enable then "require('config.lsp.rust')\n" else ""} ${if dev.scala.enable then "require('config.lsp.scala')\n" else ""} ${if dev.zig.enable then "require('config.lsp.zig')\n" else ""} ''; }; env.EDITOR = "nvim"; environment.shellAliases = { vim = "nvim"; v = "nvim"; }; }; }