Add a line_option highlighter that highlight the line stored in an int option

Use it to highlight the current error in the *make* buffer
This commit is contained in:
Maxime Coste 2014-06-18 20:50:39 +01:00
parent 6f2569ff30
commit e202b7af50
2 changed files with 24 additions and 0 deletions

View File

@ -17,6 +17,7 @@ def -shell-params make %{ %sh{
addhl -group / group make
addhl -group /make regex "^([^:\n]+):(\d+):(\d+):\h+(?:((?:fatal )?error)|(warning)|(note)|(required from(?: here)?))?.*?$" 1:cyan 2:green 3:green 4:red 5:yellow 6:blue 7:yellow
addhl -group /make line_option _make_current_error_line default,blue
hook global WinSetOption filetype=make %{
addhl ref make

View File

@ -391,6 +391,28 @@ HighlighterAndId highlight_regex_option_factory(HighlighterParameters params)
return {"hloption_" + option_name, make_dynamic_regex_highlighter(get_regex, get_color)};
}
HighlighterAndId highlight_line_option_factory(HighlighterParameters params)
{
if (params.size() != 2)
throw runtime_error("wrong parameter count");
const ColorPair& color = get_color(params[1]);
String option_name = params[0];
// verify option type now
GlobalOptions::instance()[option_name].get<int>();
auto highlighter = [=](const Context& context, HighlightFlags flags,
DisplayBuffer& display_buffer)
{
int line = context.options()[option_name].get<int>();
highlight_range(display_buffer, {line-1, 0}, {line, 0}, false,
apply_colors(color));
};
return {"hlline_" + option_name, std::move(highlighter)};
}
void expand_tabulations(const Context& context, HighlightFlags flags, DisplayBuffer& display_buffer)
{
const int tabstop = context.options()["tabstop"].get<int>();
@ -1177,6 +1199,7 @@ void register_highlighters()
registry.register_func("search", highlight_search_factory);
registry.register_func("group", highlighter_group_factory);
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);