aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/buffer_updates.c
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2020-01-16 15:31:05 +0100
committerGitHub <noreply@github.com>2020-01-16 15:31:05 +0100
commit6e78b2162382718b638c4532a155e5c3f9ed7515 (patch)
tree5868096a30a61deed1765e1c9ec93072a4d0c34b /src/nvim/buffer_updates.c
parent8ba3354d74a8f90ded0997100bdbe845a8c5382f (diff)
parentca1a00edd6d6345b848a28d077d6a192528f811e (diff)
downloadrneovim-6e78b2162382718b638c4532a155e5c3f9ed7515.tar.gz
rneovim-6e78b2162382718b638c4532a155e5c3f9ed7515.tar.bz2
rneovim-6e78b2162382718b638c4532a155e5c3f9ed7515.zip
Merge pull request #11563 from bfredl/mark_madness
extmarks: mark sanity/madness
Diffstat (limited to 'src/nvim/buffer_updates.c')
-rw-r--r--src/nvim/buffer_updates.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/nvim/buffer_updates.c b/src/nvim/buffer_updates.c
index d12527d6ac..80780a3aa3 100644
--- a/src/nvim/buffer_updates.c
+++ b/src/nvim/buffer_updates.c
@@ -281,6 +281,54 @@ void buf_updates_send_changes(buf_T *buf,
kv_size(buf->update_callbacks) = j;
}
+void buf_updates_send_splice(buf_T *buf,
+ linenr_T start_line, colnr_T start_col,
+ linenr_T oldextent_line, colnr_T oldextent_col,
+ linenr_T newextent_line, colnr_T newextent_col)
+{
+ if (!buf_updates_active(buf)) {
+ return;
+ }
+
+ // notify each of the active callbakcs
+ size_t j = 0;
+ for (size_t i = 0; i < kv_size(buf->update_callbacks); i++) {
+ BufUpdateCallbacks cb = kv_A(buf->update_callbacks, i);
+ bool keep = true;
+ if (cb.on_bytes != LUA_NOREF) {
+ Array args = ARRAY_DICT_INIT;
+ Object items[8];
+ args.size = 8;
+ args.items = items;
+
+ // the first argument is always the buffer handle
+ args.items[0] = BUFFER_OBJ(buf->handle);
+
+ // next argument is b:changedtick
+ args.items[1] = INTEGER_OBJ(buf_get_changedtick(buf));
+
+ args.items[2] = INTEGER_OBJ(start_line);
+ args.items[3] = INTEGER_OBJ(start_col);
+ args.items[4] = INTEGER_OBJ(oldextent_line);
+ args.items[5] = INTEGER_OBJ(oldextent_col);
+ args.items[6] = INTEGER_OBJ(newextent_line);
+ args.items[7] = INTEGER_OBJ(newextent_col);
+
+ textlock++;
+ Object res = executor_exec_lua_cb(cb.on_bytes, "bytes", args, true, NULL);
+ textlock--;
+
+ if (res.type == kObjectTypeBoolean && res.data.boolean == true) {
+ free_update_callbacks(cb);
+ keep = false;
+ }
+ }
+ if (keep) {
+ kv_A(buf->update_callbacks, j++) = kv_A(buf->update_callbacks, i);
+ }
+ }
+ kv_size(buf->update_callbacks) = j;
+}
void buf_updates_changedtick(buf_T *buf)
{
// notify each of the active channels