vim-patch:8.2.4007: session does not restore help buffer properly

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 vim/vim#9475,
            closes vim/vim#9458, closes vim/vim#9472)
8e7d9db32b
This commit is contained in:
zeertzjq 2022-01-06 09:29:13 +08:00
parent e58071c92c
commit aa5adef969
2 changed files with 50 additions and 8 deletions

View File

@ -338,14 +338,26 @@ static int put_view(FILE *fd, win_T *wp, int add_edit, unsigned *flagp, int curr
// Edit the file. Skip this when ":next" already did it.
if (add_edit && (!did_next || wp->w_arg_idx_invalid)) {
char *fname_esc =
ses_escape_fname(ses_get_fname(wp->w_buffer, flagp), flagp);
//
// Load the file.
//
if (wp->w_buffer->b_ffname != NULL
&& (!bt_nofile(wp->w_buffer)
|| wp->w_buffer->terminal)) {
char *fname_esc = ses_escape_fname(ses_get_fname(wp->w_buffer, flagp), flagp);
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;
}
} else if (wp->w_buffer->b_ffname != NULL
&& (!bt_nofile(wp->w_buffer) || wp->w_buffer->terminal)) {
// Load the file.
// Editing a file in this buffer: use ":edit file".
// This may have side effects! (e.g., compressed or network file).
//

View File

@ -696,6 +696,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()
if !has('gui_running')