summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormatveyt <matthewtarasov@gmail.com>2022-01-05 14:01:30 +0000
committerBram Moolenaar <Bram@vim.org>2022-01-05 14:01:30 +0000
commit8e7d9db32b53ca2b1cb7570d2042860bcd1e943f (patch)
tree551aa83a6dd768fcb79d40121eb3cf3f47d10493
parentc653e4a2bd4099e2fac8e1c448a0f34581d5a658 (diff)
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.c22
-rw-r--r--src/testdir/test_mksession.vim30
-rw-r--r--src/version.c2
3 files changed, 51 insertions, 3 deletions
diff --git a/src/session.c b/src/session.c
index fdda5ee20e..21af902459 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 a0a2cb461e..301ff0514e 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 ad0d49e5d6..c12bbead44 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,