aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2018-11-25 16:27:10 +0100
committerJustin M. Keyes <justinkz@gmail.com>2018-11-25 16:27:10 +0100
commitb1aaa0a881ef36676ddd71e7308ae7461c62896d (patch)
tree5145d257239634b021cbaad676e29ef6ff43e4cb
parentbac9f36d42970e7ec03bfa204481ec41bca4039b (diff)
downloadrneovim-b1aaa0a881ef36676ddd71e7308ae7461c62896d.tar.gz
rneovim-b1aaa0a881ef36676ddd71e7308ae7461c62896d.tar.bz2
rneovim-b1aaa0a881ef36676ddd71e7308ae7461c62896d.zip
API: Implement nvim_win_set_buf() #9100
closes #9100
-rw-r--r--src/nvim/api/window.c36
-rw-r--r--test/functional/api/window_spec.lua18
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'))