diff options
author | matveyt <matthewtarasov@gmail.com> | 2022-01-05 14:01:30 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-01-05 14:01:30 +0000 |
commit | 8e7d9db32b53ca2b1cb7570d2042860bcd1e943f (patch) | |
tree | 551aa83a6dd768fcb79d40121eb3cf3f47d10493 | |
parent | c653e4a2bd4099e2fac8e1c448a0f34581d5a658 (diff) | |
download | vim-git-8e7d9db32b53ca2b1cb7570d2042860bcd1e943f.tar.gz |
patch 8.2.4007: session does not restore help buffer properlyv8.2.4007
Problem: Session does not restore help buffer properly when "options' is
missing from 'sessionoptions'.
Solution: Use a ":help" command to create the help window. (closes #9475,
closes #9458, closes #9472)
-rw-r--r-- | src/session.c | 22 | ||||
-rw-r--r-- | src/testdir/test_mksession.vim | 30 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 51 insertions, 3 deletions
diff --git a/src/session.c b/src/session.c index fdda5ee20..21af90245 100644 --- a/src/session.c +++ b/src/session.c @@ -348,16 +348,32 @@ put_view( // Edit the file. Skip this when ":next" already did it. if (add_edit && (!did_next || wp->w_arg_idx_invalid)) { + if (bt_help(wp->w_buffer)) + { + char *curtag = ""; + + // A help buffer needs some options to be set. + // First, create a new empty buffer with "buftype=help". + // Then ":help" will re-use both the buffer and the window and set + // the options, even when "options" is not in 'sessionoptions'. + if (0 < wp->w_tagstackidx + && wp->w_tagstackidx <= wp->w_tagstacklen) + curtag = (char *)wp->w_tagstack[wp->w_tagstackidx - 1].tagname; + + if (put_line(fd, "enew | setl bt=help") == FAIL + || fprintf(fd, "help %s", curtag) < 0 + || put_eol(fd) == FAIL) + return FAIL; + } # ifdef FEAT_TERMINAL - if (bt_terminal(wp->w_buffer)) + else if (bt_terminal(wp->w_buffer)) { if (term_write_session(fd, wp, terminal_bufs) == FAIL) return FAIL; } - else # endif // Load the file. - if (wp->w_buffer->b_ffname != NULL + else if (wp->w_buffer->b_ffname != NULL # ifdef FEAT_QUICKFIX && !bt_nofilename(wp->w_buffer) # endif diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim index a0a2cb461..301ff0514 100644 --- a/src/testdir/test_mksession.vim +++ b/src/testdir/test_mksession.vim @@ -909,6 +909,36 @@ func Test_mksession_foldopt() set sessionoptions& endfunc +" Test for mksession with "help" but not "options" in 'sessionoptions' +func Test_mksession_help_noopt() + set sessionoptions-=options + set sessionoptions+=help + help + let fname = expand('%') + mksession! Xtest_mks.out + bwipe + + source Xtest_mks.out + call assert_equal('help', &buftype) + call assert_equal('help', &filetype) + call assert_equal(fname, expand('%')) + call assert_false(&modifiable) + call assert_true(&readonly) + + helpclose + help index + let fname = expand('%') + mksession! Xtest_mks.out + bwipe + + source Xtest_mks.out + call assert_equal('help', &buftype) + call assert_equal(fname, expand('%')) + + call delete('Xtest_mks.out') + set sessionoptions& +endfunc + " Test for mksession with window position func Test_mksession_winpos() " Only applicable in GUI Vim diff --git a/src/version.c b/src/version.c index ad0d49e5d..c12bbead4 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4007, +/**/ 4006, /**/ 4005, |