diff options
| author | Maxime Coste <mawww@kakoune.org> | 2018-06-25 22:04:33 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2018-07-05 07:54:28 +1000 |
| commit | b4b335155edbc49a1f787519c08ead72d7cdc8ee (patch) | |
| tree | 57f0026673d4c42c096388600948f25ccf4a7cc6 | |
| parent | 18dfecfa9d112e536829aef72b073f276c32dee1 (diff) | |
Refactor add-highlighter to make naming explicit
The highlighter name must be given as part of the path of the
highlighter, as the last element.
Fixes #1712
| -rw-r--r-- | rc/core/c-family.kak | 74 | ||||
| -rw-r--r-- | rc/core/kakrc.kak | 27 | ||||
| -rw-r--r-- | rc/core/sh.kak | 24 | ||||
| -rw-r--r-- | src/commands.cc | 8 | ||||
| -rw-r--r-- | src/highlighter.cc | 2 | ||||
| -rw-r--r-- | src/highlighter.hh | 6 | ||||
| -rw-r--r-- | src/highlighter_group.cc | 12 | ||||
| -rw-r--r-- | src/highlighter_group.hh | 2 | ||||
| -rw-r--r-- | src/highlighters.cc | 83 |
9 files changed, 120 insertions, 118 deletions
diff --git a/rc/core/c-family.kak b/rc/core/c-family.kak index 6cff4ab7..cdaa5eac 100644 --- a/rc/core/c-family.kak +++ b/rc/core/c-family.kak @@ -136,7 +136,7 @@ evaluate-commands %sh{ fi printf %s\\n ' - add-highlighter shared/ regions -default code -match-capture FT \ + add-highlighter shared/FT regions -default code -match-capture \ string %{MAYBEAT(?<!QUOTE)(?<!QUOTE\\)"} %{(?<!\\)(?:\\\\)*"} "" \ string %{R"([^(]*)\(} %{\)([^")]*)"} "" \ comment /\* \*/ "" \ @@ -144,17 +144,17 @@ evaluate-commands %sh{ disabled ^\h*?#\h*if\h+(?:0|FALSE)\b "#\h*(?:else|elif|endif)" "#\h*if(?:def)?" \ macro %{^\h*?\K#} %{(?<!\\)\n} "" - add-highlighter shared/FT/string fill string - add-highlighter shared/FT/comment fill comment - add-highlighter shared/FT/disabled fill rgb:666666 - add-highlighter shared/FT/macro fill meta - add-highlighter shared/FT/macro regex ^\h*#include\h+(\S*) 1:module + add-highlighter shared/FT/string/fill fill string + add-highlighter shared/FT/comment/fill fill comment + add-highlighter shared/FT/disabled/fill fill rgb:666666 + add-highlighter shared/FT/macro/fill fill meta + add-highlighter shared/FT/macro/include regex ^\h*#include\h+(\S*) 1:module ' | sed -e "s/FT/${ft}/g; s/QUOTE/'/g; s/MAYBEAT/${maybe_at}/;" done } # c specific -add-highlighter shared/c/code regex %{\b-?(0x[0-9a-fA-F]+|\d+)[fdiu]?|'((\\.)?|[^'\\])'} 0:value +add-highlighter shared/c/code/numbers regex %{\b-?(0x[0-9a-fA-F]+|\d+)[fdiu]?|'((\\.)?|[^'\\])'} 0:value evaluate-commands %sh{ # Grammar keywords="asm break case continue default do else for goto if return @@ -173,31 +173,31 @@ evaluate-commands %sh{ # Highlight keywords printf %s " - add-highlighter shared/c/code regex \b($(join "${keywords}" '|'))\b 0:keyword - add-highlighter shared/c/code regex \b($(join "${attributes}" '|'))\b 0:attribute - add-highlighter shared/c/code regex \b($(join "${types}" '|'))\b 0:type - add-highlighter shared/c/code regex \b($(join "${values}" '|'))\b 0:value + add-highlighter shared/c/code/keywords regex \b($(join "${keywords}" '|'))\b 0:keyword + add-highlighter shared/c/code/attributes regex \b($(join "${attributes}" '|'))\b 0:attribute + add-highlighter shared/c/code/types regex \b($(join "${types}" '|'))\b 0:type + add-highlighter shared/c/code/values regex \b($(join "${values}" '|'))\b 0:value " } # c++ specific # integer literals -add-highlighter shared/cpp/code regex %{(?i)(?<!\.)\b[1-9]('?\d+)*(ul?l?|ll?u?)?\b(?!\.)} 0:value -add-highlighter shared/cpp/code regex %{(?i)(?<!\.)\b0b[01]('?[01]+)*(ul?l?|ll?u?)?\b(?!\.)} 0:value -add-highlighter shared/cpp/code regex %{(?i)(?<!\.)\b0('?[0-7]+)*(ul?l?|ll?u?)?\b(?!\.)} 0:value -add-highlighter shared/cpp/code regex %{(?i)(?<!\.)\b0x[\da-f]('?[\da-f]+)*(ul?l?|ll?u?)?\b(?!\.)} 0:value +add-highlighter shared/cpp/code/integer1 regex %{(?i)(?<!\.)\b[1-9]('?\d+)*(ul?l?|ll?u?)?\b(?!\.)} 0:value +add-highlighter shared/cpp/code/integer2 regex %{(?i)(?<!\.)\b0b[01]('?[01]+)*(ul?l?|ll?u?)?\b(?!\.)} 0:value +add-highlighter shared/cpp/code/integer3 regex %{(?i)(?<!\.)\b0('?[0-7]+)*(ul?l?|ll?u?)?\b(?!\.)} 0:value +add-highlighter shared/cpp/code/integer4 regex %{(?i)(?<!\.)\b0x[\da-f]('?[\da-f]+)*(ul?l?|ll?u?)?\b(?!\.)} 0:value # floating point literals -add-highlighter shared/cpp/code regex %{(?i)(?<!\.)\b\d('?\d+)*\.([fl]\b|\B)(?!\.)} 0:value -add-highlighter shared/cpp/code regex %{(?i)(?<!\.)\b\d('?\d+)*\.?e[+-]?\d('?\d+)*[fl]?\b(?!\.)} 0:value -add-highlighter shared/cpp/code regex %{(?i)(?<!\.)(\b(\d('?\d+)*)|\B)\.\d('?[\d]+)*(e[+-]?\d('?\d+)*)?[fl]?\b(?!\.)} 0:value -add-highlighter shared/cpp/code regex %{(?i)(?<!\.)\b0x[\da-f]('?[\da-f]+)*\.([fl]\b|\B)(?!\.)} 0:value -add-highlighter shared/cpp/code regex %{(?i)(?<!\.)\b0x[\da-f]('?[\da-f]+)*\.?p[+-]?\d('?\d+)*)?[fl]?\b(?!\.)} 0:value -add-highlighter shared/cpp/code regex %{(?i)(?<!\.)\b0x([\da-f]('?[\da-f]+)*)?\.\d('?[\d]+)*(p[+-]?\d('?\d+)*)?[fl]?\b(?!\.)} 0:value +add-highlighter shared/cpp/code/float1 regex %{(?i)(?<!\.)\b\d('?\d+)*\.([fl]\b|\B)(?!\.)} 0:value +add-highlighter shared/cpp/code/float2 regex %{(?i)(?<!\.)\b\d('?\d+)*\.?e[+-]?\d('?\d+)*[fl]?\b(?!\.)} 0:value +add-highlighter shared/cpp/code/float3 regex %{(?i)(?<!\.)(\b(\d('?\d+)*)|\B)\.\d('?[\d]+)*(e[+-]?\d('?\d+)*)?[fl]?\b(?!\.)} 0:value +add-highlighter shared/cpp/code/float4 regex %{(?i)(?<!\.)\b0x[\da-f]('?[\da-f]+)*\.([fl]\b|\B)(?!\.)} 0:value +add-highlighter shared/cpp/code/float5 regex %{(?i)(?<!\.)\b0x[\da-f]('?[\da-f]+)*\.?p[+-]?\d('?\d+)*)?[fl]?\b(?!\.)} 0:value +add-highlighter shared/cpp/code/float6 regex %{(?i)(?<!\.)\b0x([\da-f]('?[\da-f]+)*)?\.\d('?[\d]+)*(p[+-]?\d('?\d+)*)?[fl]?\b(?!\.)} 0:value # character literals (no multi-character literals) -add-highlighter shared/cpp/code regex %{(\b(u8|u|U|L)|\B)'((\\.)|[^'\\])'\B} 0:value +add-highlighter shared/cpp/code/char regex %{(\b(u8|u|U|L)|\B)'((\\.)|[^'\\])'\B} 0:value evaluate-commands %sh{ # Grammar @@ -223,10 +223,10 @@ evaluate-commands %sh{ # Highlight keywords printf %s " - add-highlighter shared/cpp/code regex \b($(join "${keywords}" '|'))\b 0:keyword - add-highlighter shared/cpp/code regex \b($(join "${attributes}" '|'))\b 0:attribute - add-highlighter shared/cpp/code regex \b($(join "${types}" '|'))\b 0:type - add-highlighter shared/cpp/code regex \b($(join "${values}" '|'))\b 0:value + add-highlighter shared/cpp/code/keywords regex \b($(join "${keywords}" '|'))\b 0:keyword + add-highlighter shared/cpp/code/attributes regex \b($(join "${attributes}" '|'))\b 0:attribute + add-highlighter shared/cpp/code/types regex \b($(join "${types}" '|'))\b 0:type + add-highlighter shared/cpp/code/values regex \b($(join "${values}" '|'))\b 0:value " } @@ -235,13 +235,13 @@ evaluate-commands %sh{ builtin_macros="__cplusplus|__STDC_HOSTED__|__FILE__|__LINE__|__DATE__|__TIME__|__STDCPP_DEFAULT_NEW_ALIGNMENT__" printf %s " - add-highlighter shared/c/code regex \b(${builtin_macros})\b 0:builtin - add-highlighter shared/cpp/code regex \b(${builtin_macros})\b 0:builtin + add-highlighter shared/c/code/macros regex \b(${builtin_macros})\b 0:builtin + add-highlighter shared/cpp/code/macros regex \b(${builtin_macros})\b 0:builtin " } # objective-c specific -add-highlighter shared/objc/code regex %{\b-?\d+[fdiu]?|'((\\.)?|[^'\\])'} 0:value +add-highlighter shared/objc/code/number regex %{\b-?\d+[fdiu]?|'((\\.)?|[^'\\])'} 0:value evaluate-commands %sh{ # Grammar @@ -265,11 +265,11 @@ evaluate-commands %sh{ # Highlight keywords printf %s " - add-highlighter shared/objc/code regex \b($(join "${keywords}" '|'))\b 0:keyword - add-highlighter shared/objc/code regex \b($(join "${attributes}" '|'))\b 0:attribute - add-highlighter shared/objc/code regex \b($(join "${types}" '|'))\b 0:type - add-highlighter shared/objc/code regex \b($(join "${values}" '|'))\b 0:value - add-highlighter shared/objc/code regex @($(join "${decorators}" '|'))\b 0:attribute + add-highlighter shared/objc/code/keywords regex \b($(join "${keywords}" '|'))\b 0:keyword + add-highlighter shared/objc/code/attributes regex \b($(join "${attributes}" '|'))\b 0:attribute + add-highlighter shared/objc/code/types regex \b($(join "${types}" '|'))\b 0:type + add-highlighter shared/objc/code/values regex \b($(join "${values}" '|'))\b 0:value + add-highlighter shared/objc/code/decorators regex @($(join "${decorators}" '|'))\b 0:attribute " } @@ -298,13 +298,13 @@ hook global WinSetOption filetype=(?!c)(?!cpp)(?!objc).* %[ unalias window alt c-family-alternative-file ] -hook -group c-highlight global WinSetOption filetype=c %[ add-highlighter window ref c ] +hook -group c-highlight global WinSetOption filetype=c %[ add-highlighter window/c ref c ] hook -group c-highlight global WinSetOption filetype=(?!c).* %[ remove-highlighter window/c ] -hook -group cpp-highlight global WinSetOption filetype=cpp %[ add-highlighter window ref cpp ] +hook -group cpp-highlight global WinSetOption filetype=cpp %[ add-highlighter window/cpp ref cpp ] hook -group cpp-highlight global WinSetOption filetype=(?!cpp).* %[ remove-highlighter window/cpp ] -hook -group objc-highlight global WinSetOption filetype=objc %[ add-highlighter window ref objc ] +hook -group objc-highlight global WinSetOption filetype=objc %[ add-highlighter window/objc ref objc ] hook -group objc-highlight global WinSetOption filetype=(?!objc).* %[ remove-highlighter window/objc ] declare-option -docstring %{control the type of include guard to be inserted in empty headers diff --git a/rc/core/kakrc.kak b/rc/core/kakrc.kak index 9c279688..6e2b5a9b 100644 --- a/rc/core/kakrc.kak +++ b/rc/core/kakrc.kak @@ -11,7 +11,7 @@ hook global BufCreate (.*/)?(kakrc|.*.kak) %{ # Highlighters & Completion # ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ -add-highlighter shared/ regions -default code kakrc \ +add-highlighter shared/kakrc regions -default code \ comment (^|\h)\K# $ '' \ double_string %{(^|\h)\K"} %{"(?!")} %{(?<!")("")+(?!")} \ single_string %{(^|\h)\K'} %{'(?!')} %{(?<!')('')+(?!')} \ @@ -48,20 +48,21 @@ evaluate-commands %sh{ }" # Highlight keywords (which are always surrounded by whitespace) - printf '%s\n' "add-highlighter shared/kakrc/code regex (?:\s|\A)\K($(join "${keywords}" '|'))(?:(?=\s)|\z) 0:keyword - add-highlighter shared/kakrc/code regex (?:\s|\A)\K($(join "${attributes}" '|'))(?:(?=\s)|\z) 0:attribute - add-highlighter shared/kakrc/code regex (?:\s|\A)\K($(join "${types}" '|'))(?:(?=\s)|\z) 0:type - add-highlighter shared/kakrc/code regex (?:\s|\A)\K($(join "${values}" '|'))(?:(?=\s)|\z) 0:value" + printf '%s\n' "add-highlighter shared/kakrc/code/keywords regex (?:\s|\A)\K($(join "${keywords}" '|'))(?:(?=\s)|\z) 0:keyword + add-highlighter shared/kakrc/code/attributes regex (?:\s|\A)\K($(join "${attributes}" '|'))(?:(?=\s)|\z) 0:attribute + add-highlighter shared/kakrc/code/types regex (?:\s|\A)\K($(join "${types}" '|'))(?:(?=\s)|\z) 0:type + add-highlighter shared/kakrc/code/values regex (?:\s|\A)\K($(join "${values}" '|'))(?:(?=\s)|\z) 0:value" } -add-highlighter shared/kakrc/code regex \brgb:[0-9a-fA-F]{6}\b 0:value +add-highlighter shared/kakrc/code/colors regex \brgb:[0-9a-fA-F]{6}\b 0:value +add-highlighter shared/kakrc/code/scopes regex \b(global|shared|buffer|window)(?:\b|/) 0:value -add-highlighter shared/kakrc/double_string fill string -add-highlighter shared/kakrc/double_string regex '""' 0:default+b -add-highlighter shared/kakrc/single_string fill string -add-highlighter shared/kakrc/single_string regex "''" 0:default+b -add-highlighter shared/kakrc/comment fill comment -add-highlighter shared/kakrc/shell ref sh +add-highlighter shared/kakrc/double_string/fill fill string +add-highlighter shared/kakrc/double_string/escape regex '""' 0:default+b +add-highlighter shared/kakrc/single_string/fill fill string +add-highlighter shared/kakrc/single_string/escape regex "''" 0:default+b +add-highlighter shared/kakrc/comment/fill fill comment +add-highlighter shared/kakrc/shell/sh ref sh # Commands # ‾‾‾‾‾‾‾‾ @@ -82,7 +83,7 @@ define-command -hidden kak-indent-on-new-line %{ # Initialization # ‾‾‾‾‾‾‾‾‾‾‾‾‾‾ -hook -group kak-highlight global WinSetOption filetype=kak %{ add-highlighter window ref kakrc } +hook -group kak-highlight global WinSetOption filetype=kak %{ add-highlighter window/kakrc ref kakrc } hook global WinSetOption filetype=kak %{ hook window InsertChar \n -group kak-indent kak-indent-on-new-line diff --git a/rc/core/sh.kak b/rc/core/sh.kak index bd7e2966..486a6c6b 100644 --- a/rc/core/sh.kak +++ b/rc/core/sh.kak @@ -2,16 +2,16 @@ hook global BufCreate .*\.(z|ba|c|k|mk)?sh(rc|_profile)? %{ set-option buffer filetype sh } -add-highlighter shared/ regions -default code -match-capture sh \ +add-highlighter shared/sh regions -default code -match-capture \ double_string %{(?<!\\)(?:\\\\)*\K"} %{(?<!\\)(?:\\\\)*"} '' \ single_string %{(?<!\\)(?:\\\\)*\K'} %{'} '' \ comment '(?<!\$)#' '$' '' \ heredoc '<<-?(\w+)' '^\t*(\w+)$' '' -add-highlighter shared/sh/double_string fill string -add-highlighter shared/sh/single_string fill string -add-highlighter shared/sh/comment fill comment -add-highlighter shared/sh/heredoc fill string +add-highlighter shared/sh/double_string/fill fill string +add-highlighter shared/sh/single_string/fill fill string +add-highlighter shared/sh/comment/fill fill comment +add-highlighter shared/sh/heredoc/fill fill string evaluate-commands %sh{ # Grammar @@ -27,15 +27,15 @@ evaluate-commands %sh{ }" | tr '|' ' ' # Highlight keywords - printf %s "add-highlighter shared/sh/code regex \b(${keywords})\b 0:keyword" + printf %s "add-highlighter shared/sh/code/keywords regex \b(${keywords})\b 0:keyword" } -add-highlighter shared/sh/code regex [\[\]\(\)&|]{1,2} 0:operator -add-highlighter shared/sh/code regex (\w+)= 1:variable -add-highlighter shared/sh/code regex ^\h*(\w+)\h*\(\) 1:variable +add-highlighter shared/sh/code/operators regex [\[\]\(\)&|]{1,2} 0:operator +add-highlighter shared/sh/code/variable regex (\w+)= 1:variable +add-highlighter shared/sh/code/function regex ^\h*(\w+)\h*\(\) 1:function -add-highlighter shared/sh/code regex \$(\w+|\{.+?\}|#|@|\?|\$|!|-|\*) 0:value -add-highlighter shared/sh/double_string regex \$(\w+|\{.+?\}) 0:value +add-highlighter shared/sh/code/expansion regex \$(\w+|\{.+?\}|#|@|\?|\$|!|-|\*) 0:value +add-highlighter shared/sh/double_string/expansion regex \$(\w+|\{.+?\}) 0:value -hook -group sh-highlight global WinSetOption filetype=sh %{ add-highlighter window ref sh } +hook -group sh-highlight global WinSetOption filetype=sh %{ add-highlighter window/sh ref sh } hook -group sh-highlight global WinSetOption filetype=(?!sh).* %{ remove-highlighter window/sh } diff --git a/src/commands.cc b/src/commands.cc index d06c050a..f77da3b2 100644 --- a/src/commands.cc +++ b/src/commands.cc @@ -757,7 +757,13 @@ const CommandDesc add_highlighter_cmd = { auto it = registry.find(name); if (it == registry.end()) throw runtime_error(format("no such highlighter factory: '{}'", name)); - get_highlighter(context, path).add_child(it->value.factory(highlighter_params)); + + auto slash = find(path | reverse(), '/'); + if (slash == path.rend()) + throw runtime_error("expected name in path"); + + get_highlighter(context, {path.begin(), slash.base() - 1}).add_child( + {slash.base(), path.end()}, it->value.factory(highlighter_params)); // TODO: better, this will fail if we touch scopes highlighters that impact multiple windows if (context.has_window()) diff --git a/src/highlighter.cc b/src/highlighter.cc index 164ea065..20a70fe2 100644 --- a/src/highlighter.cc +++ b/src/highlighter.cc @@ -34,7 +34,7 @@ Highlighter& Highlighter::get_child(StringView path) throw runtime_error("this highlighter does not hold children"); } -void Highlighter::add_child(HighlighterAndId&& hl) +void Highlighter::add_child(String name, std::unique_ptr<Highlighter>&& hl) { throw runtime_error("this highlighter does not hold children"); } diff --git a/src/highlighter.hh b/src/highlighter.hh index 033116a9..b077cc44 100644 --- a/src/highlighter.hh +++ b/src/highlighter.hh @@ -35,8 +35,6 @@ constexpr bool with_bit_ops(Meta::Type<HighlightPass>) { return true; } struct Highlighter; -using HighlighterAndId = std::pair<String, std::unique_ptr<Highlighter>>; - struct DisplaySetup { // Window position relative to the buffer origin @@ -71,7 +69,7 @@ struct Highlighter virtual bool has_children() const; virtual Highlighter& get_child(StringView path); - virtual void add_child(HighlighterAndId&& hl); + virtual void add_child(String name, std::unique_ptr<Highlighter>&& hl); virtual void remove_child(StringView id); virtual Completions complete_child(StringView path, ByteCount cursor_pos, bool group) const; virtual void fill_unique_ids(Vector<StringView>& unique_ids) const; @@ -86,7 +84,7 @@ private: }; using HighlighterParameters = ConstArrayView<String>; -using HighlighterFactory = std::function<HighlighterAndId (HighlighterParameters params)>; +using HighlighterFactory = std::function<std::unique_ptr<Highlighter> (HighlighterParameters params)>; struct HighlighterFactoryAndDocstring { diff --git a/src/highlighter_group.cc b/src/highlighter_group.cc index 173d8348..a686fc4d 100644 --- a/src/highlighter_group.cc +++ b/src/highlighter_group.cc @@ -24,17 +24,17 @@ void HighlighterGroup::fill_unique_ids(Vector<StringView>& unique_ids) const hl.value->fill_unique_ids(unique_ids); } -void HighlighterGroup::add_child(HighlighterAndId&& hl) +void HighlighterGroup::add_child(String name, std::unique_ptr<Highlighter>&& hl) { - if ((hl.second->passes() & passes()) != hl.second->passes()) + if ((hl->passes() & passes()) != hl->passes()) throw runtime_error{"cannot add that highlighter to this group, passes don't match"}; - hl.first = replace(hl.first, "/", "<slash>"); + name = replace(name, "/", "<slash>"); - if (m_highlighters.contains(hl.first)) - throw runtime_error(format("duplicate id: '{}'", hl.first)); + if (m_highlighters.contains(name)) + throw runtime_error(format("duplicate id: '{}'", name)); - m_highlighters.insert({std::move(hl.first), std::move(hl.second)}); + m_highlighters.insert({std::move(name), std::move(hl)}); } void HighlighterGroup::remove_child(StringView id) diff --git a/src/highlighter_group.hh b/src/highlighter_group.hh index e2af86ef..357a0501 100644 --- a/src/highlighter_group.hh +++ b/src/highlighter_group.hh @@ -21,7 +21,7 @@ public: HighlighterGroup(HighlightPass passes) : Highlighter{passes} {} bool has_children() const override { return true; } - void add_child(HighlighterAndId&& hl) override; + void add_child(String name, std::unique_ptr<Highlighter>&& hl) override; void remove_child(StringView id) override; Highlighter& get_child(StringView path) override; diff --git a/src/highlighters.cc b/src/highlighters.cc index cf470c34..7e530385 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -220,7 +220,7 @@ auto apply_face = [](const Face& face) }; }; -static HighlighterAndId create_fill_highlighter(HighlighterParameters params) +static std::unique_ptr<Highlighter> create_fill_highlighter(HighlighterParameters params) { if (params.size() != 1) throw runtime_error("wrong parameter count"); @@ -231,7 +231,7 @@ static HighlighterAndId create_fill_highlighter(HighlighterParameters params) highlight_range(display_buffer, range.begin, range.end, false, apply_face(context.context.faces()[facespec])); }; - return {"fill_" + facespec, make_highlighter(std::move(func))}; + return make_highlighter(std::move(func)); } template<typename T> @@ -302,7 +302,7 @@ public: ++m_regex_version; } - static HighlighterAndId create(HighlighterParameters params) + static std::unique_ptr<Highlighter> create(HighlighterParameters params) { if (params.size() < 2) throw runtime_error("wrong parameter count"); @@ -317,12 +317,9 @@ public: faces.emplace_back(capture, String{colon+1, spec.end()}); } - String id = format("hlregex'{}'", params[0]); - Regex ex{params[0], RegexCompileFlags::Optimize}; - return {id, std::make_unique<RegexHighlighter>(std::move(ex), - std::move(faces))}; + return std::make_unique<RegexHighlighter>(std::move(ex), std::move(faces)); } private: @@ -481,7 +478,7 @@ private: RegexHighlighter m_highlighter; }; -HighlighterAndId create_dynamic_regex_highlighter(HighlighterParameters params) +std::unique_ptr<Highlighter> create_dynamic_regex_highlighter(HighlighterParameters params) { if (params.size() < 2) throw runtime_error("wrong parameter count"); @@ -513,7 +510,7 @@ HighlighterAndId create_dynamic_regex_highlighter(HighlighterParameters params) auto get_regex = [option_name = token->content](const Context& context) { return context.options()[option_name].get<Regex>(); }; - return {format("dynregex_{}", params[0]), make_hl(get_regex, get_face)}; + return make_hl(get_regex, get_face); } auto get_regex = [expr = params[0]](const Context& context){ @@ -528,10 +525,10 @@ HighlighterAndId create_dynamic_regex_highlighter(HighlighterParameters params) return Regex{}; } }; - return {format("dynregex_{}", params[0]), make_hl(get_regex, get_face)}; + return make_hl(get_regex, get_face); } -HighlighterAndId create_line_highlighter(HighlighterParameters params) +std::unique_ptr<Highlighter> create_line_highlighter(HighlighterParameters params) { if (params.size() != 2) throw runtime_error("wrong parameter count"); @@ -575,10 +572,10 @@ HighlighterAndId create_line_highlighter(HighlighterParameters params) it->push_back({ String{' ', remaining}, face }); }; - return {"hlline_" + params[0], make_highlighter(std::move(func))}; + return make_highlighter(std::move(func)); } -HighlighterAndId create_column_highlighter(HighlighterParameters params) +std::unique_ptr<Highlighter> create_column_highlighter(HighlighterParameters params) { if (params.size() != 2) throw runtime_error("wrong parameter count"); @@ -634,7 +631,7 @@ HighlighterAndId create_column_highlighter(HighlighterParameters params) } }; - return {"hlcol_" + params[0], make_highlighter(std::move(func))}; + return make_highlighter(std::move(func)); } struct WrapHighlighter : Highlighter @@ -853,7 +850,7 @@ struct WrapHighlighter : Highlighter return get_column(buffer, tabstop, {line, col}); } - static HighlighterAndId create(HighlighterParameters params) + static std::unique_ptr<Highlighter> create(HighlighterParameters params) { static const ParameterDesc param_desc{ { { "word", { false, "" } }, @@ -868,9 +865,9 @@ struct WrapHighlighter : Highlighter if (auto width = parser.get_switch("width")) max_width = str_to_int(*width); - return {"wrap", std::make_unique<WrapHighlighter>(max_width, (bool)parser.get_switch("word"), - (bool)parser.get_switch("indent"), - parser.get_switch("marker").value_or("").str())}; + return std::make_unique<WrapHighlighter>(max_width, (bool)parser.get_switch("word"), + (bool)parser.get_switch("indent"), + parser.get_switch("marker").value_or("").str()); } const bool m_word_wrap; @@ -987,7 +984,7 @@ void show_whitespaces(HighlightContext context, DisplayBuffer& display_buffer, B } } -HighlighterAndId show_whitespaces_factory(HighlighterParameters params) +std::unique_ptr<Highlighter> show_whitespaces_factory(HighlighterParameters params) { static const ParameterDesc param_desc{ { { "tab", { true, "" } }, @@ -1013,7 +1010,7 @@ HighlighterAndId show_whitespaces_factory(HighlighterParameters params) get_param("lf", "¬"), get_param("nbsp", "⍽")); - return {"show_whitespaces", make_highlighter(std::move(func), HighlightPass::Move)}; + return make_highlighter(std::move(func), HighlightPass::Move); } struct LineNumbersHighlighter : Highlighter @@ -1024,7 +1021,7 @@ struct LineNumbersHighlighter : Highlighter m_hl_cursor_line{hl_cursor_line}, m_separator{std::move(separator)} {} - static HighlighterAndId create(HighlighterParameters params) + static std::unique_ptr<Highlighter> create(HighlighterParameters params) { static const ParameterDesc param_desc{ { { "relative", { false, "" } }, @@ -1038,7 +1035,7 @@ struct LineNumbersHighlighter : Highlighter if (separator.length() > 10) throw runtime_error("separator length is limited to 10 bytes"); - return {"number_lines", std::make_unique<LineNumbersHighlighter>((bool)parser.get_switch("relative"), (bool)parser.get_switch("hlcursor"), separator.str())}; + return std::make_unique<LineNumbersHighlighter>((bool)parser.get_switch("relative"), (bool)parser.get_switch("hlcursor"), separator.str()); } private: @@ -1161,9 +1158,9 @@ void show_matching_char(HighlightContext context, DisplayBuffer& display_buffer, } } -HighlighterAndId create_matching_char_highlighter(HighlighterParameters params) +std::unique_ptr<Highlighter> create_matching_char_highlighter(HighlighterParameters params) { - return {"show_matching", make_highlighter(show_matching_char)}; + return make_highlighter(show_matching_char); } void highlight_selections(HighlightContext context, DisplayBuffer& display_buffer, BufferRange) @@ -1282,7 +1279,7 @@ struct FlagLinesHighlighter : Highlighter m_option_name{std::move(option_name)}, m_default_face{std::move(default_face)} {} - static HighlighterAndId create(HighlighterParameters params) + static std::unique_ptr<Highlighter> create(HighlighterParameters params) { if (params.size() != 2) throw runtime_error("wrong parameter count"); @@ -1293,7 +1290,7 @@ struct FlagLinesHighlighter : Highlighter // throw if wrong option type GlobalScope::instance().options()[option_name].get<LineAndSpecList>(); - return {"hlflags_" + params[1], std::make_unique<FlagLinesHighlighter>(option_name, default_face) }; + return std::make_unique<FlagLinesHighlighter>(option_name, default_face); } private: @@ -1427,7 +1424,7 @@ struct RangesHighlighter : Highlighter : Highlighter{HighlightPass::Colorize} , m_option_name{std::move(option_name)} {} - static HighlighterAndId create(HighlighterParameters params) + static std::unique_ptr<Highlighter> create(HighlighterParameters params) { if (params.size() != 1) throw runtime_error("wrong parameter count"); @@ -1436,7 +1433,7 @@ struct RangesHighlighter : Highlighter // throw if wrong option type GlobalScope::instance().options()[option_name].get<RangeAndStringList>(); - return {"hlranges_" + params[0], std::make_unique<RangesHighlighter>(option_name)}; + return std::make_unique<RangesHighlighter>(option_name); } private: @@ -1469,7 +1466,7 @@ struct ReplaceRangesHighlighter : Highlighter : Highlighter{HighlightPass::Colorize} , m_option_name{std::move(option_name)} {} - static HighlighterAndId create(HighlighterParameters params) + static std::unique_ptr<Highlighter> create(HighlighterParameters params) { if (params.size() != 1) throw runtime_error("wrong parameter count"); @@ -1478,7 +1475,7 @@ struct ReplaceRangesHighlighter : Highlighter // throw if wrong option type GlobalScope::instance().options()[option_name].get<RangeAndStringList>(); - return {"replace_ranges_" + params[0], std::make_unique<ReplaceRangesHighlighter>(option_name)}; + return std::make_unique<ReplaceRangesHighlighter>(option_name); } private: @@ -1532,16 +1529,16 @@ HighlightPass parse_passes(StringView str) return passes; } -HighlighterAndId create_highlighter_group(HighlighterParameters params) +std::unique_ptr<Highlighter> create_highlighter_group(HighlighterParameters params) { static const ParameterDesc param_desc{ { { "passes", { true, "" } } }, - ParameterDesc::Flags::SwitchesOnlyAtStart, 1, 1 + ParameterDesc::Flags::SwitchesOnlyAtStart, 0, 0 }; ParametersParser parser{params, param_desc}; HighlightPass passes = parse_passes(parser.get_switch("passes").value_or("colorize")); - return HighlighterAndId(parser[0], std::make_unique<HighlighterGroup>(passes)); + return std::make_unique<HighlighterGroup>(passes); } struct ReferenceHighlighter : Highlighter @@ -1549,7 +1546,7 @@ struct ReferenceHighlighter : Highlighter ReferenceHighlighter(HighlightPass passes, String name) : Highlighter{passes}, m_name{std::move(name)} {} - static HighlighterAndId create(HighlighterParameters params) + static std::unique_ptr<Highlighter> create(HighlighterParameters params) { static const ParameterDesc param_desc{ { { "passes", { true, "" } } }, @@ -1557,7 +1554,7 @@ struct ReferenceHighlighter : Highlighter }; ParametersParser parser{params, param_desc}; HighlightPass passes = parse_passes(parser.get_switch("passes").value_or("colorize")); - return {parser[0], std::make_unique<ReferenceHighlighter>(passes, parser[0])}; + return std::make_unique<ReferenceHighlighter>(passes, parser[0]); } private: @@ -1855,7 +1852,7 @@ public: return { 0, 0, complete(path, cursor_pos, container) }; } - static HighlighterAndId create(HighlighterParameters params) + static std::unique_ptr<Highlighter> create(HighlighterParameters params) { static const ParameterDesc param_desc{ { { "default", { true, "" } }, { "match-capture", { false, "" } } }, @@ -1863,12 +1860,12 @@ public: }; ParametersParser parser{params, param_desc}; - if ((parser.positional_count() % 4) != 1) - throw runtime_error("wrong parameter count, expected <id> (<group name> <begin> <end> <recurse>)+"); + if ((parser.positional_count() % 4) != 0) + throw runtime_error("wrong parameter count, expected (<group name> <begin> <end> <recurse>)+"); const bool match_capture = (bool)parser.get_switch("match-capture"); RegionsHighlighter::RegionDescList regions; - for (size_t i = 1; i < parser.positional_count(); i += 4) + for (size_t i = 0; i < parser.positional_count(); i += 4) { if (parser[i].empty() or parser[i+1].empty() or parser[i+2].empty()) throw runtime_error("group id, begin and end must not be empty"); @@ -1883,7 +1880,7 @@ public: } auto default_group = parser.get_switch("default").value_or(StringView{}).str(); - return {parser[0], std::make_unique<RegionsHighlighter>(std::move(regions), default_group)}; + return std::make_unique<RegionsHighlighter>(std::move(regions), default_group); } private: @@ -1997,9 +1994,9 @@ private: void setup_builtin_highlighters(HighlighterGroup& group) { - group.add_child({"tabulations"_str, std::make_unique<TabulationHighlighter>()}); - group.add_child({"unprintable"_str, make_highlighter(expand_unprintable)}); - group.add_child({"selections"_str, make_highlighter(highlight_selections)}); + group.add_child("tabulations"_str, std::make_unique<TabulationHighlighter>()); + group.add_child("unprintable"_str, make_highlighter(expand_unprintable)); + group.add_child("selections"_str, make_highlighter(highlight_selections)); } void register_highlighters() |
