diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2019-03-05 19:39:15 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-05 19:39:15 +0100 |
commit | e386e51d9e284ece5fe78a6dbcc0c8c4f166e48a (patch) | |
tree | c0562a62f8c514d0c3e08521dcede652243385e4 | |
parent | 7e6fce0698f52fb189a78bf7388a4bdb238dcde7 (diff) | |
parent | f5d5da391715f3b1d4c3d36c522e39b94866b93f (diff) | |
download | rneovim-e386e51d9e284ece5fe78a6dbcc0c8c4f166e48a.tar.gz rneovim-e386e51d9e284ece5fe78a6dbcc0c8c4f166e48a.tar.bz2 rneovim-e386e51d9e284ece5fe78a6dbcc0c8c4f166e48a.zip |
Merge pull request #9674 from bfredl/bufapi-fix
api/buffer: use aucmd_prepbuf() to manipulate invisible buffer, fix some issues
-rw-r--r-- | src/nvim/api/buffer.c | 46 | ||||
-rw-r--r-- | src/nvim/api/vim.c | 12 | ||||
-rw-r--r-- | src/nvim/buffer.h | 40 | ||||
-rw-r--r-- | src/nvim/terminal.c | 14 | ||||
-rw-r--r-- | test/functional/api/buffer_spec.lua | 35 | ||||
-rw-r--r-- | test/functional/api/vim_spec.lua | 22 | ||||
-rw-r--r-- | test/functional/ui/float_spec.lua | 34 |
7 files changed, 92 insertions, 111 deletions
diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c index 9cd178eaeb..3613a8f8bc 100644 --- a/src/nvim/api/buffer.c +++ b/src/nvim/api/buffer.c @@ -380,8 +380,6 @@ void nvim_buf_set_lines(uint64_t channel_id, } } - win_T *save_curwin = NULL; - tabpage_T *save_curtab = NULL; size_t new_len = replacement.size; size_t old_len = (size_t)(end - start); ptrdiff_t extra = 0; // lines added to text, can be negative @@ -397,8 +395,8 @@ void nvim_buf_set_lines(uint64_t channel_id, } try_start(); - bufref_T save_curbuf = { NULL, 0, 0 }; - switch_to_win_for_buf(buf, &save_curwin, &save_curtab, &save_curbuf); + aco_save_T aco; + aucmd_prepbuf(&aco, (buf_T *)buf); if (u_save((linenr_T)(start - 1), (linenr_T)end) == FAIL) { api_set_error(err, kErrorTypeException, "Failed to save undo information"); @@ -465,27 +463,21 @@ void nvim_buf_set_lines(uint64_t channel_id, // changed range, and move any in the remainder of the buffer. // Only adjust marks if we managed to switch to a window that holds // the buffer, otherwise line numbers will be invalid. - if (save_curbuf.br_buf == NULL) { - mark_adjust((linenr_T)start, - (linenr_T)(end - 1), - MAXLNUM, - (long)extra, - false); - } + mark_adjust((linenr_T)start, + (linenr_T)(end - 1), + MAXLNUM, + (long)extra, + false); changed_lines((linenr_T)start, 0, (linenr_T)end, (long)extra, true); - if (save_curbuf.br_buf == NULL) { - fix_cursor((linenr_T)start, (linenr_T)end, (linenr_T)extra); - } - end: for (size_t i = 0; i < new_len; i++) { xfree(lines[i]); } xfree(lines); - restore_win_for_buf(save_curwin, save_curtab, &save_curbuf); + aucmd_restbuf(&aco); try_end(err); } @@ -1109,28 +1101,6 @@ free_exit: return 0; } -// Check if deleting lines made the cursor position invalid. -// Changed the lines from "lo" to "hi" and added "extra" lines (negative if -// deleted). -static void fix_cursor(linenr_T lo, linenr_T hi, linenr_T extra) -{ - if (curwin->w_cursor.lnum >= lo) { - // Adjust the cursor position if it's in/after the changed - // lines. - if (curwin->w_cursor.lnum >= hi) { - curwin->w_cursor.lnum += extra; - check_cursor_col(); - } else if (extra < 0) { - curwin->w_cursor.lnum = lo; - check_cursor(); - } else { - check_cursor_col(); - } - changed_cline_bef_curs(); - } - invalidate_botline(); -} - // Normalizes 0-based indexes to buffer line numbers static int64_t normalize_index(buf_T *buf, int64_t index, bool *oob) { diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index 94d1697083..cb5ed5ecda 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -31,6 +31,7 @@ #include "nvim/edit.h" #include "nvim/eval.h" #include "nvim/eval/typval.h" +#include "nvim/fileio.h" #include "nvim/option.h" #include "nvim/state.h" #include "nvim/syntax.h" @@ -978,11 +979,12 @@ Buffer nvim_create_buf(Boolean listed, Boolean scratch, Error *err) return 0; } if (scratch) { - WITH_BUFFER(buf, { - set_option_value("bh", 0L, "hide", OPT_LOCAL); - set_option_value("bt", 0L, "nofile", OPT_LOCAL); - set_option_value("swf", 0L, NULL, OPT_LOCAL); - }); + aco_save_T aco; + aucmd_prepbuf(&aco, buf); + set_option_value("bh", 0L, "hide", OPT_LOCAL); + set_option_value("bt", 0L, "nofile", OPT_LOCAL); + set_option_value("swf", 0L, NULL, OPT_LOCAL); + aucmd_restbuf(&aco); } return buf->b_fnum; } diff --git a/src/nvim/buffer.h b/src/nvim/buffer.h index 79bed049ea..64c906fc96 100644 --- a/src/nvim/buffer.h +++ b/src/nvim/buffer.h @@ -63,35 +63,6 @@ enum bfa_values { # include "buffer.h.generated.h" #endif -// Find a window that contains "buf" and switch to it. -// If there is no such window, use the current window and change "curbuf". -// Caller must initialize save_curbuf to NULL. -// restore_win_for_buf() MUST be called later! -static inline void switch_to_win_for_buf(buf_T *buf, - win_T **save_curwinp, - tabpage_T **save_curtabp, - bufref_T *save_curbuf) -{ - win_T *wp; - tabpage_T *tp; - - if (!find_win_for_buf(buf, &wp, &tp) - || switch_win(save_curwinp, save_curtabp, wp, tp, true) == FAIL) { - switch_buffer(save_curbuf, buf); - } -} - -static inline void restore_win_for_buf(win_T *save_curwin, - tabpage_T *save_curtab, - bufref_T *save_curbuf) -{ - if (save_curbuf->br_buf == NULL) { - restore_win(save_curwin, save_curtab, true); - } else { - restore_buffer(save_curbuf); - } -} - static inline void buf_set_changedtick(buf_T *const buf, const varnumber_T changedtick) REAL_FATTR_NONNULL_ALL REAL_FATTR_ALWAYS_INLINE; @@ -145,15 +116,4 @@ static inline void buf_inc_changedtick(buf_T *const buf) buf_set_changedtick(buf, buf_get_changedtick(buf) + 1); } -#define WITH_BUFFER(b, code) \ - do { \ - win_T *save_curwin = NULL; \ - tabpage_T *save_curtab = NULL; \ - bufref_T save_curbuf = { NULL, 0, 0 }; \ - switch_to_win_for_buf(b, &save_curwin, &save_curtab, &save_curbuf); \ - code; \ - restore_win_for_buf(save_curwin, save_curtab, &save_curbuf); \ - } while (0) - - #endif // NVIM_BUFFER_H diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index 8b4ad4d3af..ffe650f416 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -1112,11 +1112,15 @@ static void refresh_terminal(Terminal *term) return; } long ml_before = buf->b_ml.ml_line_count; - WITH_BUFFER(buf, { - refresh_size(term, buf); - refresh_scrollback(term, buf); - refresh_screen(term, buf); - }); + + // refresh_ functions assume the terminal buffer is current + aco_save_T aco; + aucmd_prepbuf(&aco, buf); + refresh_size(term, buf); + refresh_scrollback(term, buf); + refresh_screen(term, buf); + aucmd_restbuf(&aco); + long ml_added = buf->b_ml.ml_line_count - ml_before; adjust_topline(term, buf, ml_added); } diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua index d9412f0f13..93599c04f1 100644 --- a/test/functional/api/buffer_spec.lua +++ b/test/functional/api/buffer_spec.lua @@ -1,7 +1,9 @@ local helpers = require('test.functional.helpers')(after_each) +local Screen = require('test.functional.ui.screen') local clear, nvim, buffer = helpers.clear, helpers.nvim, helpers.buffer local curbuf, curwin, eq = helpers.curbuf, helpers.curwin, helpers.eq local curbufmeths, ok = helpers.curbufmeths, helpers.ok +local meths = helpers.meths local funcs = helpers.funcs local request = helpers.request local exc_exec = helpers.exc_exec @@ -11,6 +13,7 @@ local NIL = helpers.NIL local meth_pcall = helpers.meth_pcall local command = helpers.command local bufmeths = helpers.bufmeths +local feed = helpers.feed describe('api/buf', function() before_each(clear) @@ -299,6 +302,38 @@ describe('api/buf', function() local retval = exc_exec("call nvim_buf_set_lines(1, 0, 1, v:false, ['test'])") eq(0, retval) end) + + it("set_lines of invisible buffer doesn't move cursor in current window", function() + local screen = Screen.new(20, 5) + screen:set_default_attr_ids({ + [1] = {bold = true, foreground = Screen.colors.Blue1}, + [2] = {bold = true}, + }) + screen:attach() + + insert([[ + Who would win? + A real window + with proper text]]) + local buf = meths.create_buf(false,true) + screen:expect([[ + Who would win? | + A real window | + with proper tex^t | + {1:~ }| + | + ]]) + + meths.buf_set_lines(buf, 0, -1, true, {'or some', 'scratchy text'}) + feed('i') -- provoke redraw + screen:expect([[ + Who would win? | + A real window | + with proper tex^t | + {1:~ }| + {2:-- INSERT --} | + ]]) + end) end) describe('get_offset', function() diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index b10076c6da..75b9fb71c9 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -1359,6 +1359,9 @@ describe('API', function() eq({id=1}, meths.get_current_buf()) local screen = Screen.new(20, 4) + screen:set_default_attr_ids({ + [1] = {bold = true, foreground = Screen.colors.Blue1}, + }) screen:attach() -- @@ -1373,7 +1376,7 @@ describe('API', function() end -- - -- Visiting a scratch-buffer DOES change its properties. + -- Visiting a scratch-buffer DOES NOT change its properties. -- meths.set_current_buf(edited_buf) screen:expect([[ @@ -1381,12 +1384,19 @@ describe('API', function() {1:~ }| {1:~ }| | - ]], { - [1] = {bold = true, foreground = Screen.colors.Blue1}, - }) - eq('', meths.buf_get_option(edited_buf, 'buftype')) - eq('', meths.buf_get_option(edited_buf, 'bufhidden')) + ]]) + eq('nofile', meths.buf_get_option(edited_buf, 'buftype')) + eq('hide', meths.buf_get_option(edited_buf, 'bufhidden')) eq(false, meths.buf_get_option(edited_buf, 'swapfile')) + + -- scratch buffer can be wiped without error + command('bwipe') + screen:expect([[ + ^ | + {1:~ }| + {1:~ }| + | + ]]) end) end) end) diff --git a/test/functional/ui/float_spec.lua b/test/functional/ui/float_spec.lua index 784c2d98f5..2ed3606491 100644 --- a/test/functional/ui/float_spec.lua +++ b/test/functional/ui/float_spec.lua @@ -504,7 +504,7 @@ describe('floating windows', function() local win = meths.open_win(buf, false, 15, 4, {relative='editor', row=2, col=10}) meths.win_set_option(win , 'winhl', 'Normal:PMenu') local expected_pos = { - [3]={{id=1001}, 'NW', 1, 2, 10, true}, + [4]={{id=1002}, 'NW', 1, 2, 10, true}, } if multigrid then screen:expect{grid=[[ @@ -523,7 +523,7 @@ describe('floating windows', function() {0:~ }| {0:~ }| {0:~ }| - ## grid 3 + ## grid 4 {1:such }| {1:very }| {1:float }| @@ -555,7 +555,7 @@ describe('floating windows', function() {0:~ }| {0:~ }| {0:~ }| - ## grid 3 + ## grid 4 {1:such }| {1:very }| {1:float }| @@ -583,7 +583,7 @@ describe('floating windows', function() ^ | {0:~ }| {0:~ }| - ## grid 3 + ## grid 4 {1:such }| {1:very }| {1:float }| @@ -608,7 +608,7 @@ describe('floating windows', function() ## grid 2 ^ | {0:~ }| - ## grid 3 + ## grid 4 {1:such }| {1:very }| {1:float }| @@ -631,7 +631,7 @@ describe('floating windows', function() ## grid 2 | {0:~ }| - ## grid 3 + ## grid 4 {1:such }| {1:very }| {1:^float }| @@ -663,7 +663,7 @@ describe('floating windows', function() {0:~ }| {0:~ }| {0:~ }| - ## grid 3 + ## grid 4 {1:such }| {1:very }| {1:^float }| @@ -700,7 +700,7 @@ describe('floating windows', function() {0:~ }| {0:~ }| {0:~ }| - ## grid 3 + ## grid 4 {1:^such }| {1:very }| {1:float }| @@ -735,7 +735,7 @@ describe('floating windows', function() {0:~ }| {0:~ }| {0:~ }| - ## grid 3 + ## grid 4 {1:^such }| {1:very }| {1:float }| @@ -770,7 +770,7 @@ describe('floating windows', function() {0:~ }| {0:~ }| {0:~ }| - ## grid 3 + ## grid 4 {1:^such }| {1:very }| {1:float }| @@ -805,7 +805,7 @@ describe('floating windows', function() {0:~ }| {0:~ }| {0:~ }| - ## grid 3 + ## grid 4 {1:^such }| {1:very }| {1:float }| @@ -840,7 +840,7 @@ describe('floating windows', function() {0:~ }| {0:~ }| {0:~ }| - ## grid 3 + ## grid 4 {1:^such }| {1:very }| {1:float }| @@ -875,7 +875,7 @@ describe('floating windows', function() {0:~ }| {0:~ }| {0:~ }| - ## grid 3 + ## grid 4 {1:^such }| {1:very }| {1:float }| @@ -910,7 +910,7 @@ describe('floating windows', function() {0:~ }| {0:~ }| {0:~ }| - ## grid 3 + ## grid 4 {1:^such }| {1:very }| {1:float }| @@ -945,7 +945,7 @@ describe('floating windows', function() {0:~ }| {0:~ }| {0:~ }| - ## grid 3 + ## grid 4 {1:^such }| {1:very }| {1:float }| @@ -971,7 +971,7 @@ describe('floating windows', function() | ## grid 2 | - ## grid 3 + ## grid 4 {1:^such }| {1:very }| {1:float }| @@ -1001,7 +1001,7 @@ describe('floating windows', function() {0:~ }| {0:~ }| {0:~ }| - ## grid 3 + ## grid 4 {1:^such }| {1:very }| {1:float }| |