diff options
-rw-r--r-- | src/nvim/api/buffer.c | 3 | ||||
-rw-r--r-- | src/nvim/liveupdate.c | 26 | ||||
-rw-r--r-- | src/nvim/liveupdate.h | 2 | ||||
-rw-r--r-- | test/functional/api/liveupdate_spec.lua | 50 |
4 files changed, 46 insertions, 35 deletions
diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c index 159683db9e..e594e4975c 100644 --- a/src/nvim/api/buffer.c +++ b/src/nvim/api/buffer.c @@ -87,6 +87,7 @@ String buffer_get_line(Buffer buffer, Integer index, Error *err) Boolean nvim_buf_live_updates(uint64_t channel_id, Buffer buffer, Boolean enabled, + Boolean send_buffer, Error *err) FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY { @@ -97,7 +98,7 @@ Boolean nvim_buf_live_updates(uint64_t channel_id, } if (enabled) { - return liveupdate_register(buf, channel_id); + return liveupdate_register(buf, channel_id, send_buffer); } liveupdate_unregister(buf, channel_id); diff --git a/src/nvim/liveupdate.c b/src/nvim/liveupdate.c index 953c5b52b3..9679d72569 100644 --- a/src/nvim/liveupdate.c +++ b/src/nvim/liveupdate.c @@ -6,7 +6,7 @@ // Register a channel. Return True if the channel was added, or already added. // Return False if the channel couldn't be added because the buffer is // unloaded. -bool liveupdate_register(buf_T *buf, uint64_t channel_id) +bool liveupdate_register(buf_T *buf, uint64_t channel_id, bool send_buffer) { // must fail if the buffer isn't loaded if (buf->b_ml.ml_mfp == NULL) { @@ -27,21 +27,23 @@ bool liveupdate_register(buf_T *buf, uint64_t channel_id) // append the channelid to the list kv_push(buf->liveupdate_channels, channel_id); - // send through the full channel contents now Array linedata = ARRAY_DICT_INIT; - size_t line_count = buf->b_ml.ml_line_count; - linedata.size = line_count; - linedata.items = xcalloc(sizeof(Object), line_count); - for (size_t i = 0; i < line_count; i++) { - linenr_T lnum = 1 + (linenr_T)i; + if (send_buffer) { + // collect buffer contents + size_t line_count = buf->b_ml.ml_line_count; + linedata.size = line_count; + linedata.items = xcalloc(sizeof(Object), line_count); + for (size_t i = 0; i < line_count; i++) { + linenr_T lnum = 1 + (linenr_T)i; - const char *bufstr = (char *)ml_get_buf(buf, lnum, false); - Object str = STRING_OBJ(cstr_to_string(bufstr)); + const char *bufstr = (char *)ml_get_buf(buf, lnum, false); + Object str = STRING_OBJ(cstr_to_string(bufstr)); - // Vim represents NULs as NLs, but this may confuse clients. - strchrsub(str.data.string.data, '\n', '\0'); + // Vim represents NULs as NLs, but this may confuse clients. + strchrsub(str.data.string.data, '\n', '\0'); - linedata.items[i] = str; + linedata.items[i] = str; + } } Array args = ARRAY_DICT_INIT; diff --git a/src/nvim/liveupdate.h b/src/nvim/liveupdate.h index bbee4b3766..77fb420bf0 100644 --- a/src/nvim/liveupdate.h +++ b/src/nvim/liveupdate.h @@ -3,7 +3,7 @@ #include "nvim/buffer_defs.h" -bool liveupdate_register(buf_T *buf, uint64_t channel_id); +bool liveupdate_register(buf_T *buf, uint64_t channel_id, bool send_buffer); void liveupdate_unregister(buf_T *buf, uint64_t channel_id); void liveupdate_unregister_all(buf_T *buf); void liveupdate_send_changes(buf_T *buf, linenr_T firstline, int64_t num_added, diff --git a/test/functional/api/liveupdate_spec.lua b/test/functional/api/liveupdate_spec.lua index d6f1b2e384..6f83a3e904 100644 --- a/test/functional/api/liveupdate_spec.lua +++ b/test/functional/api/liveupdate_spec.lua @@ -39,7 +39,7 @@ function open(activate, lines) -- turn on live updates, ensure that the LiveUpdateStart messages -- arrive as expectected if activate then - ok(buffer('live_updates', b, true)) + ok(buffer('live_updates', b, true, true)) expectn('LiveUpdateStart', {b, tick, lines, false}) end @@ -47,12 +47,12 @@ function open(activate, lines) end function reopen(buf, expectedlines) - ok(buffer('live_updates', buf, false)) + ok(buffer('live_updates', buf, false, true)) expectn('LiveUpdateEnd', {buf}) -- for some reason the :edit! increments tick by 2 command('edit!') local tick = eval('b:changedtick') - ok(buffer('live_updates', buf, true)) + ok(buffer('live_updates', buf, true, true)) expectn('LiveUpdateStart', {buf, tick, origlines, false}) command('normal! gg') return tick @@ -161,20 +161,20 @@ describe('liveupdate', function() command('enew') local tick = eval('b:changedtick') b2 = nvim('get_current_buf') - ok(buffer('live_updates', b2, true)) + ok(buffer('live_updates', b2, true, true)) expectn('LiveUpdateStart', {b2, tick, {""}, false}) eval('append(0, ["new line 1"])') tick = tick + 1 expectn('LiveUpdate', {b2, tick, 0, 0, {'new line 1'}}) -- turn off live updates manually - buffer('live_updates', b2, false) + buffer('live_updates', b2, false, true) expectn('LiveUpdateEnd', {b2}) -- add multiple lines to a blank file command('enew!') b3 = nvim('get_current_buf') - ok(buffer('live_updates', b3, true)) + ok(buffer('live_updates', b3, true, true)) tick = eval('b:changedtick') expectn('LiveUpdateStart', {b3, tick, {""}, false}) eval('append(0, ["new line 1", "new line 2", "new line 3"])') @@ -267,7 +267,7 @@ describe('liveupdate', function() tick = 2 expectn('LiveUpdateEnd', {b}) bnew = nvim('get_current_buf') - ok(buffer('live_updates', bnew, true)) + ok(buffer('live_updates', bnew, true, true)) expectn('LiveUpdateStart', {bnew, tick, {''}, false}) sendkeys('i') sendkeys('h') @@ -440,21 +440,21 @@ describe('liveupdate', function() local b, tick = editoriginal(false) -- turn on live updates many times - ok(buffer('live_updates', b, true)) - ok(buffer('live_updates', b, true)) - ok(buffer('live_updates', b, true)) - ok(buffer('live_updates', b, true)) - ok(buffer('live_updates', b, true)) + ok(buffer('live_updates', b, true, true)) + ok(buffer('live_updates', b, true, true)) + ok(buffer('live_updates', b, true, true)) + ok(buffer('live_updates', b, true, true)) + ok(buffer('live_updates', b, true, true)) expectn('LiveUpdateStart', {b, tick, origlines, false}) eval('rpcnotify('..channel..', "Hello There")') expectn('Hello There', {}) -- turn live updates off many times - ok(buffer('live_updates', b, false)) - ok(buffer('live_updates', b, false)) - ok(buffer('live_updates', b, false)) - ok(buffer('live_updates', b, false)) - ok(buffer('live_updates', b, false)) + ok(buffer('live_updates', b, false, true)) + ok(buffer('live_updates', b, false, true)) + ok(buffer('live_updates', b, false, true)) + ok(buffer('live_updates', b, false, true)) + ok(buffer('live_updates', b, false, true)) expectn('LiveUpdateEnd', {b}) eval('rpcnotify('..channel..', "Hello Again")') expectn('Hello Again', {}) @@ -493,9 +493,9 @@ describe('liveupdate', function() local b, tick = open(false, lines) -- turn on live updates for sessions 1, 2 and 3 - ok(request(1, 'nvim_buf_live_updates', b, true)) - ok(request(2, 'nvim_buf_live_updates', b, true)) - ok(request(3, 'nvim_buf_live_updates', b, true)) + ok(request(1, 'nvim_buf_live_updates', b, true, true)) + ok(request(2, 'nvim_buf_live_updates', b, true, true)) + ok(request(3, 'nvim_buf_live_updates', b, true, true)) wantn(1, 'LiveUpdateStart', {b, tick, lines, false}) wantn(2, 'LiveUpdateStart', {b, tick, lines, false}) wantn(3, 'LiveUpdateStart', {b, tick, lines, false}) @@ -508,7 +508,7 @@ describe('liveupdate', function() wantn(3, 'LiveUpdate', {b, tick, 0, 1, {'AA'}}) -- stop watching on channel 1 - ok(request(1, 'nvim_buf_live_updates', b, false)) + ok(request(1, 'nvim_buf_live_updates', b, false, true)) wantn(1, 'LiveUpdateEnd', {b}) -- undo the change to buffer 1 @@ -731,4 +731,12 @@ describe('liveupdate', function() expectn('LiveUpdateEnd', {b}) end end) + + it('doesn\'t send the buffer\'s content when not requested', function() + helpers.clear() + local b, tick = editoriginal(false) + ok(buffer('live_updates', b, true, false)) + expectn('LiveUpdateStart', {b, tick, {}, false}) + end) + end) |