summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2018-06-25 22:04:33 +1000
committerMaxime Coste <mawww@kakoune.org>2018-07-05 07:54:28 +1000
commitb4b335155edbc49a1f787519c08ead72d7cdc8ee (patch)
tree57f0026673d4c42c096388600948f25ccf4a7cc6
parent18dfecfa9d112e536829aef72b073f276c32dee1 (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.kak74
-rw-r--r--rc/core/kakrc.kak27
-rw-r--r--rc/core/sh.kak24
-rw-r--r--src/commands.cc8
-rw-r--r--src/highlighter.cc2
-rw-r--r--src/highlighter.hh6
-rw-r--r--src/highlighter_group.cc12
-rw-r--r--src/highlighter_group.hh2
-rw-r--r--src/highlighters.cc83
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()