mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
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:
commit
c7ef802206
@ -1666,6 +1666,44 @@ Integer nvim_buf_set_virtual_text(Buffer buffer,
|
|||||||
return src_id;
|
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 nvim__buf_stats(Buffer buffer, Error *err)
|
||||||
{
|
{
|
||||||
Dictionary rv = ARRAY_DICT_INIT;
|
Dictionary rv = ARRAY_DICT_INIT;
|
||||||
|
@ -1330,4 +1330,29 @@ describe('lua stdlib', function()
|
|||||||
eq(false, pcall_result)
|
eq(false, pcall_result)
|
||||||
end)
|
end)
|
||||||
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)
|
end)
|
||||||
|
Loading…
Reference in New Issue
Block a user