fix(mksession): don't store floats in session #18635

Problem:
If there are floating windows when `:mksession` runs, the session cannot
be properly restored.

Solution:
Change `:mksession` to skip floating windows. This matches Vim's
treatment of popup windows.

An alternative approach could have `:mksession` save floating windows
that can be _properly_ restored (rather than skip them entirely, which
is what this PR does). While that would seemingly be a more complete
fix, that could present additional issues since floating windows are
ordinarily created by plugins, and they may no longer be properly under
a plugin's control when restored.

closes #18432
This commit is contained in:
Daniel Steinberg 2022-05-22 12:03:56 -04:00 committed by GitHub
parent b863c150c9
commit 3fe6bf3a1e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 0 deletions

View File

@ -181,6 +181,10 @@ static bool ses_do_frame(const frame_T *fr)
/// @return non-zero if window "wp" is to be stored in the Session.
static int ses_do_win(win_T *wp)
{
// Skip floating windows to avoid issues when restoring the Session. #18432
if (wp->w_floating) {
return false;
}
if (wp->w_buffer->b_fname == NULL
// When 'buftype' is "nofile" can't restore the window contents.
|| (!wp->w_buffer->terminal && bt_nofile(wp->w_buffer))) {

View File

@ -13,6 +13,7 @@ local matches = helpers.matches
local pesc = helpers.pesc
local rmdir = helpers.rmdir
local sleep = helpers.sleep
local meths = helpers.meths
local file_prefix = 'Xtest-functional-ex_cmds-mksession_spec'
@ -166,4 +167,37 @@ describe(':mksession', function()
-- Verify that the terminal's working directory is "/".
screen:expect(expected_screen)
end)
it('restores a session when there is a float #18432', function()
local tmpfile = file_prefix .. '-tmpfile-float'
command('edit ' .. tmpfile)
local buf = meths.create_buf(false, true)
local config = {
relative = 'editor',
focusable = false,
width = 10,
height = 3,
row = 0,
col = 1,
style = 'minimal'
}
meths.open_win(buf, false, config)
local cmdheight = meths.get_option('cmdheight')
command('mksession ' .. session_file)
-- Create a new test instance of Nvim.
clear()
command('source ' .. session_file)
eq(tmpfile, funcs.expand('%'))
-- Check that there is only a single window, which indicates the floating
-- window was not restored.
eq(1, funcs.winnr('$'))
-- The command-line height should remain the same as it was.
eq(cmdheight, meths.get_option('cmdheight'))
os.remove(tmpfile)
end)
end)