{ config, pkgs, lib, ... }: with pkgs; let lsp-config = (writeTextFile (rec { name = "kak-lsp.toml"; destination = "/share/kak-lsp/${name}"; text = let semTok = (name: value: '' [[semantic_tokens]] token = "${name}" face = "${value}" ''); in '' [language.rust] filetypes = [ "rust" ] roots = [ "Cargo.toml" ] command = "rust-analyzer" [language.rust.settings.rust-analyzer] semanticTokens = true diagnostics.enabled = [ "unresolved-proc-macro" ] cargo.loadOutDirsFromCheck = true procMacro.enable = false [language.haskell] filetypes = [ "haskell" ] roots = [ "Setup.hs", "stack.yaml", "*.cabal" ] command = "haskell-language-server-wrapper" args = [ "--lsp" ] [language.nix] filetypes = [ "nix" ] roots = [ "flake.nix", "shell.nix", ".git", ".hg" ] command = "rnix-lsp" ${lib.concatStringsSep "\n" (lib.mapAttrsToList semTok { "enumMember" = "variant"; "enum" = "enum"; "union" = "union"; "struct" = "struct"; "typeAlias" = "alias"; "builtinType" = "primitive"; "trait" = "trait"; "interface" = "trait"; "method" = "method"; "function" = "function"; "namespace" = "module"; "boolean" = "literal"; "character" = "literal"; "number" = "literal"; "string" = "string"; "keyword" = "keyword"; "documentation" = "comment"; "comment" = "comment"; "escapeSequence" = "format"; "formatSpecifier" = "format"; "operator" = "operator"; "arithmetic" = "operator"; "bitwise" = "operator"; "comparison" = "operator"; "logical" = "operator"; "macro" = "macro"; "lifetime" = "lifetime"; "variable" = "variable"; "attribute" = "attribute"; "punctuation" = "punctuation"; }) } ''; })); in [ # Kakoune language server support (symlinkJoin { paths = with kakounePlugins; [ # The language server client kak-lsp # Include default language servers rnix-lsp haskell-language-server # Overwrite kak-lsp.toml lsp-config ]; name = "kak-lsp-${kak-lsp.version}"; nativeBuildInputs = [ makeWrapper ]; postBuild = '' wrapProgram $out/bin/kak-lsp --add-flags "--config $out/share/kak-lsp/kak-lsp.toml" ''; }) ]