Pass a HighlightFlags parameter to highlighters
When only highlighting for finding character position on screen pass HighlightFlags::MoveOnly so that non moving highlighters do not need to run.
This commit is contained in:
parent
e1eec8903a
commit
5cffc48efc
|
@ -15,16 +15,22 @@ namespace Kakoune
|
||||||
class DisplayBuffer;
|
class DisplayBuffer;
|
||||||
class Context;
|
class Context;
|
||||||
|
|
||||||
|
enum class HighlightFlags
|
||||||
|
{
|
||||||
|
Highlight,
|
||||||
|
MoveOnly
|
||||||
|
};
|
||||||
|
|
||||||
// An Highlighter is a function which mutates a DisplayBuffer in order to
|
// An Highlighter is a function which mutates a DisplayBuffer in order to
|
||||||
// change the visual representation of a file. It could be changing text
|
// change the visual representation of a file. It could be changing text
|
||||||
// color, adding information text (line numbering for example) or replacing
|
// color, adding information text (line numbering for example) or replacing
|
||||||
// buffer content (folding for example)
|
// buffer content (folding for example)
|
||||||
|
|
||||||
using HighlighterFunc = std::function<void (const Context& context, DisplayBuffer& display_buffer)>;
|
using HighlighterFunc = std::function<void (const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer)>;
|
||||||
using HighlighterAndId = std::pair<String, HighlighterFunc>;
|
using HighlighterAndId = std::pair<String, HighlighterFunc>;
|
||||||
using HighlighterParameters = memoryview<String>;
|
using HighlighterParameters = memoryview<String>;
|
||||||
using HighlighterFactory = std::function<HighlighterAndId (HighlighterParameters params)>;
|
using HighlighterFactory = std::function<HighlighterAndId (HighlighterParameters params)>;
|
||||||
using HighlighterGroup = FunctionGroup<const Context&, DisplayBuffer&>;
|
using HighlighterGroup = FunctionGroup<const Context&, HighlightFlags, DisplayBuffer&>;
|
||||||
|
|
||||||
struct HighlighterRegistry : FunctionRegistry<HighlighterFactory>,
|
struct HighlighterRegistry : FunctionRegistry<HighlighterFactory>,
|
||||||
Singleton<HighlighterRegistry>
|
Singleton<HighlighterRegistry>
|
||||||
|
|
|
@ -63,6 +63,7 @@ void highlight_range(DisplayBuffer& display_buffer,
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void apply_highlighter(const Context& context,
|
void apply_highlighter(const Context& context,
|
||||||
|
HighlightFlags flags,
|
||||||
DisplayBuffer& display_buffer,
|
DisplayBuffer& display_buffer,
|
||||||
BufferCoord begin, BufferCoord end,
|
BufferCoord begin, BufferCoord end,
|
||||||
T&& highlighter)
|
T&& highlighter)
|
||||||
|
@ -132,7 +133,7 @@ void apply_highlighter(const Context& context,
|
||||||
}
|
}
|
||||||
|
|
||||||
region_display.compute_range();
|
region_display.compute_range();
|
||||||
highlighter(context, region_display);
|
highlighter(context, flags, region_display);
|
||||||
|
|
||||||
for (size_t i = 0; i < region_lines.size(); ++i)
|
for (size_t i = 0; i < region_lines.size(); ++i)
|
||||||
{
|
{
|
||||||
|
@ -170,8 +171,10 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator()(const Context& context, DisplayBuffer& display_buffer)
|
void operator()(const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer)
|
||||||
{
|
{
|
||||||
|
if (flags != HighlightFlags::Highlight)
|
||||||
|
return;
|
||||||
auto& cache = update_cache_ifn(context.buffer(), display_buffer.range());
|
auto& cache = update_cache_ifn(context.buffer(), display_buffer.range());
|
||||||
for (auto& match : cache.m_matches)
|
for (auto& match : cache.m_matches)
|
||||||
{
|
{
|
||||||
|
@ -269,8 +272,11 @@ public:
|
||||||
DynamicRegexHighlighter(const ColorSpec& colors, RegexGetter getter)
|
DynamicRegexHighlighter(const ColorSpec& colors, RegexGetter getter)
|
||||||
: m_regex_getter(getter), m_colors(colors), m_colorizer(Regex(), m_colors) {}
|
: m_regex_getter(getter), m_colors(colors), m_colorizer(Regex(), m_colors) {}
|
||||||
|
|
||||||
void operator()(const Context& context, DisplayBuffer& display_buffer)
|
void operator()(const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer)
|
||||||
{
|
{
|
||||||
|
if (flags != HighlightFlags::Highlight)
|
||||||
|
return;
|
||||||
|
|
||||||
Regex regex = m_regex_getter(context);
|
Regex regex = m_regex_getter(context);
|
||||||
if (regex != m_last_regex)
|
if (regex != m_last_regex)
|
||||||
{
|
{
|
||||||
|
@ -279,7 +285,7 @@ public:
|
||||||
m_colorizer = RegexColorizer{m_last_regex, m_colors};
|
m_colorizer = RegexColorizer{m_last_regex, m_colors};
|
||||||
}
|
}
|
||||||
if (not m_last_regex.empty())
|
if (not m_last_regex.empty())
|
||||||
m_colorizer(context, display_buffer);
|
m_colorizer(context, flags, display_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -322,7 +328,7 @@ HighlighterAndId highlight_regex_option_factory(HighlighterParameters params)
|
||||||
return {"hloption_" + option_name, DynamicRegexHighlighter<decltype(get_regex)>{colors, get_regex}};
|
return {"hloption_" + option_name, DynamicRegexHighlighter<decltype(get_regex)>{colors, get_regex}};
|
||||||
}
|
}
|
||||||
|
|
||||||
void expand_tabulations(const Context& context, DisplayBuffer& display_buffer)
|
void expand_tabulations(const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer)
|
||||||
{
|
{
|
||||||
const int tabstop = context.options()["tabstop"].get<int>();
|
const int tabstop = context.options()["tabstop"].get<int>();
|
||||||
auto& buffer = context.buffer();
|
auto& buffer = context.buffer();
|
||||||
|
@ -367,7 +373,7 @@ void expand_tabulations(const Context& context, DisplayBuffer& display_buffer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_line_numbers(const Context& context, DisplayBuffer& display_buffer)
|
void show_line_numbers(const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer)
|
||||||
{
|
{
|
||||||
LineCount last_line = context.buffer().line_count();
|
LineCount last_line = context.buffer().line_count();
|
||||||
int digit_count = 0;
|
int digit_count = 0;
|
||||||
|
@ -387,8 +393,10 @@ void show_line_numbers(const Context& context, DisplayBuffer& display_buffer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void highlight_selections(const Context& context, DisplayBuffer& display_buffer)
|
void highlight_selections(const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer)
|
||||||
{
|
{
|
||||||
|
if (flags != HighlightFlags::Highlight)
|
||||||
|
return;
|
||||||
const auto& buffer = context.buffer();
|
const auto& buffer = context.buffer();
|
||||||
for (size_t i = 0; i < context.selections().size(); ++i)
|
for (size_t i = 0; i < context.selections().size(); ++i)
|
||||||
{
|
{
|
||||||
|
@ -407,7 +415,7 @@ void highlight_selections(const Context& context, DisplayBuffer& display_buffer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void expand_unprintable(const Context& context, DisplayBuffer& display_buffer)
|
void expand_unprintable(const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer)
|
||||||
{
|
{
|
||||||
auto& buffer = context.buffer();
|
auto& buffer = context.buffer();
|
||||||
for (auto& line : display_buffer.lines())
|
for (auto& line : display_buffer.lines())
|
||||||
|
@ -452,7 +460,7 @@ HighlighterAndId flag_lines_factory(HighlighterParameters params)
|
||||||
GlobalOptions::instance()[option_name].get<std::vector<LineAndFlag>>();
|
GlobalOptions::instance()[option_name].get<std::vector<LineAndFlag>>();
|
||||||
|
|
||||||
return {"hlflags_" + params[1],
|
return {"hlflags_" + params[1],
|
||||||
[=](const Context& context, DisplayBuffer& display_buffer)
|
[=](const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer)
|
||||||
{
|
{
|
||||||
auto& lines_opt = context.options()[option_name];
|
auto& lines_opt = context.options()[option_name];
|
||||||
auto& lines = lines_opt.get<std::vector<LineAndFlag>>();
|
auto& lines = lines_opt.get<std::vector<LineAndFlag>>();
|
||||||
|
@ -476,7 +484,7 @@ HighlighterAndId flag_lines_factory(HighlighterParameters params)
|
||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<void (*highlighter_func)(const Context&, DisplayBuffer&)>
|
template<void (*highlighter_func)(const Context&, HighlightFlags, DisplayBuffer&)>
|
||||||
class SimpleHighlighterFactory
|
class SimpleHighlighterFactory
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -509,8 +517,8 @@ HighlighterAndId reference_factory(HighlighterParameters params)
|
||||||
DefinedHighlighters::instance().get_group(name, '/');
|
DefinedHighlighters::instance().get_group(name, '/');
|
||||||
|
|
||||||
return HighlighterAndId(name,
|
return HighlighterAndId(name,
|
||||||
[name](const Context& context, DisplayBuffer& display_buffer)
|
[name](const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer)
|
||||||
{ DefinedHighlighters::instance().get_group(name, '/')(context, display_buffer); });
|
{ DefinedHighlighters::instance().get_group(name, '/')(context, flags, display_buffer); });
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename HighlightFunc>
|
template<typename HighlightFunc>
|
||||||
|
@ -523,8 +531,10 @@ public:
|
||||||
m_func(std::move(func))
|
m_func(std::move(func))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void operator()(const Context& context, DisplayBuffer& display_buffer)
|
void operator()(const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer)
|
||||||
{
|
{
|
||||||
|
if (flags != HighlightFlags::Highlight)
|
||||||
|
return;
|
||||||
auto range = display_buffer.range();
|
auto range = display_buffer.range();
|
||||||
auto& regions = update_cache_ifn(context.buffer());
|
auto& regions = update_cache_ifn(context.buffer());
|
||||||
auto begin = std::lower_bound(regions.begin(), regions.end(), range.first,
|
auto begin = std::lower_bound(regions.begin(), regions.end(), range.first,
|
||||||
|
@ -532,7 +542,7 @@ public:
|
||||||
auto end = std::lower_bound(begin, regions.end(), range.second,
|
auto end = std::lower_bound(begin, regions.end(), range.second,
|
||||||
[](const Region& r, const BufferCoord& c) { return r.begin < c; });
|
[](const Region& r, const BufferCoord& c) { return r.begin < c; });
|
||||||
for (; begin != end; ++begin)
|
for (; begin != end; ++begin)
|
||||||
m_func(context, display_buffer, begin->begin, begin->end);
|
m_func(context, flags, display_buffer, begin->begin, begin->end);
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
Regex m_begin;
|
Regex m_begin;
|
||||||
|
@ -768,7 +778,7 @@ HighlighterAndId region_factory(HighlighterParameters params)
|
||||||
Regex end{params[1], Regex::nosubs | Regex::optimize };
|
Regex end{params[1], Regex::nosubs | Regex::optimize };
|
||||||
const ColorPair colors = get_color(params[2]);
|
const ColorPair colors = get_color(params[2]);
|
||||||
|
|
||||||
auto func = [colors](const Context&, DisplayBuffer& display_buffer,
|
auto func = [colors](const Context&, HighlightFlags flags, DisplayBuffer& display_buffer,
|
||||||
BufferCoord begin, BufferCoord end)
|
BufferCoord begin, BufferCoord end)
|
||||||
{
|
{
|
||||||
highlight_range(display_buffer, begin, end, true,
|
highlight_range(display_buffer, begin, end, true,
|
||||||
|
@ -795,11 +805,11 @@ HighlighterAndId region_ref_factory(HighlighterParameters params)
|
||||||
Regex end{params[1], Regex::nosubs | Regex::optimize };
|
Regex end{params[1], Regex::nosubs | Regex::optimize };
|
||||||
const String& name = params[2];
|
const String& name = params[2];
|
||||||
|
|
||||||
auto func = [name](const Context& context, DisplayBuffer& display_buffer,
|
auto func = [name](const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer,
|
||||||
BufferCoord begin, BufferCoord end)
|
BufferCoord begin, BufferCoord end)
|
||||||
{
|
{
|
||||||
HighlighterGroup& ref = DefinedHighlighters::instance().get_group(name, '/');
|
HighlighterGroup& ref = DefinedHighlighters::instance().get_group(name, '/');
|
||||||
apply_highlighter(context, display_buffer, begin, end, ref);
|
apply_highlighter(context, flags, display_buffer, begin, end, ref);
|
||||||
};
|
};
|
||||||
|
|
||||||
return HighlighterAndId("regionref(" + params[0] + "," + params[1] + "," + name + ")",
|
return HighlighterAndId("regionref(" + params[0] + "," + params[1] + "," + name + ")",
|
||||||
|
|
|
@ -13,9 +13,9 @@ namespace Kakoune
|
||||||
{
|
{
|
||||||
|
|
||||||
// Implementation in highlighters.cc
|
// Implementation in highlighters.cc
|
||||||
void highlight_selections(const Context& context, DisplayBuffer& display_buffer);
|
void highlight_selections(const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer);
|
||||||
void expand_tabulations(const Context& context, DisplayBuffer& display_buffer);
|
void expand_tabulations(const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer);
|
||||||
void expand_unprintable(const Context& context, DisplayBuffer& display_buffer);
|
void expand_unprintable(const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer);
|
||||||
|
|
||||||
Window::Window(Buffer& buffer)
|
Window::Window(Buffer& buffer)
|
||||||
: m_buffer(&buffer),
|
: m_buffer(&buffer),
|
||||||
|
@ -82,8 +82,8 @@ void Window::update_display_buffer(const Context& context)
|
||||||
}
|
}
|
||||||
|
|
||||||
m_display_buffer.compute_range();
|
m_display_buffer.compute_range();
|
||||||
m_highlighters(context, m_display_buffer);
|
m_highlighters(context, HighlightFlags::Highlight, m_display_buffer);
|
||||||
m_builtin_highlighters(context, m_display_buffer);
|
m_builtin_highlighters(context, HighlightFlags::Highlight, m_display_buffer);
|
||||||
|
|
||||||
// cut the start of the line before m_position.column
|
// cut the start of the line before m_position.column
|
||||||
for (auto& line : lines)
|
for (auto& line : lines)
|
||||||
|
@ -166,8 +166,8 @@ void Window::scroll_to_keep_selection_visible_ifn(const Context& context)
|
||||||
lines.emplace_back(AtomList{ {buffer(), last.line, last.line+1} });
|
lines.emplace_back(AtomList{ {buffer(), last.line, last.line+1} });
|
||||||
|
|
||||||
display_buffer.compute_range();
|
display_buffer.compute_range();
|
||||||
m_highlighters(context, display_buffer);
|
m_highlighters(context, HighlightFlags::MoveOnly, display_buffer);
|
||||||
m_builtin_highlighters(context, display_buffer);
|
m_builtin_highlighters(context, HighlightFlags::MoveOnly, display_buffer);
|
||||||
|
|
||||||
// now we can compute where the cursor is in display columns
|
// now we can compute where the cursor is in display columns
|
||||||
// (this is only valid if highlighting one line and multiple lines put
|
// (this is only valid if highlighting one line and multiple lines put
|
||||||
|
@ -250,8 +250,8 @@ BufferCoord Window::offset_coord(BufferCoord coord, LineCount offset)
|
||||||
|
|
||||||
InputHandler hook_handler{*m_buffer, SelectionList{ {} } };
|
InputHandler hook_handler{*m_buffer, SelectionList{ {} } };
|
||||||
hook_handler.context().set_window(*this);
|
hook_handler.context().set_window(*this);
|
||||||
m_highlighters(hook_handler.context(), display_buffer);
|
m_highlighters(hook_handler.context(), HighlightFlags::MoveOnly, display_buffer);
|
||||||
m_builtin_highlighters(hook_handler.context(), display_buffer);
|
m_builtin_highlighters(hook_handler.context(), HighlightFlags::MoveOnly, display_buffer);
|
||||||
|
|
||||||
CharCount column = find_display_column(lines[0], buffer(), coord);
|
CharCount column = find_display_column(lines[0], buffer(), coord);
|
||||||
return find_buffer_coord(lines[1], buffer(), column);
|
return find_buffer_coord(lines[1], buffer(), column);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user