Merge pull request #12841 from bfredl/buf_do

nvim_buf_call to call function in the context of another buffer
This commit is contained in:
Björn Linse 2020-09-13 12:04:38 +02:00 committed by GitHub
commit c7ef802206
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 63 additions and 0 deletions

View File

@ -1666,6 +1666,44 @@ Integer nvim_buf_set_virtual_text(Buffer buffer,
return src_id;
}
/// call a function with buffer as temporary current buffer
///
/// This temporarily switches current buffer to "buffer".
/// If the current window already shows "buffer", the window is not switched
/// If a window inside the current tabpage (including a float) already shows the
/// buffer One of these windows will be set as current window temporarily.
/// Otherwise a temporary scratch window (calleed the "autocmd window" for
/// historical reasons) will be used.
///
/// This is useful e.g. to call vimL functions that only work with the current
/// buffer/window currently, like |termopen()|.
///
/// @param buffer Buffer handle, or 0 for current buffer
/// @param fun Function to call inside the buffer (currently lua callable
/// only)
/// @param[out] err Error details, if any
/// @return Return value of function. NB: will deepcopy lua values
/// currently, use upvalues to send lua references in and out.
Object nvim_buf_call(Buffer buffer, LuaRef fun, Error *err)
FUNC_API_SINCE(7)
FUNC_API_LUA_ONLY
{
buf_T *buf = find_buffer_by_handle(buffer, err);
if (!buf) {
return NIL;
}
try_start();
aco_save_T aco;
aucmd_prepbuf(&aco, (buf_T *)buf);
Array args = ARRAY_DICT_INIT;
Object res = nlua_call_ref(fun, NULL, args, true, err);
aucmd_restbuf(&aco);
try_end(err);
return res;
}
Dictionary nvim__buf_stats(Buffer buffer, Error *err)
{
Dictionary rv = ARRAY_DICT_INIT;

View File

@ -1330,4 +1330,29 @@ describe('lua stdlib', function()
eq(false, pcall_result)
end)
end)
describe('vim.api.nvim_buf_call', function()
it('can access buf options', function()
local buf1 = meths.get_current_buf()
local buf2 = exec_lua [[
buf2 = vim.api.nvim_create_buf(false, true)
return buf2
]]
eq(false, meths.buf_get_option(buf1, 'autoindent'))
eq(false, meths.buf_get_option(buf2, 'autoindent'))
local val = exec_lua [[
return vim.api.nvim_buf_call(buf2, function()
vim.cmd "set autoindent"
return vim.api.nvim_get_current_buf()
end)
]]
eq(false, meths.buf_get_option(buf1, 'autoindent'))
eq(true, meths.buf_get_option(buf2, 'autoindent'))
eq(buf1, meths.get_current_buf())
eq(buf2, val)
end)
end)
end)