diff --git a/src/filters.cc b/src/filters.cc index 130a9066..06553ee4 100644 --- a/src/filters.cc +++ b/src/filters.cc @@ -9,7 +9,8 @@ namespace Kakoune { void colorize_regex(DisplayBuffer& display_buffer, - const boost::regex& ex, Color color) + const boost::regex& ex, + Color fg_color, Color bg_color = Color::Default) { BufferIterator display_begin = display_buffer.begin()->begin(); BufferIterator display_end = display_buffer.back().end(); @@ -31,12 +32,44 @@ void colorize_regex(DisplayBuffer& display_buffer, if (begin_atom_it->end() != end) begin_atom_it = display_buffer.split(begin_atom_it, end); - begin_atom_it->fg_color() = color; + begin_atom_it->fg_color() = fg_color; + begin_atom_it->bg_color() = bg_color; } atom_it = begin_atom_it; } } +Color parse_color(const std::string& color) +{ + if (color == "default") return Color::Default; + if (color == "black") return Color::Black; + if (color == "red") return Color::Red; + if (color == "green") return Color::Green; + if (color == "yellow") return Color::Yellow; + if (color == "blue") return Color::Blue; + if (color == "magenta") return Color::Magenta; + if (color == "cyan") return Color::Cyan; + if (color == "white") return Color::White; + return Color::Default; +} + +FilterAndId colorize_regex_factory(Window& window, + const FilterParameters params) +{ + if (params.size() != 3) + throw runtime_error("wrong parameter count"); + + boost::regex ex(params[0]); + + Color fg_color = parse_color(params[1]); + Color bg_color = parse_color(params[2]); + + std::string id = "colre'" + params[0] + "'"; + + return FilterAndId(id, std::bind(colorize_regex, std::placeholders::_1, + ex, fg_color, bg_color)); +} + void colorize_cplusplus(DisplayBuffer& display_buffer) { static boost::regex preprocessor("(\\`|(?<=\\n))\\h*#\\h*[^\\n]*(?=\\n)"); @@ -233,6 +266,7 @@ void register_filters() registry.register_factory("expand_tabs", SimpleFilterFactory("expand_tabs")); registry.register_factory("number_lines", SimpleFilterFactory("number_lines")); registry.register_factory("hlcpp", SimpleFilterFactory("hlcpp")); + registry.register_factory("regex", colorize_regex_factory); } }