From 3fe6bf3a1e50299dbdd6314afbb18e468eb7ce08 Mon Sep 17 00:00:00 2001 From: Daniel Steinberg Date: Sun, 22 May 2022 12:03:56 -0400 Subject: [PATCH] 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 --- src/nvim/ex_session.c | 4 +++ test/functional/ex_cmds/mksession_spec.lua | 34 ++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/nvim/ex_session.c b/src/nvim/ex_session.c index dfdb8c1eac..3b6f7b90bf 100644 --- a/src/nvim/ex_session.c +++ b/src/nvim/ex_session.c @@ -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))) { diff --git a/test/functional/ex_cmds/mksession_spec.lua b/test/functional/ex_cmds/mksession_spec.lua index c1b4777d16..8323d40e10 100644 --- a/test/functional/ex_cmds/mksession_spec.lua +++ b/test/functional/ex_cmds/mksession_spec.lua @@ -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)