Use markup for line-flags instead of a single face

This commit is contained in:
Maxime Coste 2015-12-12 23:16:07 +00:00
parent 8d7e16a8e6
commit b6105fa106
5 changed files with 34 additions and 18 deletions

View File

@ -75,8 +75,8 @@ def clang-parse -params 0..1 -docstring "Parse the contents of the current buffe
fi fi
flags=$(cat ${dir}/stderr | sed -rne " flags=$(cat ${dir}/stderr | sed -rne "
/^<stdin>:[0-9]+:([0-9]+:)? (fatal )?error/ { s/^<stdin>:([0-9]+):.*/\1|red|█/; p } /^<stdin>:[0-9]+:([0-9]+:)? (fatal )?error/ { s/^<stdin>:([0-9]+):.*/\1|{red}█/; p }
/^<stdin>:[0-9]+:([0-9]+:)? warning/ { s/^<stdin>:([0-9]+):.*/\1|yellow|█/; p } /^<stdin>:[0-9]+:([0-9]+:)? warning/ { s/^<stdin>:([0-9]+):.*/\1|{yellow}█/; p }
" | paste -s -d ':') " | paste -s -d ':')
errors=$(cat ${dir}/stderr | sed -rne " errors=$(cat ${dir}/stderr | sed -rne "
@ -131,7 +131,7 @@ def -allow-override -hidden clang-show-error-info %{ %sh{
} } } }
def clang-enable-diagnostics -docstring "Activate automatic diagnostics of the code by clang" %{ def clang-enable-diagnostics -docstring "Activate automatic diagnostics of the code by clang" %{
addhl flag_lines default clang_flags' addhl flag_lines default clang_flags
hook window -group clang-diagnostics NormalIdle .* %{ clang-show-error-info } hook window -group clang-diagnostics NormalIdle .* %{ clang-show-error-info }
} }

View File

@ -70,12 +70,12 @@ def -params 1.. \
text=substr(sha,1,8) " " dates[sha] " " authors[sha] text=substr(sha,1,8) " " dates[sha] " " authors[sha]
gsub(":", "\\:", text) gsub(":", "\\:", text)
# gsub("|", "\\|", text) # gsub("|", "\\|", text)
flag=line "|default|" text flag=line "|" text
for ( i=1; i < count; i++ ) { for ( i=1; i < count; i++ ) {
flag=flag ":" line+i "|default|" text flag=flag ":" line+i "|" text
} }
cmd = "kak -p " ENVIRON["kak_session"] cmd = "kak -p " ENVIRON["kak_session"]
print "set -add buffer=" ENVIRON["kak_bufname"] " git_blame_flags %{:" flag "}" | cmd print "set -add buffer=" ENVIRON["kak_bufname"] " git_blame_flags %{" flag "}" | cmd
close(cmd) close(cmd)
} }
/^([0-9a-f]{40}) ([0-9]+) ([0-9]+) ([0-9]+)/ { /^([0-9a-f]{40}) ([0-9]+) ([0-9]+) ([0-9]+)/ {
@ -108,10 +108,10 @@ def -params 1.. \
} }
} }
/^\+/ { /^\+/ {
flags=flags ":" line "|green|+" flags=flags ":" line "|{green}+"
line++ line++
} }
/^\-/ { flags=flags ":" line "|red|-" } /^\-/ { flags=flags ":" line "|{red}-" }
END { print "set buffer git_diff_flags ", flags } END { print "set buffer git_diff_flags ", flags }
' '
} }

View File

@ -944,22 +944,37 @@ HighlighterAndId create_flag_lines_highlighter(HighlighterParameters params)
} }
auto def_face = get_face(default_face); auto def_face = get_face(default_face);
Vector<DisplayLine> display_lines;
for (auto& line : lines)
{
display_lines.push_back(parse_display_line(std::get<1>(line)));
for (auto& atom : display_lines.back())
atom.face = merge_faces(def_face, atom.face);
}
CharCount width = 0; CharCount width = 0;
for (auto& l : lines) for (auto& l : display_lines)
width = std::max(width, std::get<2>(l).char_length()); width = std::max(width, l.length());
const String empty{' ', width}; const DisplayAtom empty{String{' ', width}, def_face};
for (auto& line : display_buffer.lines()) for (auto& line : display_buffer.lines())
{ {
int line_num = (int)line.range().begin.line + 1; int line_num = (int)line.range().begin.line + 1;
auto it = find_if(lines, auto it = find_if(lines,
[&](const LineAndFlag& l) [&](const LineAndFlag& l)
{ return std::get<0>(l) == line_num; }); { return std::get<0>(l) == line_num; });
String content = it != lines.end() ? std::get<2>(*it) : empty; if (it == lines.end())
content += String(' ', width - content.char_length()); line.insert(line.begin(), empty);
DisplayAtom atom{std::move(content)}; else
atom.face = it != lines.end() ? merge_faces(get_face(std::get<1>(*it)), def_face) : def_face; {
line.insert(line.begin(), std::move(atom)); DisplayLine& display_line = display_lines[it - lines.begin()];
DisplayAtom padding_atom{String(' ', width - display_line.length()), def_face};
auto it = std::copy(std::make_move_iterator(display_line.begin()),
std::make_move_iterator(display_line.end()),
std::inserter(line, line.begin()));
if (padding_atom.length() != 0)
*it++ = std::move(padding_atom);
}
} }
}; };

View File

@ -9,7 +9,7 @@ namespace Kakoune
void register_highlighters(); void register_highlighters();
using LineAndFlag = std::tuple<LineCount, String, String>; using LineAndFlag = std::tuple<LineCount, String>;
} }

View File

@ -253,6 +253,7 @@ inline void option_from_string(StringView str, TimestampedList<T>& opt)
{ {
auto it = find(str, ':'); auto it = find(str, ':');
opt.timestamp = str_to_int({str.begin(), it}); opt.timestamp = str_to_int({str.begin(), it});
if (it != str.end())
option_from_string({it+1, str.end()}, opt.list); option_from_string({it+1, str.end()}, opt.list);
} }