inputs: { config, lib, pkgs, ... }: let inherit (pkgs.unstable) clang clang-tools elixir_ls haskell-language-server marksman rust-analyzer-unwrapped lua-language-server vimPlugins; inherit (pkgs.unstable.python3Packages) python-lsp-server; 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 = { users.extraUsers.minijackson.packages = with pkgs.unstable; [ bintools clang clang-tools diffoscopeMinimal elixir gcc gdb graphviz man-pages python3Packages.ipython rr rustup watchexec # Python black python3Packages.isort python3Packages.mypy python3Packages.tox ]; vim = { extraPlugins = with vimPlugins; [ lsp_signature-nvim neodev-nvim nvim-lspconfig rust-tools-nvim clangd_extensions-nvim vim-grammarous playground ]; 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"; }; marksman.cmd = [ "${marksman}/bin/marksman" ]; pylsp.cmd = [ "${python-lsp-server}/bin/pylsp" ]; }; 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" ''; 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; }) ]; }; }