Change flag lines highlighter to use faces instead of colors
Fixes #130
This commit is contained in:
parent
504862fce7
commit
dc504284c3
|
@ -22,6 +22,8 @@ hook global WinSetOption filetype=(?!git-status).* %{
|
|||
decl line-flag-list git_blame_flags
|
||||
decl line-flag-list git_diff_flags
|
||||
|
||||
face GitBlame default,magenta
|
||||
|
||||
def -shell-params \
|
||||
-docstring %sh{printf "%%{Git wrapping helper\navailable commands:\n add\n rm\n blame\n commit\n checkout\n diff\n hide-blame\n log\n show\n show-diff\n status\n update-diff}"} \
|
||||
-shell-completion %{
|
||||
|
@ -58,7 +60,7 @@ def -shell-params \
|
|||
run_git_blame() {
|
||||
(
|
||||
echo "eval -client '$kak_client' %{
|
||||
try %{ addhl flag_lines magenta git_blame_flags }
|
||||
try %{ addhl flag_lines GitBlame git_blame_flags }
|
||||
set buffer=$kak_bufname git_blame_flags ''
|
||||
}" | kak -p ${kak_session}
|
||||
git blame "$@" --incremental ${kak_buffile} | awk -e '
|
||||
|
@ -66,10 +68,10 @@ def -shell-params \
|
|||
if (line == "") { return; }
|
||||
text=substr(sha,1,8) " " dates[sha] " " authors[sha]
|
||||
gsub(":", "\\:", text)
|
||||
gsub(",", "\\,", text)
|
||||
flag=line ",black," text
|
||||
# gsub("|", "\\|", text)
|
||||
flag=line "|default|" text
|
||||
for ( i=1; i < count; i++ ) {
|
||||
flag=flag ":" line+i ",black," text
|
||||
flag=flag ":" line+i "|default|" text
|
||||
}
|
||||
cmd = "kak -p " ENVIRON["kak_session"]
|
||||
print "set -add buffer=" ENVIRON["kak_bufname"] " git_blame_flags %{" flag "}" | cmd
|
||||
|
@ -94,7 +96,7 @@ def -shell-params \
|
|||
git diff -U0 $kak_buffile | awk -e '
|
||||
BEGIN {
|
||||
line=0
|
||||
flags="0,red,."
|
||||
flags="0|red|."
|
||||
}
|
||||
/^---.*/ {}
|
||||
/^@@ -[0-9]+(,[0-9]+)? \+[0-9]+(,[0-9]+)? @@.*/ {
|
||||
|
@ -105,10 +107,10 @@ def -shell-params \
|
|||
}
|
||||
}
|
||||
/^\+/ {
|
||||
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 }
|
||||
'
|
||||
}
|
||||
|
@ -150,7 +152,7 @@ def -shell-params \
|
|||
}"
|
||||
;;
|
||||
show-diff)
|
||||
echo "try %{ addhl flag_lines black git_diff_flags }"
|
||||
echo "try %{ addhl flag_lines default,black git_diff_flags }"
|
||||
update_diff
|
||||
;;
|
||||
update-diff) update_diff ;;
|
||||
|
|
|
@ -42,6 +42,13 @@ constexpr bool operator!=(const Face& lhs, const Face& rhs)
|
|||
return not (lhs == rhs);
|
||||
}
|
||||
|
||||
constexpr Face merge_faces(const Face& base, const Face& face)
|
||||
{
|
||||
return { face.fg == Color::Default ? base.fg : face.fg,
|
||||
face.bg == Color::Default ? base.bg : face.bg,
|
||||
face.attributes | base.attributes };
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif // face_hh_INCLUDED
|
||||
|
|
|
@ -155,12 +155,7 @@ void apply_highlighter(const Context& context,
|
|||
auto apply_face = [](const Face& face)
|
||||
{
|
||||
return [&face](DisplayAtom& atom) {
|
||||
if (face.fg != Color::Default)
|
||||
atom.face.fg = face.fg;
|
||||
if (face.bg != Color::Default)
|
||||
atom.face.bg = face.bg;
|
||||
if (face.attributes != Attribute::Normal)
|
||||
atom.face.attributes |= face.attributes;
|
||||
atom.face = merge_faces(atom.face, face);
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -891,7 +886,8 @@ HighlighterAndId create_flag_lines_highlighter(HighlighterParameters params)
|
|||
throw runtime_error("wrong parameter count");
|
||||
|
||||
const String& option_name = params[1];
|
||||
Color bg = str_to_color(params[0]);
|
||||
String default_face = params[0];
|
||||
get_face(default_face); // validate param
|
||||
|
||||
// throw if wrong option type
|
||||
GlobalScope::instance().options()[option_name].get<Vector<LineAndFlag, MemoryDomain::Options>>();
|
||||
|
@ -902,6 +898,8 @@ HighlighterAndId create_flag_lines_highlighter(HighlighterParameters params)
|
|||
auto& lines_opt = context.options()[option_name];
|
||||
auto& lines = lines_opt.get<Vector<LineAndFlag, MemoryDomain::Options>>();
|
||||
|
||||
auto def_face = get_face(default_face);
|
||||
|
||||
CharCount width = 0;
|
||||
for (auto& l : lines)
|
||||
width = std::max(width, std::get<2>(l).char_length());
|
||||
|
@ -915,7 +913,7 @@ HighlighterAndId create_flag_lines_highlighter(HighlighterParameters params)
|
|||
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() ? std::get<1>(*it) : Color::Default , bg };
|
||||
atom.face = it != lines.end() ? merge_faces(get_face(std::get<1>(*it)), def_face) : def_face;
|
||||
line.insert(line.begin(), std::move(atom));
|
||||
}
|
||||
};
|
||||
|
|
|
@ -9,7 +9,7 @@ namespace Kakoune
|
|||
|
||||
void register_highlighters();
|
||||
|
||||
using LineAndFlag = std::tuple<LineCount, Color, String>;
|
||||
using LineAndFlag = std::tuple<LineCount, String, String>;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -98,7 +98,7 @@ void option_from_string(StringView str, UnorderedMap<Key, Value, domain>& opt)
|
|||
}
|
||||
}
|
||||
|
||||
constexpr char tuple_separator = ',';
|
||||
constexpr char tuple_separator = '|';
|
||||
|
||||
template<size_t I, typename... Types>
|
||||
struct TupleOptionDetail
|
||||
|
@ -176,9 +176,9 @@ bool option_add(T&, const T&)
|
|||
template<typename EffectiveType, typename LineType, typename ColumnType>
|
||||
inline void option_from_string(StringView str, LineAndColumn<EffectiveType, LineType, ColumnType>& opt)
|
||||
{
|
||||
auto vals = split(str, tuple_separator);
|
||||
auto vals = split(str, ',');
|
||||
if (vals.size() != 2)
|
||||
throw runtime_error(format("expected <line>{}<column>", tuple_separator));
|
||||
throw runtime_error("expected <line>,<column>");
|
||||
opt.line = str_to_int(vals[0]);
|
||||
opt.column = str_to_int(vals[1]);
|
||||
}
|
||||
|
@ -186,7 +186,7 @@ inline void option_from_string(StringView str, LineAndColumn<EffectiveType, Line
|
|||
template<typename EffectiveType, typename LineType, typename ColumnType>
|
||||
inline String option_to_string(const LineAndColumn<EffectiveType, LineType, ColumnType>& opt)
|
||||
{
|
||||
return to_string(opt.line) + tuple_separator + to_string(opt.column);
|
||||
return format("{},{}", opt.line, opt.column);
|
||||
}
|
||||
|
||||
enum YesNoAsk
|
||||
|
|
Loading…
Reference in New Issue
Block a user