From 380ff553b508c61ee3bd014a16791bfa22d46552 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Tue, 28 Nov 2017 19:04:21 +0800 Subject: [PATCH] Wrap: try to rework and simplify the algorithms further Fixes #1731 --- src/highlighters.cc | 16 ++++++---------- test/regression/1731-wrap-hidden-buffer/cmd | 1 + test/regression/1731-wrap-hidden-buffer/display | 6 ++++++ test/regression/1731-wrap-hidden-buffer/in | 4 ++++ test/regression/1731-wrap-hidden-buffer/rc | 1 + 5 files changed, 18 insertions(+), 10 deletions(-) create mode 100644 test/regression/1731-wrap-hidden-buffer/cmd create mode 100644 test/regression/1731-wrap-hidden-buffer/display create mode 100644 test/regression/1731-wrap-hidden-buffer/in create mode 100644 test/regression/1731-wrap-hidden-buffer/rc diff --git a/src/highlighters.cc b/src/highlighters.cc index e4d6553c..aeec70ef 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -759,14 +759,13 @@ struct WrapHighlighter : Highlighter // Disable horizontal scrolling when using a WrapHighlighter setup.window_pos.column = 0; - setup.window_range.line = win_height; + setup.window_range.line = 0; setup.scroll_offset.column = 0; setup.full_lines = true; for (auto buf_line = setup.window_pos.line, win_line = 0_line; - buf_line < setup.window_pos.line + setup.window_range.line or - buf_line <= cursor.line; - ++buf_line) + win_line < win_height or buf_line <= cursor.line; + ++buf_line, ++setup.window_range.line) { if (buf_line >= buffer.line_count()) break; @@ -775,9 +774,6 @@ struct WrapHighlighter : Highlighter if (indent >= wrap_column) // do not preserve indent when its bigger than wrap column indent = 0; - const auto wrap_count = line_wrap_count(buf_line, indent); - setup.window_range.line -= wrap_count; - if (buf_line == cursor.line) { BufferCoord coord{buf_line}; @@ -799,18 +795,18 @@ struct WrapHighlighter : Highlighter } kak_assert(setup.cursor_pos.column >= 0 and setup.cursor_pos.column < setup.window_range.column); } + const auto wrap_count = line_wrap_count(buf_line, indent); win_line += wrap_count + 1; // scroll window to keep cursor visible, and update range as lines gets removed while (buf_line >= cursor.line and setup.window_pos.line < cursor.line and - cursor.line + setup.scroll_offset.line >= setup.window_pos.line + setup.window_range.line) + setup.cursor_pos.line + setup.scroll_offset.line >= win_height) { auto remove_count = std::min(win_height, 1 + line_wrap_count(setup.window_pos.line, indent)); ++setup.window_pos.line; + --setup.window_range.line; setup.cursor_pos.line -= remove_count; win_line -= remove_count; - // removed one line from the range, added remove_count potential ones - setup.window_range.line += remove_count - 1; kak_assert(setup.cursor_pos.line >= 0); } } diff --git a/test/regression/1731-wrap-hidden-buffer/cmd b/test/regression/1731-wrap-hidden-buffer/cmd new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/test/regression/1731-wrap-hidden-buffer/cmd @@ -0,0 +1 @@ + diff --git a/test/regression/1731-wrap-hidden-buffer/display b/test/regression/1731-wrap-hidden-buffer/display new file mode 100644 index 00000000..71d85134 --- /dev/null +++ b/test/regression/1731-wrap-hidden-buffer/display @@ -0,0 +1,6 @@ +{ "jsonrpc": "2.0", "method": "draw", "params": [[[{ "face": { "fg": "black", "bg": "white", "attributes": [] }, "contents": "0" }, { "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "1 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 0" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "1 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 " }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 0" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "1 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 " }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 0" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "1 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 " }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 0" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "1 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 " }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 0" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "1 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 " }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " \u000a" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "\u000a" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 0" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "2 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 " }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 0" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "2 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 " }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02" }]], { "fg": "default", "bg": "default", "attributes": [] }, { "fg": "blue", "bg": "default", "attributes": [] }] } +{ "jsonrpc": "2.0", "method": "menu_hide", "params": [] } +{ "jsonrpc": "2.0", "method": "info_hide", "params": [] } +{ "jsonrpc": "2.0", "method": "draw_status", "params": [[], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "out 1:1 " }, { "face": { "fg": "black", "bg": "yellow", "attributes": [] }, "contents": "" }, { "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " " }, { "face": { "fg": "blue", "bg": "default", "attributes": [] }, "contents": "1 sel" }, { "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": " - unnamed0@[kak-tests]" }], { "fg": "cyan", "bg": "default", "attributes": [] }] } +{ "jsonrpc": "2.0", "method": "set_cursor", "params": ["buffer", { "line": 0, "column": 0 }] } +{ "jsonrpc": "2.0", "method": "refresh", "params": [true] } diff --git a/test/regression/1731-wrap-hidden-buffer/in b/test/regression/1731-wrap-hidden-buffer/in new file mode 100644 index 00000000..cd581591 --- /dev/null +++ b/test/regression/1731-wrap-hidden-buffer/in @@ -0,0 +1,4 @@ +01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + +02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + diff --git a/test/regression/1731-wrap-hidden-buffer/rc b/test/regression/1731-wrap-hidden-buffer/rc new file mode 100644 index 00000000..373ec148 --- /dev/null +++ b/test/regression/1731-wrap-hidden-buffer/rc @@ -0,0 +1 @@ +add-highlighter window wrap