mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
api: add nvim_win_close() to close window by id
This commit is contained in:
parent
7a6da502b9
commit
c8f310825c
@ -9,6 +9,7 @@
|
||||
#include "nvim/api/window.h"
|
||||
#include "nvim/api/private/defs.h"
|
||||
#include "nvim/api/private/helpers.h"
|
||||
#include "nvim/ex_docmd.h"
|
||||
#include "nvim/vim.h"
|
||||
#include "nvim/buffer.h"
|
||||
#include "nvim/cursor.h"
|
||||
@ -470,3 +471,29 @@ void nvim_win_config(Window window, Integer width, Integer height,
|
||||
win->w_pos_changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
/// Close a window.
|
||||
///
|
||||
/// This is equivalent to |:close| with count except that it takes a window id.
|
||||
///
|
||||
/// @param window Window handle
|
||||
/// @param force Behave like `:close!` The last window of a buffer with
|
||||
/// unwritten changes can be closed. The buffer will become
|
||||
/// hidden, even if 'hidden' is not set.
|
||||
///
|
||||
/// @param[out] err Error details, if any
|
||||
/// @return Window number
|
||||
void nvim_win_close(Window window, Boolean force, Error *err)
|
||||
FUNC_API_SINCE(6)
|
||||
{
|
||||
win_T *win = find_window_by_handle(window, err);
|
||||
if (!win) {
|
||||
return;
|
||||
}
|
||||
tabpage_T *tabpage = win_find_tabpage(win);
|
||||
|
||||
TryState tstate;
|
||||
try_enter(&tstate);
|
||||
ex_win_close(force, win, tabpage == curtab ? NULL : tabpage);
|
||||
vim_ignored = try_leave(&tstate, err);
|
||||
}
|
||||
|
@ -6170,7 +6170,7 @@ static void ex_pclose(exarg_T *eap)
|
||||
* Close window "win" and take care of handling closing the last window for a
|
||||
* modified buffer.
|
||||
*/
|
||||
static void
|
||||
void
|
||||
ex_win_close(
|
||||
int forceit,
|
||||
win_T *win,
|
||||
|
@ -286,4 +286,41 @@ describe('API/win', function()
|
||||
ok(not window('is_valid', win))
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('close', function()
|
||||
it('can close current window', function()
|
||||
local oldwin = meths.get_current_win()
|
||||
command('split')
|
||||
local newwin = meths.get_current_win()
|
||||
meths.win_close(newwin,false)
|
||||
eq({oldwin}, meths.list_wins())
|
||||
end)
|
||||
|
||||
it('can close noncurrent window', function()
|
||||
local oldwin = meths.get_current_win()
|
||||
command('split')
|
||||
local newwin = meths.get_current_win()
|
||||
meths.win_close(oldwin,false)
|
||||
eq({newwin}, meths.list_wins())
|
||||
end)
|
||||
|
||||
it('handles changed buffer', function()
|
||||
local oldwin = meths.get_current_win()
|
||||
insert('text')
|
||||
command('new')
|
||||
local newwin = meths.get_current_win()
|
||||
eq({false,"Vim:E37: No write since last change (add ! to override)"},
|
||||
meth_pcall(meths.win_close, oldwin,false))
|
||||
eq({newwin,oldwin}, meths.list_wins())
|
||||
end)
|
||||
|
||||
it('handles changed buffer with force', function()
|
||||
local oldwin = meths.get_current_win()
|
||||
insert('text')
|
||||
command('new')
|
||||
local newwin = meths.get_current_win()
|
||||
meths.win_close(oldwin,true)
|
||||
eq({newwin}, meths.list_wins())
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
|
@ -118,6 +118,37 @@ describe('floating windows', function()
|
||||
|
|
||||
]])
|
||||
end
|
||||
|
||||
meths.win_close(win, false)
|
||||
if multigrid then
|
||||
screen:expect([[
|
||||
## grid 1
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
[2:----------------------------------------]|
|
||||
|
|
||||
## grid 2
|
||||
^ |
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
]])
|
||||
else
|
||||
screen:expect([[
|
||||
^ |
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
{0:~ }|
|
||||
|
|
||||
]])
|
||||
end
|
||||
end)
|
||||
|
||||
it('API has proper error messages', function()
|
||||
|
Loading…
Reference in New Issue
Block a user