summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2021-08-28 13:53:01 +1000
committerMaxime Coste <mawww@kakoune.org>2021-08-28 13:53:23 +1000
commit726bec4670b612a12682bb7db22862edc127220b (patch)
tree67f60340f5f760b2d0ecdf0abedffbc946f15e45 /src
parente454b393cfaa69d270dda842b40d9c8fc3d672e6 (diff)
Support info markup spanning multiple lines
Preserve the active face accross lines Fixes #4313
Diffstat (limited to 'src')
-rw-r--r--src/commands.cc6
-rw-r--r--src/display_buffer.cc18
-rw-r--r--src/display_buffer.hh1
3 files changed, 18 insertions, 7 deletions
diff --git a/src/commands.cc b/src/commands.cc
index 543b14a5..61c90e31 100644
--- a/src/commands.cc
+++ b/src/commands.cc
@@ -2299,11 +2299,7 @@ const CommandDesc info_cmd = {
auto title = parser.get_switch("title").value_or(StringView{});
if (parser.get_switch("markup"))
context.client().info_show(parse_display_line(title, context.faces()),
- parser[0] | split<StringView>('\n')
- | transform([&](StringView s) {
- return parse_display_line(s, context.faces());
- })
- | gather<DisplayLineList>(),
+ parse_display_line_list(parser[0], context.faces()),
pos, style);
else
context.client().info_show(title.str(), parser[0], pos, style);
diff --git a/src/display_buffer.cc b/src/display_buffer.cc
index e7caed04..d98108cd 100644
--- a/src/display_buffer.cc
+++ b/src/display_buffer.cc
@@ -257,13 +257,12 @@ void DisplayBuffer::optimize()
line.optimize();
}
-DisplayLine parse_display_line(StringView line, const FaceRegistry& faces, const HashMap<String, DisplayLine>& builtins)
+DisplayLine parse_display_line(StringView line, Face& face, const FaceRegistry& faces, const HashMap<String, DisplayLine>& builtins)
{
DisplayLine res;
bool was_antislash = false;
auto pos = line.begin();
String content;
- Face face;
for (auto it = line.begin(), end = line.end(); it != end; ++it)
{
const char c = *it;
@@ -332,4 +331,19 @@ DisplayLine parse_display_line(StringView line, const FaceRegistry& faces, const
return res;
}
+DisplayLine parse_display_line(StringView line, const FaceRegistry& faces, const HashMap<String, DisplayLine>& builtins)
+{
+ Face face{};
+ return parse_display_line(line, face, faces, builtins);
+}
+
+DisplayLineList parse_display_line_list(StringView content, const FaceRegistry& faces, const HashMap<String, DisplayLine>& builtins)
+{
+ return content | split<StringView>('\n')
+ | transform([&, face=Face{}](StringView s) mutable {
+ return parse_display_line(s, face, faces, builtins);
+ })
+ | gather<DisplayLineList>();
+}
+
}
diff --git a/src/display_buffer.hh b/src/display_buffer.hh
index 855fa92d..bfa01bfb 100644
--- a/src/display_buffer.hh
+++ b/src/display_buffer.hh
@@ -157,6 +157,7 @@ using DisplayLineList = Vector<DisplayLine>;
class FaceRegistry;
DisplayLine parse_display_line(StringView line, const FaceRegistry& faces, const HashMap<String, DisplayLine>& builtins = {});
+DisplayLineList parse_display_line_list(StringView content, const FaceRegistry& faces, const HashMap<String, DisplayLine>& builtins = {});
class DisplayBuffer : public UseMemoryDomain<MemoryDomain::Display>
{