summaryrefslogtreecommitdiff
path: root/src/buffer_utils.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2020-06-27 13:33:50 +1000
committerMaxime Coste <mawww@kakoune.org>2020-06-27 13:33:50 +1000
commitfc3e5ea419aa79c7adf38a9252586d867b3eb19b (patch)
tree95d82f8658ea2797fbf35aad6cb6ce846e479e7a /src/buffer_utils.cc
parent099b83d922aff0bd19ffc1a10a729afa07de91fb (diff)
Refactor how InsetCompletionHide hook parameter is computed
Keep track of inserted ranges instead of trying to re-derive them. Fixes #3556
Diffstat (limited to 'src/buffer_utils.cc')
-rw-r--r--src/buffer_utils.cc20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/buffer_utils.cc b/src/buffer_utils.cc
index d8daa944..206dc4b7 100644
--- a/src/buffer_utils.cc
+++ b/src/buffer_utils.cc
@@ -4,6 +4,7 @@
#include "event_manager.hh"
#include "file.hh"
#include "selection.hh"
+#include "changes.hh"
#include <unistd.h>
@@ -15,6 +16,25 @@
namespace Kakoune
{
+void replace(Buffer& buffer, ArrayView<BufferRange> ranges, ConstArrayView<String> strings)
+{
+ ForwardChangesTracker changes_tracker;
+ size_t timestamp = buffer.timestamp();
+ for (size_t index = 0; index < ranges.size(); ++index)
+ {
+ auto& range = ranges[index];
+ range.begin = changes_tracker.get_new_coord_tolerant(range.begin);
+ range.end = changes_tracker.get_new_coord_tolerant(range.end);
+ kak_assert(buffer.is_valid(range.begin) and buffer.is_valid(range.end));
+
+ range = buffer.replace(range.begin, range.end, strings.empty() ? StringView{} : strings[std::min(index, strings.size()-1)]);
+ kak_assert(buffer.is_valid(range.begin) and buffer.is_valid(range.end));
+ changes_tracker.update(buffer, timestamp);
+ }
+
+ buffer.check_invariant();
+}
+
ColumnCount get_column(const Buffer& buffer,
ColumnCount tabstop, BufferCoord coord)
{