inputs: { config, lib, pkgs, ... }: let inherit (pkgs.unstable) clang clang-tools elixir_ls haskell-language-server marksman rust-analyzer-unwrapped lua-language-server vimPlugins ; pylsp = with pkgs.unstable.python3Packages; python-lsp-server.overrideAttrs (old: { propagatedBuildInputs = old.propagatedBuildInputs ++ python-lsp-server.passthru.optional-dependencies.all; }); luaFormat = inputs.self.lib.generators.lua {}; in { imports = [ (import ./development/latex.nix inputs) ]; options = with lib; with luaFormat.lib; { vim.lsp = mkOption { description = '' Configure Neovim to use these LSP servers; ''; type = with types; attrsOf (submodule { freeformType = luaFormat.type; options = { capabilities = mkOption { default = mkRaw "capabilities"; }; cmd = mkOption { type = with types; listOf str; }; on_attach = mkOption { default = mkRaw "on_attach"; }; }; }); default = {}; }; }; config = { # TODO: add cargo-info users.extraUsers.minijackson.packages = with pkgs.unstable; [ bintools bacon clang clang-tools diffoscopeMinimal elixir gcc gdb graphviz man-pages python3Packages.ipython rr rustup watchexec shfmt taplo # Python black python3Packages.isort python3Packages.mypy python3Packages.tox # TODO: how to install into pylsp's python env? # python-lsp-black # pyls-isort # pylsp-mypy ruff neovide deadnix statix # TODO: add global vale config vale ]; vim = { extraPlugins = with vimPlugins; [ vim-pandoc clangd_extensions-nvim lsp_signature-nvim neodev-nvim nvim-lspconfig playground rust-tools-nvim vim-grammarous ]; variables = { rust_analyzer_path = "${rust-analyzer-unwrapped}/bin/rust-analyzer"; luals_base_path = "${lua-language-server}"; clangd_path = "${clang-tools}/bin/clangd"; }; lsp = { elixirls.cmd = ["${elixir_ls}/bin/elixir-ls"]; hls.cmd = ["${haskell-language-server}/bin/haskell-language-server" "--lsp"]; lua_ls = { cmd = ["${lua-language-server}/bin/lua-language-server"]; settings.Lua = { completion.callSnippet = "Replace"; telemetry.enable = false; }; }; marksman.cmd = ["${marksman}/bin/marksman"]; pylsp = { cmd = ["${pylsp}/bin/pylsp"]; settings.pylsp.plugins = { autopep8.enabled = false; flake8.ignore = ["E501"]; pycodestyle.ignore = ["E501"]; yapf.enabled = false; # See TODO above #black.enabled = true; #isort.enabled = true; #mypy.enabled = true; }; }; }; luaConfig = with lib; let toLua = luaFormat.generate; lspconfigFor = name: settings: "lspconfig['${name}'].setup ${toLua settings}"; lspconfig = concatStringsSep "\n" (mapAttrsToList lspconfigFor config.vim.lsp); in mkMerge [ "require('vim-dev')" "local lspconfig = require('lspconfig')" lspconfig ]; }; programs.zsh.interactiveShellInit = '' (( $+commands[rustc] )) && fpath+="$(rustc --print sysroot)/share/zsh/site-functions" ''; programs.liboping.enable = true; documentation.dev.enable = true; boot.kernel.sysctl = { # For RR "kernel.perf_event_paranoid" = 1; }; home-manager.users.minijackson = {config, ...}: { home.file.".clang-format".source = (pkgs.formats.yaml {}).generate "clang-format.yml" { BasedOnStyle = "Mozilla"; ColumnLimit = 100; TabWidth = 4; IndentWidth = 4; UseTab = "ForIndentation"; AlignAfterOpenBracket = "AlwaysBreak"; AccessModifierOffset = -4; AlwaysBreakAfterDefinitionReturnType = "None"; AlwaysBreakAfterReturnType = "None"; AlwaysBreakTemplateDeclarations = true; BinPackArguments = false; BinPackParameters = false; BreakConstructorInitializers = "BeforeComma"; Cpp11BracedListStyle = true; DerivePointerAlignment = false; NamespaceIndentation = "Inner"; PenaltyBreakBeforeFirstCallParameter = 2; PointerAlignment = "Left"; Standard = "Latest"; }; programs.direnv = { enable = true; enableBashIntegration = true; enableZshIntegration = true; nix-direnv.enable = true; }; }; nixpkgs.overlays = [ (self: super: { inherit (self.unstable) nix-direnv direnv; }) ]; }; }