mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 8.0.1024: folds lost when session file has a buffer in two windows
Problem: Manual folds are lost when a session file has the same buffer in two windows. (Jeansen) Solution: Use ":edit" only once. (Christian Brabandt, closes #1958)
This commit is contained in:
parent
a539f4f1ae
commit
4bebc9a056
@ -11099,7 +11099,7 @@ static int ses_do_frame(frame_T *fr);
|
|||||||
static int ses_do_win(win_T *wp);
|
static int ses_do_win(win_T *wp);
|
||||||
static int ses_arglist(FILE *fd, char *cmd, garray_T *gap, int fullname, unsigned *flagp);
|
static int ses_arglist(FILE *fd, char *cmd, garray_T *gap, int fullname, unsigned *flagp);
|
||||||
static int ses_put_fname(FILE *fd, char_u *name, unsigned *flagp);
|
static int ses_put_fname(FILE *fd, char_u *name, unsigned *flagp);
|
||||||
static int ses_fname(FILE *fd, buf_T *buf, unsigned *flagp);
|
static int ses_fname(FILE *fd, buf_T *buf, unsigned *flagp, int add_eol);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write openfile commands for the current buffers to an .exrc file.
|
* Write openfile commands for the current buffers to an .exrc file.
|
||||||
@ -11195,7 +11195,7 @@ makeopens(
|
|||||||
{
|
{
|
||||||
if (fprintf(fd, "badd +%ld ", buf->b_wininfo == NULL ? 1L
|
if (fprintf(fd, "badd +%ld ", buf->b_wininfo == NULL ? 1L
|
||||||
: buf->b_wininfo->wi_fpos.lnum) < 0
|
: buf->b_wininfo->wi_fpos.lnum) < 0
|
||||||
|| ses_fname(fd, buf, &ssop_flags) == FAIL)
|
|| ses_fname(fd, buf, &ssop_flags, TRUE) == FAIL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -11289,7 +11289,8 @@ makeopens(
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (fputs(need_tabnew ? "tabedit " : "edit ", fd) < 0
|
if (fputs(need_tabnew ? "tabedit " : "edit ", fd) < 0
|
||||||
|| ses_fname(fd, wp->w_buffer, &ssop_flags) == FAIL)
|
|| ses_fname(fd, wp->w_buffer, &ssop_flags, TRUE)
|
||||||
|
== FAIL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
need_tabnew = FALSE;
|
need_tabnew = FALSE;
|
||||||
if (!wp->w_arg_idx_invalid)
|
if (!wp->w_arg_idx_invalid)
|
||||||
@ -11636,9 +11637,20 @@ put_view(
|
|||||||
/*
|
/*
|
||||||
* Editing a file in this buffer: use ":edit file".
|
* Editing a file in this buffer: use ":edit file".
|
||||||
* This may have side effects! (e.g., compressed or network file).
|
* This may have side effects! (e.g., compressed or network file).
|
||||||
|
*
|
||||||
|
* Note, if a buffer for that file already exists, use :badd to
|
||||||
|
* edit that buffer, to not lose folding information (:edit resets
|
||||||
|
* folds in other buffers)
|
||||||
*/
|
*/
|
||||||
if (fputs("edit ", fd) < 0
|
if (fputs("if bufexists('", fd) < 0
|
||||||
|| ses_fname(fd, wp->w_buffer, flagp) == FAIL)
|
|| ses_fname(fd, wp->w_buffer, flagp, FALSE) == FAIL
|
||||||
|
|| fputs("') | buffer ", fd) < 0
|
||||||
|
|| ses_fname(fd, wp->w_buffer, flagp, FALSE) == FAIL
|
||||||
|
|| fputs(" | else | edit ", fd) < 0
|
||||||
|
|| ses_fname(fd, wp->w_buffer, flagp, FALSE) == FAIL
|
||||||
|
|| fputs(" | endif", fd) < 0
|
||||||
|
||
|
||||||
|
put_eol(fd) == FAIL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -11651,7 +11663,7 @@ put_view(
|
|||||||
{
|
{
|
||||||
/* The buffer does have a name, but it's not a file name. */
|
/* The buffer does have a name, but it's not a file name. */
|
||||||
if (fputs("file ", fd) < 0
|
if (fputs("file ", fd) < 0
|
||||||
|| ses_fname(fd, wp->w_buffer, flagp) == FAIL)
|
|| ses_fname(fd, wp->w_buffer, flagp, TRUE) == FAIL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -11823,11 +11835,11 @@ ses_arglist(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Write a buffer name to the session file.
|
* Write a buffer name to the session file.
|
||||||
* Also ends the line.
|
* Also ends the line, if "add_eol" is TRUE.
|
||||||
* Returns FAIL if writing fails.
|
* Returns FAIL if writing fails.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
ses_fname(FILE *fd, buf_T *buf, unsigned *flagp)
|
ses_fname(FILE *fd, buf_T *buf, unsigned *flagp, int add_eol)
|
||||||
{
|
{
|
||||||
char_u *name;
|
char_u *name;
|
||||||
|
|
||||||
@ -11846,7 +11858,8 @@ ses_fname(FILE *fd, buf_T *buf, unsigned *flagp)
|
|||||||
name = buf->b_sfname;
|
name = buf->b_sfname;
|
||||||
else
|
else
|
||||||
name = buf->b_ffname;
|
name = buf->b_ffname;
|
||||||
if (ses_put_fname(fd, name, flagp) == FAIL || put_eol(fd) == FAIL)
|
if (ses_put_fname(fd, name, flagp) == FAIL
|
||||||
|
|| (add_eol && put_eol(fd) == FAIL))
|
||||||
return FAIL;
|
return FAIL;
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
@ -121,5 +121,36 @@ func Test_mksession_arglist()
|
|||||||
argdel *
|
argdel *
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_mksession_one_buffer_two_windows()
|
||||||
|
edit Xtest1
|
||||||
|
new Xtest2
|
||||||
|
split
|
||||||
|
mksession! Xtest_mks.out
|
||||||
|
let lines = readfile('Xtest_mks.out')
|
||||||
|
let count1 = 0
|
||||||
|
let count2 = 0
|
||||||
|
let count2buf = 0
|
||||||
|
for line in lines
|
||||||
|
if line =~ 'edit \f*Xtest1$'
|
||||||
|
let count1 += 1
|
||||||
|
endif
|
||||||
|
if line =~ 'edit \f\{-}Xtest2'
|
||||||
|
let count2 += 1
|
||||||
|
endif
|
||||||
|
if line =~ 'buffer \f\{-}Xtest2'
|
||||||
|
let count2buf += 1
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
call assert_equal(1, count1, 'Xtest1 count')
|
||||||
|
call assert_equal(2, count2, 'Xtest2 count')
|
||||||
|
call assert_equal(2, count2buf, 'Xtest2 buffer count')
|
||||||
|
|
||||||
|
close
|
||||||
|
bwipe!
|
||||||
|
!cp Xtest_mks.out /tmp
|
||||||
|
call delete('Xtest_mks.out')
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@ -769,6 +769,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1024,
|
||||||
/**/
|
/**/
|
||||||
1023,
|
1023,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user