diff --git a/rc/clang.kak b/rc/clang.kak index eff8e2f3..b7db9479 100644 --- a/rc/clang.kak +++ b/rc/clang.kak @@ -75,8 +75,8 @@ def clang-parse -params 0..1 -docstring "Parse the contents of the current buffe fi flags=$(cat ${dir}/stderr | sed -rne " - /^:[0-9]+:([0-9]+:)? (fatal )?error/ { s/^:([0-9]+):.*/\1|red|█/; p } - /^:[0-9]+:([0-9]+:)? warning/ { s/^:([0-9]+):.*/\1|yellow|█/; p } + /^:[0-9]+:([0-9]+:)? (fatal )?error/ { s/^:([0-9]+):.*/\1|{red}█/; p } + /^:[0-9]+:([0-9]+:)? warning/ { s/^:([0-9]+):.*/\1|{yellow}█/; p } " | paste -s -d ':') 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" %{ - addhl flag_lines default clang_flags' + addhl flag_lines default clang_flags hook window -group clang-diagnostics NormalIdle .* %{ clang-show-error-info } } diff --git a/rc/git-tools.kak b/rc/git-tools.kak index 8aeb7741..3d77e88b 100644 --- a/rc/git-tools.kak +++ b/rc/git-tools.kak @@ -70,12 +70,12 @@ def -params 1.. \ text=substr(sha,1,8) " " dates[sha] " " authors[sha] gsub(":", "\\:", text) # gsub("|", "\\|", text) - flag=line "|default|" text + flag=line "|" text for ( i=1; i < count; i++ ) { - flag=flag ":" line+i "|default|" text + flag=flag ":" line+i "|" text } 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) } /^([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++ } - /^\-/ { flags=flags ":" line "|red|-" } + /^\-/ { flags=flags ":" line "|{red}-" } END { print "set buffer git_diff_flags ", flags } ' } diff --git a/src/highlighters.cc b/src/highlighters.cc index 28e36660..aba0079d 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -944,22 +944,37 @@ HighlighterAndId create_flag_lines_highlighter(HighlighterParameters params) } auto def_face = get_face(default_face); + Vector 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; - for (auto& l : lines) - width = std::max(width, std::get<2>(l).char_length()); - const String empty{' ', width}; + for (auto& l : display_lines) + width = std::max(width, l.length()); + const DisplayAtom empty{String{' ', width}, def_face}; for (auto& line : display_buffer.lines()) { int line_num = (int)line.range().begin.line + 1; auto it = find_if(lines, [&](const LineAndFlag& l) { return std::get<0>(l) == line_num; }); - String content = it != lines.end() ? std::get<2>(*it) : empty; - content += String(' ', width - content.char_length()); - DisplayAtom atom{std::move(content)}; - atom.face = it != lines.end() ? merge_faces(get_face(std::get<1>(*it)), def_face) : def_face; - line.insert(line.begin(), std::move(atom)); + if (it == lines.end()) + line.insert(line.begin(), empty); + else + { + 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); + } } }; diff --git a/src/highlighters.hh b/src/highlighters.hh index 8c6fd3c4..26b7a5d1 100644 --- a/src/highlighters.hh +++ b/src/highlighters.hh @@ -9,7 +9,7 @@ namespace Kakoune void register_highlighters(); -using LineAndFlag = std::tuple; +using LineAndFlag = std::tuple; } diff --git a/src/option_types.hh b/src/option_types.hh index 73a8bcfb..0330a7e9 100644 --- a/src/option_types.hh +++ b/src/option_types.hh @@ -253,7 +253,8 @@ inline void option_from_string(StringView str, TimestampedList& opt) { auto it = find(str, ':'); opt.timestamp = str_to_int({str.begin(), it}); - option_from_string({it+1, str.end()}, opt.list); + if (it != str.end()) + option_from_string({it+1, str.end()}, opt.list); } template