{ lib , callPackage , formats , runCommandLocal , kak-tree-sitter , ... }: let utils = callPackage ../utils.nix { }; grammars = (callPackage ./grammars.nix { }).grammars; # Highlighter groups to add to the `highlighterGroups`. Maps from group names to face names. highlighterGroups = { attribute = "@attribute"; comment = "@comment"; conceal = "%opt{mauve}+i"; constant = "%opt{peach}"; constant_builtin_boolean = "%opt{sky}"; constant_character = "%opt{yellow}"; constant_macro = "%opt{mauve}"; constant_numeric = "%opt{peach}"; constructor = "%opt{sapphire}"; diff_plus = "%opt{green}"; diff_minus = "%opt{red}"; diff_delta = "%opt{blue}"; diff_delta_moved = "%opt{mauve}"; error = "%opt{red}+b"; function = "@function"; function_builtin = "@builtin"; function_macro = "+i@ts_function"; hint = "%opt{blue}+b"; info = "%opt{green}+b"; keyword = "keyword"; keyword_conditional = "+i@ts_keyword"; keyword_control_conditional = "+i@ts_keyword"; keyword_control_directive = "+i@ts_keyword"; keyword_control_import = "+i@ts_keyword"; keyword_directive = "+i@ts_keyword"; label = "%opt{sapphire}+i"; markup_bold = "%opt{peach}+b"; markup_heading = "%opt{red}"; markup_heading_1 = "%opt{red}"; markup_heading_2 = "%opt{mauve}"; markup_heading_3 = "%opt{green}"; markup_heading_4 = "%opt{yellow}"; markup_heading_5 = "%opt{pink}"; markup_heading_6 = "%opt{teal}"; markup_heading_marker = "%opt{peach}+b"; markup_italic = "%opt{pink}+i"; markup_list_checked = "%opt{green}"; markup_list_numbered = "%opt{blue}+i"; markup_list_unchecked = "%opt{teal}"; markup_list_unnumbered = "%opt{mauve}"; markup_link_label = "%opt{blue}"; markup_link_url = "%opt{teal}+u"; markup_link_uri = "%opt{teal}+u"; markup_link_text = "%opt{blue}"; markup_quote = "%opt{crust}"; markup_raw = "%opt{sky}"; markup_raw_block = "%opt{sky}"; markup_raw_inline = "%opt{green}"; markup_strikethrough = "%opt{crust}+s"; namespace = "@module"; operator = "@operator"; property = "%opt{sky}"; punctuation = "%opt{overlay2}"; punctuation_special = "%opt{sky}"; special = "%opt{blue}"; spell = "%opt{mauve}"; string = "%opt{green}"; string_regex = "%opt{peach}"; string_regexp = "%opt{peach}"; string_escape = "%opt{mauve}"; string_special = "%opt{blue}"; string_special_path = "%opt{green}"; string_special_symbol = "%opt{mauve}"; string_symbol = "%opt{red}"; tag = "%opt{teal}"; tag_error = "%opt{red}"; text_title = "%opt{mauve}"; type = "@type"; type_enum_variant = "+i@ts_type"; variable = "@variable"; variable_builtin = "@builtin"; variable_other_member = "%opt{teal}"; variable_parameter = "+i@variable"; warning = "%opt{peach}+b"; }; # Highlighter groups to be aliased by other groups aliases = { comment_block = "comment"; comment_line = "comment"; constant_character_escape = "constant_character"; constant_numeric_float = "constant_numeric"; constant_numeric_integer = "constant_numeric"; function_method = "function"; function_special = "function"; keyword_control = "keyword"; keyword_control_repeat = "keyword"; keyword_control_return = "keyword"; keyword_control_except = "keyword"; keyword_control_exception = "keyword"; keyword_function = "keyword"; keyword_operator = "keyword"; keyword_special = "keyword"; keyword_storage = "keyword"; keyword_storage_modifier = "keyword"; keyword_storage_modifier_mut = "keyword"; keyword_storage_modifier_ref = "keyword"; keyword_storage_type = "keyword"; punctuation_bracket = "punctuation"; punctuation_delimiter = "punctuation"; text = "string"; type_builtin = "type"; # Scala stuff method = "function"; module = "namespace"; function_call = "function"; method_call = "method"; boolean = "constant_builtin_boolean"; number = "constant_numeric"; float = "constant_numeric_float"; type_qualifier = "keyword_special"; storageclass = "keyword_storage_modifier"; conditional = "keyword_conditional"; include = "keyword_control_import"; }; configFile = let toScm = name: lib.concatStringsSep "." (lib.splitString "_" name); toml = formats.toml { }; in toml.generate "config.toml" { highlight.groups = builtins.map toScm (builtins.attrNames highlighterGroups ++ builtins.attrNames aliases); features = { highlighting = true; text_objects = true; }; language = grammars; }; extraFaces = let toTs = name: "ts_${lib.concatStringsSep "_" (lib.splitString "." name)}"; definedFaces = lib.mapAttrs' (name: value: { inherit value; name = toTs name; }) highlighterGroups; aliasFaces = lib.mapAttrs' (name: value: { name = toTs name; value = "@${toTs value}"; }) aliases; faces = lib.recursiveUpdate definedFaces aliasFaces; in faces; in { rc = '' # Enable kak-tree-sitter eval %sh{kak-tree-sitter --kakoune -d --server --init $kak_session --user-config ${configFile}} map global normal ": enter-user-mode tree-sitter" ''; extraPaths = "${kak-tree-sitter}/bin"; plugin = utils.mkFacesScript "kak-tree-sitter" extraFaces; }