new regex highlighter parameters syntax, support per capture highlight
This commit is contained in:
parent
a38a9c3bf2
commit
b69134c36f
|
@ -52,22 +52,29 @@ void highlight_range(DisplayBuffer& display_buffer,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef std::unordered_map<size_t, std::pair<Color, Color>> ColorSpec;
|
||||||
void colorize_regex(DisplayBuffer& display_buffer,
|
void colorize_regex(DisplayBuffer& display_buffer,
|
||||||
const Regex& ex,
|
const Regex& ex,
|
||||||
Color fg_color, Color bg_color = Color::Default)
|
ColorSpec colors)
|
||||||
{
|
{
|
||||||
const BufferRange& range = display_buffer.range();
|
const BufferRange& range = display_buffer.range();
|
||||||
RegexIterator re_it(range.first, range.second, ex, boost::match_nosubs);
|
RegexIterator re_it(range.first, range.second, ex);
|
||||||
RegexIterator re_end;
|
RegexIterator re_end;
|
||||||
for (; re_it != re_end; ++re_it)
|
for (; re_it != re_end; ++re_it)
|
||||||
{
|
{
|
||||||
highlight_range(display_buffer, (*re_it)[0].first, (*re_it)[0].second, true,
|
for (size_t n = 0; n < re_it->size(); ++n)
|
||||||
|
{
|
||||||
|
if (colors.find(n) == colors.end())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
highlight_range(display_buffer, (*re_it)[n].first, (*re_it)[n].second, true,
|
||||||
[&](DisplayAtom& atom) {
|
[&](DisplayAtom& atom) {
|
||||||
atom.fg_color = fg_color;
|
atom.fg_color = colors[n].first;
|
||||||
atom.bg_color = bg_color;
|
atom.bg_color = colors[n].second;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Color parse_color(const String& color)
|
Color parse_color(const String& color)
|
||||||
{
|
{
|
||||||
|
@ -86,19 +93,33 @@ Color parse_color(const String& color)
|
||||||
HighlighterAndId colorize_regex_factory(Window& window,
|
HighlighterAndId colorize_regex_factory(Window& window,
|
||||||
const HighlighterParameters params)
|
const HighlighterParameters params)
|
||||||
{
|
{
|
||||||
if (params.size() != 3)
|
if (params.size() < 2)
|
||||||
throw runtime_error("wrong parameter count");
|
throw runtime_error("wrong parameter count");
|
||||||
|
|
||||||
Regex ex(params[0].begin(), params[0].end(),
|
Regex ex(params[0].begin(), params[0].end(),
|
||||||
boost::regex::perl | boost::regex::optimize);
|
boost::regex::perl | boost::regex::optimize);
|
||||||
|
|
||||||
Color fg_color = parse_color(params[1]);
|
static Regex color_spec_ex(LR"((\d+):(\w+)(,(\w+))?)");
|
||||||
Color bg_color = parse_color(params[2]);
|
ColorSpec colors;
|
||||||
|
for (auto it = params.begin() + 1; it != params.end(); ++it)
|
||||||
|
{
|
||||||
|
boost::match_results<String::iterator> res;
|
||||||
|
if (not boost::regex_match(it->begin(), it->end(), res, color_spec_ex))
|
||||||
|
throw runtime_error("wrong colorspec: '" + *it +
|
||||||
|
"' expected <capture>:<fgcolor>[,<bgcolor>]");
|
||||||
|
|
||||||
|
int capture = str_to_int(String(res[1].first, res[1].second));
|
||||||
|
Color fg_color = parse_color(String(res[2].first, res[2].second));
|
||||||
|
Color bg_color = res[4].matched ?
|
||||||
|
parse_color(String(res[4].first, res[4].second))
|
||||||
|
: Color::Default;
|
||||||
|
colors[capture] = { fg_color, bg_color };
|
||||||
|
}
|
||||||
|
|
||||||
String id = "colre'" + params[0] + "'";
|
String id = "colre'" + params[0] + "'";
|
||||||
|
|
||||||
return HighlighterAndId(id, std::bind(colorize_regex,
|
return HighlighterAndId(id, std::bind(colorize_regex, _1, ex,
|
||||||
_1, ex, fg_color, bg_color));
|
std::move(colors)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void expand_tabulations(Window& window, DisplayBuffer& display_buffer)
|
void expand_tabulations(Window& window, DisplayBuffer& display_buffer)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
hook global WinCreate .* %{ addhl regex \h+(?=\n) default red }
|
hook global WinCreate .* %{ addhl regex \h+(?=\n) 0:default,red }
|
||||||
hook global WinCreate .* %{ addhl number_lines }
|
hook global WinCreate .* %{ addhl number_lines }
|
||||||
|
|
||||||
runtime rc/cpp.kak
|
runtime rc/cpp.kak
|
||||||
|
|
|
@ -4,13 +4,13 @@ hook global BufCreate .*\.(c|cc|cpp|cxx|C|h|hh|hpp|hxx|H) %{
|
||||||
|
|
||||||
hook global WinSetOption filetype=cpp %{
|
hook global WinSetOption filetype=cpp %{
|
||||||
addhl group cpp-highlight;
|
addhl group cpp-highlight;
|
||||||
addhl -group cpp-highlight regex "\<(this|true|false|NULL|nullptr|)\>|\<-?\d+[fdiu]?|'((\\.)?|[^'\\])'" red default;
|
addhl -group cpp-highlight regex "\<(this|true|false|NULL|nullptr|)\>|\<-?\d+[fdiu]?|'((\\.)?|[^'\\])'" 0:red,default;
|
||||||
addhl -group cpp-highlight regex "\<(void|int|char|unsigned|float|bool|size_t)\>" yellow default;
|
addhl -group cpp-highlight regex "\<(void|int|char|unsigned|float|bool|size_t)\>" 0:yellow,default;
|
||||||
addhl -group cpp-highlight regex "\<(while|for|if|else|do|switch|case|default|goto|break|continue|return|using|try|catch|throw|new|delete|and|or|not)\>" blue default;
|
addhl -group cpp-highlight regex "\<(while|for|if|else|do|switch|case|default|goto|break|continue|return|using|try|catch|throw|new|delete|and|or|not)\>" 0:blue,default;
|
||||||
addhl -group cpp-highlight regex "\<(const|auto|namespace|inline|static|volatile|class|struct|enum|union|public|protected|private|template|typedef|virtual|friend|extern|typename)\>" green default;
|
addhl -group cpp-highlight regex "\<(const|auto|namespace|inline|static|volatile|class|struct|enum|union|public|protected|private|template|typedef|virtual|friend|extern|typename)\>" 0:green,default;
|
||||||
addhl -group cpp-highlight regex "(?<!')\"(\\\"|[^\"])*\"" magenta default;
|
addhl -group cpp-highlight regex "(?<!')\"(\\\"|[^\"])*\"" 0:magenta,default;
|
||||||
addhl -group cpp-highlight regex "(\`|(?<=\n))\h*#\h*[^\n]*" magenta default;
|
addhl -group cpp-highlight regex "(\`|(?<=\n))\h*#\h*[^\n]*" 0:magenta,default;
|
||||||
addhl -group cpp-highlight regex "(//[^\n]*\n)|(/\*.*?(\*/|\'))" cyan default;
|
addhl -group cpp-highlight regex "(//[^\n]*\n)|(/\*.*?(\*/|\'))" 0:cyan,default;
|
||||||
addfilter group cpp-filters;
|
addfilter group cpp-filters;
|
||||||
addfilter -group cpp-filters preserve_indent;
|
addfilter -group cpp-filters preserve_indent;
|
||||||
addfilter -group cpp-filters cleanup_whitespaces;
|
addfilter -group cpp-filters cleanup_whitespaces;
|
||||||
|
|
|
@ -4,9 +4,9 @@ hook global BufCreate .*\.(diff|patch) %{
|
||||||
|
|
||||||
hook global WinSetOption filetype=diff %{
|
hook global WinSetOption filetype=diff %{
|
||||||
addhl group diff-highlight
|
addhl group diff-highlight
|
||||||
addhl -group diff-highlight regex "^\+[^\n]*\n" green default
|
addhl -group diff-highlight regex "^\+[^\n]*\n" 0:green,default
|
||||||
addhl -group diff-highlight regex "^-[^\n]*\n" red default
|
addhl -group diff-highlight regex "^-[^\n]*\n" 0:red,default
|
||||||
addhl -group diff-highlight regex "^@@[^\n]*@@" cyan default
|
addhl -group diff-highlight regex "^@@[^\n]*@@" 0:cyan,default
|
||||||
}
|
}
|
||||||
|
|
||||||
hook global WinSetOption filetype=(?!diff).* %{
|
hook global WinSetOption filetype=(?!diff).* %{
|
||||||
|
|
|
@ -4,9 +4,9 @@ hook global BufCreate .*COMMIT_EDITMSG %{
|
||||||
|
|
||||||
hook global WinSetOption filetype=git-commit %{
|
hook global WinSetOption filetype=git-commit %{
|
||||||
addhl group git-commit-highlight
|
addhl group git-commit-highlight
|
||||||
addhl -group git-commit-highlight regex "#[^\n]*\n" cyan default
|
addhl -group git-commit-highlight regex "#[^\n]*\n" 0:cyan,default
|
||||||
addhl -group git-commit-highlight regex "\<(modified|deleted|new file):[^\n]*\n" magenta default
|
addhl -group git-commit-highlight regex "\<(modified|deleted|new file):[^\n]*\n" 0:magenta,default
|
||||||
addhl -group git-commit-highlight regex "\<(modified|deleted|new file):" red default
|
addhl -group git-commit-highlight regex "\<(modified|deleted|new file):" 0:red,default
|
||||||
}
|
}
|
||||||
|
|
||||||
hook global WinSetOption filetype=(?!git-commit).* %{
|
hook global WinSetOption filetype=(?!git-commit).* %{
|
||||||
|
@ -19,9 +19,9 @@ hook global BufCreate .*git-rebase-todo %{
|
||||||
|
|
||||||
hook global WinSetOption filetype=git-rebase %{
|
hook global WinSetOption filetype=git-rebase %{
|
||||||
addhl group git-rebase-highlight
|
addhl group git-rebase-highlight
|
||||||
addhl -group git-rebase-highlight regex "#[^\n]*\n" cyan default
|
addhl -group git-rebase-highlight regex "#[^\n]*\n" 0:cyan,default
|
||||||
addhl -group git-rebase-highlight regex "^(pick|edit|reword|squash|fixup|exec|[persfx]) \w+" magenta default
|
addhl -group git-rebase-highlight regex "^(pick|edit|reword|squash|fixup|exec|[persfx]) \w+" 0:magenta,default
|
||||||
addhl -group git-rebase-highlight regex "^(pick|edit|reword|squash|fixup|exec|[persfx])" green default
|
addhl -group git-rebase-highlight regex "^(pick|edit|reword|squash|fixup|exec|[persfx])" 0:green,default
|
||||||
}
|
}
|
||||||
|
|
||||||
hook global WinSetOption filetype=(?!git-rebase).* %{
|
hook global WinSetOption filetype=(?!git-rebase).* %{
|
||||||
|
|
|
@ -4,15 +4,15 @@ hook global BufCreate (.*/)?(kakrc|.*.kak) %{
|
||||||
|
|
||||||
hook global WinSetOption filetype=kak %{
|
hook global WinSetOption filetype=kak %{
|
||||||
addhl group kak-highlight
|
addhl group kak-highlight
|
||||||
addhl -group kak-highlight regex \<(hook|addhl|rmhl|addfilter|rmfilter|exec|source|runtime|def|echo|edit|set[gbw])\> green default
|
addhl -group kak-highlight regex \<(hook|addhl|rmhl|addfilter|rmfilter|exec|source|runtime|def|echo|edit|set[gbw])\> 0:green,default
|
||||||
addhl -group kak-highlight regex \<(default|black|red|green|yellow|blue|magenta|cyan|white)\> yellow default
|
addhl -group kak-highlight regex \<(default|black|red|green|yellow|blue|magenta|cyan|white)\> 0:yellow,default
|
||||||
addhl -group kak-highlight regex (?<=\<hook)(\h+\w+){2}\h+\H+ magenta default
|
addhl -group kak-highlight regex (?<=\<hook)(\h+\w+){2}\h+\H+ 0:magenta,default
|
||||||
addhl -group kak-highlight regex (?<=\<hook)(\h+\w+){2} cyan default
|
addhl -group kak-highlight regex (?<=\<hook)(\h+\w+){2} 0:cyan,default
|
||||||
addhl -group kak-highlight regex (?<=\<hook)(\h+\w+) red default
|
addhl -group kak-highlight regex (?<=\<hook)(\h+\w+) 0:red,default
|
||||||
addhl -group kak-highlight regex (?<=\<hook)(\h+(global|buffer|window)) blue default
|
addhl -group kak-highlight regex (?<=\<hook)(\h+(global|buffer|window)) 0:blue,default
|
||||||
addhl -group kak-highlight regex (?<=\<regex)\h+\S+ magenta default
|
addhl -group kak-highlight regex (?<=\<regex)\h+\S+ 0:magenta,default
|
||||||
addhl -group kak-highlight regex (?<=\<set[gbw])\h+\S+\h+\S+ magenta default
|
addhl -group kak-highlight regex (?<=\<set[gbw])\h+\S+\h+\S+ 0:magenta,default
|
||||||
addhl -group kak-highlight regex (?<=\<set[gbw])\h+\S+ red default
|
addhl -group kak-highlight regex (?<=\<set[gbw])\h+\S+ 0:red,default
|
||||||
}
|
}
|
||||||
|
|
||||||
hook global WinSetOption filetype=(?!kak).* %{
|
hook global WinSetOption filetype=(?!kak).* %{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user