summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-07-14 21:42:19 +0100
committerMaxime Coste <frrrwww@gmail.com>2014-07-14 21:42:19 +0100
commitac5cbba0aef36aaa0352cd0a13e6a51a067e546e (patch)
tree37fc985cb612863345d9868a79ec311b8da34f10
parentec37adc5233e2f7ecb9763da2e838eefea0da9c6 (diff)
Remove region highlighter, rename multi_regions to regions, cleanup
-rw-r--r--rc/cpp.kak2
-rw-r--r--rc/fish.kak8
-rw-r--r--rc/javascript.kak12
-rw-r--r--rc/json.kak2
-rw-r--r--rc/kakrc.kak2
-rw-r--r--rc/python.kak12
-rw-r--r--rc/ruby.kak19
-rw-r--r--rc/sh.kak2
-rw-r--r--rc/yaml.kak2
-rw-r--r--share/kak/kakrc2
-rw-r--r--src/highlighters.cc173
11 files changed, 58 insertions, 178 deletions
diff --git a/rc/cpp.kak b/rc/cpp.kak
index 8d6d61c2..3edbd535 100644
--- a/rc/cpp.kak
+++ b/rc/cpp.kak
@@ -39,7 +39,7 @@ def -hidden _cpp_indent_on_closing_curly_brace %[
try %[ exec -draft "hm<space><a-?>(class|struct)<ret><a-k>\`(class|struct)[^{}\n]+(\n)?\s*\{\'<ret><a-space>ma;<esc>" ]
]
-addhl -group / multi_region -default code cpp \
+addhl -group / regions -default code cpp \
string %{(?<!')"} %{(?<!\\)(\\\\)*"} '' \
comment /\* \*/ '' \
comment // $ '' \
diff --git a/rc/fish.kak b/rc/fish.kak
index adb72c12..bf20a4d6 100644
--- a/rc/fish.kak
+++ b/rc/fish.kak
@@ -15,10 +15,10 @@ hook global BufCreate .*[.](fish) %{
# Highlighters
# ‾‾‾‾‾‾‾‾‾‾‾‾
-addhl -group / multi_region -default code fish \
- double_string '"' (?<!\\)(\\\\)*" '' \
- single_string "'" "'" '' \
- comment '#' '$' ''
+addhl -group / regions -default code fish \
+ double_string '"' (?<!\\)(\\\\)*" '' \
+ single_string "'" "'" '' \
+ comment '#' '$' ''
addhl -group /fish/double_string fill string
addhl -group /fish/double_string regex (\$\w+)|(\{\$\w+\}) 0:identifier
diff --git a/rc/javascript.kak b/rc/javascript.kak
index 76850b83..4592d4db 100644
--- a/rc/javascript.kak
+++ b/rc/javascript.kak
@@ -12,12 +12,12 @@ hook global BufCreate .*[.](js) %{
# Highlighters
# ‾‾‾‾‾‾‾‾‾‾‾‾
-addhl -group / multi_region -default code javascript \
- double_string '"' (?<!\\)(\\\\)*" '' \
- single_string "'" "'" '' \
- comment // '$' '' \
- comment /[*] [*]/ '' \
- regex / (?<!\\)(\\\\)*/[gimy]* ''
+addhl -group / regions -default code javascript \
+ double_string '"' (?<!\\)(\\\\)*" '' \
+ single_string "'" "'" '' \
+ comment // '$' '' \
+ comment /[*] [*]/ '' \
+ regex / (?<!\\)(\\\\)*/[gimy]* ''
# Regular expression flags are: g → global match, i → ignore case, m → multi-lines, y → sticky
# https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
diff --git a/rc/json.kak b/rc/json.kak
index 6c8bbe19..f1a32f3b 100644
--- a/rc/json.kak
+++ b/rc/json.kak
@@ -15,7 +15,7 @@ hook global BufCreate .*[.](json) %{
# Highlighters
# ‾‾‾‾‾‾‾‾‾‾‾‾
-addhl -group / multi_region -default code json \
+addhl -group / regions -default code json \
string '"' (?<!\\)(\\\\)*" ''
addhl -group /json/string fill string
diff --git a/rc/kakrc.kak b/rc/kakrc.kak
index fdfd86a3..3b9b9b7d 100644
--- a/rc/kakrc.kak
+++ b/rc/kakrc.kak
@@ -2,7 +2,7 @@ hook global BufCreate (.*/)?(kakrc|.*.kak) %{
set buffer filetype kak
}
-addhl -group / multi_region -default code kakrc \
+addhl -group / regions -default code kakrc \
comment (^|\h)\K\# $ '' \
double_string %{(^|\h)"} %{(?<!\\)(\\\\)*"} '' \
single_string %{(^|\h)'} %{(?<!\\)(\\\\)*'} '' \
diff --git a/rc/python.kak b/rc/python.kak
index d2d2623f..aef4655c 100644
--- a/rc/python.kak
+++ b/rc/python.kak
@@ -15,12 +15,12 @@ hook global BufCreate .*[.](py) %{
# Highlighters
# ‾‾‾‾‾‾‾‾‾‾‾‾
-addhl -group / multi_region -default code python \
- double_string '"""' '"""' '' \
- single_string "'''" "'''" '' \
- double_string '"' (?<!\\)(\\\\)*" '' \
- single_string "'" "'" '' \
- comment '#' '$' ''
+addhl -group / regions -default code python \
+ double_string '"""' '"""' '' \
+ single_string "'''" "'''" '' \
+ double_string '"' (?<!\\)(\\\\)*" '' \
+ single_string "'" "'" '' \
+ comment '#' '$' ''
addhl -group /python/double_string fill string
addhl -group /python/single_string fill string
diff --git a/rc/ruby.kak b/rc/ruby.kak
index 6d420721..bb3a26e6 100644
--- a/rc/ruby.kak
+++ b/rc/ruby.kak
@@ -15,7 +15,7 @@ hook global BufCreate .*(([.](rb))|(irbrc)|(pryrc)|(Capfile|[.]cap)|(Gemfile)|(G
# Highlighters
# ‾‾‾‾‾‾‾‾‾‾‾‾
-addhl -group / multi_region -default code ruby \
+addhl -group / regions -default code ruby \
double_string '"' (?<!\\)(\\\\)*" '' \
single_string "'" "'" '' \
backtick '`' (?<!\\)(\\\\)*` '' \
@@ -31,16 +31,21 @@ addhl -group / multi_region -default code ruby \
# Literals are: i → array of symbols, q → string, r → regular expression, s → symbol, w → array of words, x → capture shell result
addhl -group /ruby/double_string fill string
-addhl -group /ruby/double_string region interpolation \Q#{ \} \{
-addhl -group /ruby/double_string/interpolation/content fill meta
+addhl -group /ruby/double_string regions regions interpolation \Q#{ \} \{
+addhl -group /ruby/double_string/regions/interpolation fill meta
+
addhl -group /ruby/single_string fill string
+
addhl -group /ruby/backtick fill meta
-addhl -group /ruby/backtick region interpolation \Q#{ \} \{
-addhl -group /ruby/backtick/interpolation/content fill meta
+addhl -group /ruby/backtick regions regions interpolation \Q#{ \} \{
+addhl -group /ruby/backtick/regions/interpolation fill meta
+
addhl -group /ruby/regex fill meta
-addhl -group /ruby/regex region interpolation \Q#{ \} \{
-addhl -group /ruby/regex/interpolation/content fill meta
+addhl -group /ruby/regex regions regions interpolation \Q#{ \} \{
+addhl -group /ruby/regex/regions/interpolation fill meta
+
addhl -group /ruby/comment fill comment
+
addhl -group /ruby/literal fill meta
addhl -group /ruby/code regex \<([a-z]\w+:)|([$@][a-z]\w+)|(\W\K:[a-z]\w+[=?!]?) 0:identifier
diff --git a/rc/sh.kak b/rc/sh.kak
index 8ea949df..38639070 100644
--- a/rc/sh.kak
+++ b/rc/sh.kak
@@ -6,7 +6,7 @@ hook global BufSetOption mimetype=text/x-shellscript %{
set buffer filetype sh
}
-addhl -group / multi_region -default code sh \
+addhl -group / regions -default code sh \
double_string %{(^|\h)"} %{(?<!\\)(\\\\)*"} '' \
single_string %{(^|\h)'} %{(?<!\\)(\\\\)*'} '' \
comment '#' '$' ''
diff --git a/rc/yaml.kak b/rc/yaml.kak
index c80ca80b..16643ccd 100644
--- a/rc/yaml.kak
+++ b/rc/yaml.kak
@@ -15,7 +15,7 @@ hook global BufCreate .*[.](yaml) %{
# Highlighters
# ‾‾‾‾‾‾‾‾‾‾‾‾
-addhl -group / multi_region -default code yaml \
+addhl -group / regions -default code yaml \
double_string '"' (?<!\\)(\\\\)*" '' \
single_string "'" "'" '' \
comment '#' '$' ''
diff --git a/share/kak/kakrc b/share/kak/kakrc
index 26db4b55..10faf5c4 100644
--- a/share/kak/kakrc
+++ b/share/kak/kakrc
@@ -1,7 +1,7 @@
# define color scheme
face value red
face type yellow
-face identifier cyan
+face identifier green
face string magenta
face error default,red
face keyword blue
diff --git a/src/highlighters.cc b/src/highlighters.cc
index 2779b4d3..cd191fa7 100644
--- a/src/highlighters.cc
+++ b/src/highlighters.cc
@@ -712,10 +712,7 @@ HighlighterAndId reference_factory(HighlighterParameters params)
}};
}
-namespace RegionHighlight
-{
-
-struct Match
+struct RegexMatch
{
size_t timestamp;
LineCount line;
@@ -725,9 +722,9 @@ struct Match
ByteCoord begin_coord() const { return { line, begin }; }
ByteCoord end_coord() const { return { line, end }; }
};
-using MatchList = std::vector<Match>;
+using RegexMatchList = std::vector<RegexMatch>;
-void find_matches(const Buffer& buffer, MatchList& matches, const Regex& regex)
+void find_matches(const Buffer& buffer, RegexMatchList& matches, const Regex& regex)
{
const size_t buf_timestamp = buffer.timestamp();
for (auto line = 0_line, end = buffer.line_count(); line < end; ++line)
@@ -743,7 +740,7 @@ void find_matches(const Buffer& buffer, MatchList& matches, const Regex& regex)
}
void update_matches(const Buffer& buffer, memoryview<LineModification> modifs,
- MatchList& matches, const Regex& regex)
+ RegexMatchList& matches, const Regex& regex)
{
const size_t buf_timestamp = buffer.timestamp();
// remove out of date matches and update line for others
@@ -796,29 +793,29 @@ void update_matches(const Buffer& buffer, memoryview<LineModification> modifs,
}
}
std::inplace_merge(matches.begin(), matches.begin() + pivot, matches.end(),
- [](const Match& lhs, const Match& rhs) {
+ [](const RegexMatch& lhs, const RegexMatch& rhs) {
return lhs.begin_coord() < rhs.begin_coord();
});
}
struct RegionMatches
{
- MatchList begin_matches;
- MatchList end_matches;
- MatchList recurse_matches;
+ RegexMatchList begin_matches;
+ RegexMatchList end_matches;
+ RegexMatchList recurse_matches;
- static bool compare_to_begin(const Match& lhs, ByteCoord rhs)
+ static bool compare_to_begin(const RegexMatch& lhs, ByteCoord rhs)
{
return lhs.begin_coord() < rhs;
}
- MatchList::const_iterator find_next_begin(ByteCoord pos) const
+ RegexMatchList::const_iterator find_next_begin(ByteCoord pos) const
{
return std::lower_bound(begin_matches.begin(), begin_matches.end(),
pos, compare_to_begin);
}
- MatchList::const_iterator find_matching_end(ByteCoord beg_pos) const
+ RegexMatchList::const_iterator find_matching_end(ByteCoord beg_pos) const
{
auto end_it = end_matches.begin();
auto rec_it = recurse_matches.begin();
@@ -858,10 +855,10 @@ struct RegionDesc
RegionMatches find_matches(const Buffer& buffer) const
{
RegionMatches res;
- RegionHighlight::find_matches(buffer, res.begin_matches, m_begin);
- RegionHighlight::find_matches(buffer, res.end_matches, m_end);
+ Kakoune::find_matches(buffer, res.begin_matches, m_begin);
+ Kakoune::find_matches(buffer, res.end_matches, m_end);
if (not m_recurse.empty())
- RegionHighlight::find_matches(buffer, res.recurse_matches, m_recurse);
+ Kakoune::find_matches(buffer, res.recurse_matches, m_recurse);
return res;
}
@@ -869,138 +866,19 @@ struct RegionDesc
memoryview<LineModification> modifs,
RegionMatches& matches) const
{
- RegionHighlight::update_matches(buffer, modifs, matches.begin_matches, m_begin);
- RegionHighlight::update_matches(buffer, modifs, matches.end_matches, m_end);
+ Kakoune::update_matches(buffer, modifs, matches.begin_matches, m_begin);
+ Kakoune::update_matches(buffer, modifs, matches.end_matches, m_end);
if (not m_recurse.empty())
- RegionHighlight::update_matches(buffer, modifs, matches.recurse_matches, m_recurse);
- }
-};
-
-struct RegionHighlighter
-{
-public:
- RegionHighlighter(Regex begin, Regex end, Regex recurse = Regex{})
- : m_region{ std::move(begin), std::move(end), std::move(recurse) }
- {
- if (m_region.m_begin.empty() or m_region.m_end.empty())
- throw runtime_error("invalid regex for region highlighter");
- }
-
- void operator()(HierachicalHighlighter::GroupMap groups, const Context& context,
- HighlightFlags flags, DisplayBuffer& display_buffer)
- {
- if (flags != HighlightFlags::Highlight)
- return;
-
- auto it = groups.find("content");
- if (it == groups.end())
- return;
-
- auto range = display_buffer.range();
- const auto& buffer = context.buffer();
- auto& regions = update_cache_ifn(buffer);
- auto begin = std::lower_bound(regions.begin(), regions.end(), range.first,
- [](const Region& r, ByteCoord c) { return r.end < c; });
- auto end = std::lower_bound(begin, regions.end(), range.second,
- [](const Region& r, ByteCoord c) { return r.begin < c; });
- auto correct = [&](ByteCoord c) -> ByteCoord {
- if (buffer[c.line].length() == c.column)
- return {c.line+1, 0};
- return c;
- };
- for (; begin != end; ++begin)
- apply_highlighter(context, flags, display_buffer,
- correct(begin->begin), correct(begin->end),
- it->second);
- }
-private:
- RegionDesc m_region;
-
- struct Region
- {
- ByteCoord begin;
- ByteCoord end;
- };
- using RegionList = std::vector<Region>;
-
- struct Cache
- {
- size_t timestamp = 0;
- RegionMatches matches;
- RegionList regions;
- };
- BufferSideCache<Cache> m_cache;
-
- const RegionList& update_cache_ifn(const Buffer& buffer)
- {
- Cache& cache = m_cache.get(buffer);
- const size_t buf_timestamp = buffer.timestamp();
- if (cache.timestamp == buf_timestamp)
- return cache.regions;
-
- if (cache.timestamp == 0)
- cache.matches = m_region.find_matches(buffer);
- else
- {
- auto modifs = compute_line_modifications(buffer, cache.timestamp);
- m_region.update_matches(buffer, modifs, cache.matches);
- }
-
- cache.regions.clear();
- for (auto beg_it = cache.matches.begin_matches.cbegin();
- beg_it != cache.matches.begin_matches.end(); )
- {
- auto end_it = cache.matches.find_matching_end(beg_it->end_coord());
-
- if (end_it == cache.matches.end_matches.end())
- {
- cache.regions.push_back({ {beg_it->line, beg_it->begin},
- buffer.end_coord() });
- break;
- }
- else
- {
- cache.regions.push_back({ beg_it->begin_coord(),
- end_it->end_coord() });
- beg_it = cache.matches.find_next_begin(end_it->end_coord());
- }
- }
- cache.timestamp = buf_timestamp;
- return cache.regions;
+ Kakoune::update_matches(buffer, modifs, matches.recurse_matches, m_recurse);
}
};
-HighlighterAndId region_factory(HighlighterParameters params)
-{
- try
- {
- if (params.size() != 3 && params.size() != 4)
- throw runtime_error("wrong parameter count");
-
- Regex begin{params[1], Regex::nosubs | Regex::optimize };
- Regex end{params[2], Regex::nosubs | Regex::optimize };
- Regex recurse;
- if (params.size() == 4)
- recurse = Regex{params[3], Regex::nosubs | Regex::optimize };
-
- return {params[0],
- HierachicalHighlighter(RegionHighlighter(std::move(begin),
- std::move(end),
- std::move(recurse)),
- { { "content", HighlighterGroup{} } })};
- }
- catch (boost::regex_error& err)
- {
- throw runtime_error(String("regex error: ") + err.what());
- }
-}
-
-struct MultiRegionHighlighter
+struct RegionsHighlighter
{
public:
using NamedRegionDescList = std::vector<std::pair<String, RegionDesc>>;
- MultiRegionHighlighter(NamedRegionDescList regions, String default_group)
+ RegionsHighlighter(NamedRegionDescList regions, String default_group)
: m_regions{std::move(regions)}, m_default_group{std::move(default_group)}
{
if (m_regions.empty())
@@ -1076,7 +954,7 @@ private:
};
BufferSideCache<Cache> m_cache;
- using RegionAndMatch = std::pair<size_t, MatchList::const_iterator>;
+ using RegionAndMatch = std::pair<size_t, RegexMatchList::const_iterator>;
// find the begin closest to pos in all matches
RegionAndMatch find_next_begin(const Cache& cache, ByteCoord pos) const
@@ -1156,7 +1034,7 @@ private:
}
};
-HighlighterAndId multi_region_factory(HighlighterParameters params)
+HighlighterAndId regions_factory(HighlighterParameters params)
{
try
{
@@ -1169,7 +1047,7 @@ HighlighterAndId multi_region_factory(HighlighterParameters params)
if ((parser.positional_count() % 4) != 1)
throw runtime_error("wrong parameter count, expect <id> (<group name> <begin> <end> <recurse>)+");
- MultiRegionHighlighter::NamedRegionDescList regions;
+ RegionsHighlighter::NamedRegionDescList regions;
id_map<HighlighterGroup> groups;
for (size_t i = 1; i < parser.positional_count(); i += 4)
{
@@ -1194,7 +1072,7 @@ HighlighterAndId multi_region_factory(HighlighterParameters params)
return {parser[0],
HierachicalHighlighter(
- MultiRegionHighlighter(std::move(regions), std::move(default_group)), std::move(groups))};
+ RegionsHighlighter(std::move(regions), std::move(default_group)), std::move(groups))};
}
catch (boost::regex_error& err)
{
@@ -1202,8 +1080,6 @@ HighlighterAndId multi_region_factory(HighlighterParameters params)
}
}
-}
-
void register_highlighters()
{
HighlighterRegistry& registry = HighlighterRegistry::instance();
@@ -1219,8 +1095,7 @@ void register_highlighters()
registry.register_func("flag_lines", flag_lines_factory);
registry.register_func("line_option", highlight_line_option_factory);
registry.register_func("ref", reference_factory);
- registry.register_func("region", RegionHighlight::region_factory);
- registry.register_func("multi_region", RegionHighlight::multi_region_factory);
+ registry.register_func("regions", regions_factory);
}
}