diff options
-rw-r--r-- | src/nvim/api/window.c | 36 | ||||
-rw-r--r-- | test/functional/api/window_spec.lua | 18 |
2 files changed, 53 insertions, 1 deletions
diff --git a/src/nvim/api/window.c b/src/nvim/api/window.c index 5281a7c1f4..cf1d1f5e45 100644 --- a/src/nvim/api/window.c +++ b/src/nvim/api/window.c @@ -10,6 +10,7 @@ #include "nvim/api/private/defs.h" #include "nvim/api/private/helpers.h" #include "nvim/vim.h" +#include "nvim/buffer.h" #include "nvim/cursor.h" #include "nvim/window.h" #include "nvim/screen.h" @@ -33,6 +34,41 @@ Buffer nvim_win_get_buf(Window window, Error *err) return win->w_buffer->handle; } +/// Sets the current buffer in a window, without side-effects +/// +/// @param window Window handle +/// @param buffer Buffer handle +/// @param[out] err Error details, if any +void nvim_win_set_buf(Window window, Buffer buffer, Error *err) + FUNC_API_SINCE(5) +{ + win_T *win = find_window_by_handle(window, err), *save_curwin = curwin; + buf_T *buf = find_buffer_by_handle(buffer, err); + tabpage_T *tab = win_find_tabpage(win), *save_curtab = curtab; + + if (!win || !buf) { + return; + } + + if (switch_win(&save_curwin, &save_curtab, win, tab, false) == FAIL) { + api_set_error(err, + kErrorTypeException, + "Failed to switch to window %d", + window); + } + + try_start(); + int result = do_buffer(DOBUF_GOTO, DOBUF_FIRST, FORWARD, buf->b_fnum, 0); + if (!try_end(err) && result == FAIL) { + api_set_error(err, + kErrorTypeException, + "Failed to set buffer %d", + buffer); + } + + restore_win(save_curwin, save_curtab, false); +} + /// Gets the cursor position in the window /// /// @param window Window handle diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua index 27d7aa11b4..4496e1f644 100644 --- a/test/functional/api/window_spec.lua +++ b/test/functional/api/window_spec.lua @@ -11,6 +11,7 @@ local NIL = helpers.NIL local meth_pcall = helpers.meth_pcall local meths = helpers.meths local command = helpers.command +local expect_err = helpers.expect_err -- check if str is visible at the beginning of some line local function is_visible(str) @@ -31,7 +32,7 @@ local function is_visible(str) return false end -describe('api/win', function() +describe('API/win', function() before_each(clear) describe('get_buf', function() @@ -45,6 +46,21 @@ describe('api/win', function() end) end) + describe('set_buf', function() + it('works', function() + nvim('command', 'new') + local windows = nvim('list_wins') + neq(window('get_buf', windows[2]), window('get_buf', windows[1])) + window('set_buf', windows[2], window('get_buf', windows[1])) + eq(window('get_buf', windows[2]), window('get_buf', windows[1])) + end) + + it('validates args', function() + expect_err('Invalid buffer id$', window, 'set_buf', nvim('get_current_win'), 23) + expect_err('Invalid window id$', window, 'set_buf', 23, nvim('get_current_buf')) + end) + end) + describe('{get,set}_cursor', function() it('works', function() eq({1, 0}, curwin('get_cursor')) |