diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2019-06-03 14:36:21 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-03 14:36:21 +0200 |
commit | 4841c46e3384b09caaaded4936cde7be461d1b3c (patch) | |
tree | d9cf34d337b3aeaf179a502d9f952719ed61514a | |
parent | 3273e39db62987ae8bb0c617f70c15d3d7bbab68 (diff) | |
parent | 7ac3c311eebe56f0af8d8b4385fae7ab99c888ac (diff) | |
download | rneovim-4841c46e3384b09caaaded4936cde7be461d1b3c.tar.gz rneovim-4841c46e3384b09caaaded4936cde7be461d1b3c.tar.bz2 rneovim-4841c46e3384b09caaaded4936cde7be461d1b3c.zip |
Merge pull request #10112 from bfredl/noautobuf
api/buffer: avoid spurios Buf[Win]Enter in nvim_buf_set_lines
-rw-r--r-- | src/nvim/api/vim.c | 24 | ||||
-rw-r--r-- | test/functional/api/vim_spec.lua | 16 |
2 files changed, 33 insertions, 7 deletions
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index 9b5e0fc40b..2e8ca384b4 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -27,6 +27,7 @@ #include "nvim/types.h" #include "nvim/ex_docmd.h" #include "nvim/screen.h" +#include "nvim/memline.h" #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/edit.h" @@ -977,11 +978,20 @@ Buffer nvim_create_buf(Boolean listed, Boolean scratch, Error *err) BLN_NOOPT | BLN_NEW | (listed ? BLN_LISTED : 0)); try_end(err); if (buf == NULL) { - if (!ERROR_SET(err)) { - api_set_error(err, kErrorTypeException, "Failed to create buffer"); - } - return 0; + goto fail; } + + // Open the memline for the buffer. This will avoid spurious autocmds when + // a later nvim_buf_set_lines call would have needed to "open" the buffer. + try_start(); + block_autocmds(); + int status = ml_open(buf); + unblock_autocmds(); + try_end(err); + if (status == FAIL) { + goto fail; + } + if (scratch) { aco_save_T aco; aucmd_prepbuf(&aco, buf); @@ -991,6 +1001,12 @@ Buffer nvim_create_buf(Boolean listed, Boolean scratch, Error *err) aucmd_restbuf(&aco); } return buf->b_fnum; + +fail: + if (!ERROR_SET(err)) { + api_set_error(err, kErrorTypeException, "Failed to create buffer"); + } + return 0; } /// Open a new window. diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 69bd584ab4..4279a5d420 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -1336,7 +1336,7 @@ describe('API', function() eq({id=2}, meths.create_buf(true, false)) eq({id=3}, meths.create_buf(false, false)) eq(' 1 %a "[No Name]" line 1\n'.. - ' 2 "[No Name]" line 0', + ' 2 h "[No Name]" line 0', meths.command_output("ls")) -- current buffer didn't change eq({id=1}, meths.get_current_buf()) @@ -1367,14 +1367,24 @@ describe('API', function() eq({id=1}, meths.get_current_buf()) end) + it("doesn't cause BufEnter or BufWinEnter autocmds", function() + command("let g:fired = v:false") + command("au BufEnter,BufWinEnter * let g:fired = v:true") + + eq({id=2}, meths.create_buf(true, false)) + meths.buf_set_lines(2, 0, -1, true, {"test", "text"}) + + eq(false, eval('g:fired')) + end) + it('|scratch-buffer|', function() eq({id=2}, meths.create_buf(false, true)) eq({id=3}, meths.create_buf(true, true)) eq({id=4}, meths.create_buf(true, true)) local scratch_bufs = { 2, 3, 4 } eq(' 1 %a "[No Name]" line 1\n'.. - ' 3 "[Scratch]" line 0\n'.. - ' 4 "[Scratch]" line 0', + ' 3 h "[Scratch]" line 0\n'.. + ' 4 h "[Scratch]" line 0', meths.command_output("ls")) -- current buffer didn't change eq({id=1}, meths.get_current_buf()) |