aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2020-12-29 23:15:10 -0500
committerGitHub <noreply@github.com>2020-12-29 23:15:10 -0500
commit69fc6c2de011e6da556fedd3a058fecf47883b8e (patch)
tree9006ba0046c9b5f283ef28d190837d137cc3f312
parentc762f5220b02036e4eb9097a1d2a9fded6375fa0 (diff)
parentd2837d5efce31c52f9c90344560a7fcc446ccee8 (diff)
downloadrneovim-69fc6c2de011e6da556fedd3a058fecf47883b8e.tar.gz
rneovim-69fc6c2de011e6da556fedd3a058fecf47883b8e.tar.bz2
rneovim-69fc6c2de011e6da556fedd3a058fecf47883b8e.zip
Merge pull request #13552 from janlazo/vim-8.1.0149
vim-patch:8.1.{149,151,790,2100}
-rw-r--r--src/nvim/ex_docmd.c6
-rw-r--r--src/nvim/ex_session.c34
-rw-r--r--src/nvim/testdir/test_mksession.vim169
3 files changed, 194 insertions, 15 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index 3fc02e0693..35b0755bd8 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -4769,10 +4769,8 @@ static void ex_abclear(exarg_T *eap)
static void ex_autocmd(exarg_T *eap)
{
- /*
- * Disallow auto commands from .exrc and .vimrc in current
- * directory for security reasons.
- */
+ // Disallow autocommands from .exrc and .vimrc in current
+ // directory for security reasons.
if (secure) {
secure = 2;
eap->errmsg = e_curdir;
diff --git a/src/nvim/ex_session.c b/src/nvim/ex_session.c
index d831ffc050..14dac9a126 100644
--- a/src/nvim/ex_session.c
+++ b/src/nvim/ex_session.c
@@ -526,8 +526,12 @@ static int makeopens(FILE *fd, char_u *dirnow)
}
}
- // Close all windows but one.
+ // Close all windows and tabs but one.
PUTLINE_FAIL("silent only");
+ if ((ssop_flags & SSOP_TABPAGES)
+ && put_line(fd, "silent tabonly") == FAIL) {
+ return FAIL;
+ }
//
// Now a :cd command to the session directory or the current directory
@@ -606,13 +610,26 @@ static int makeopens(FILE *fd, char_u *dirnow)
//
tab_firstwin = firstwin; // First window in tab page "tabnr".
tab_topframe = topframe;
+ if ((ssop_flags & SSOP_TABPAGES)) {
+ // Similar to ses_win_rec() below, populate the tab pages first so
+ // later local options won't be copied to the new tabs.
+ FOR_ALL_TABS(tp) {
+ if (tp->tp_next != NULL && put_line(fd, "tabnew") == FAIL) {
+ return FAIL;
+ }
+ }
+
+ if (first_tabpage->tp_next != NULL && put_line(fd, "tabrewind") == FAIL) {
+ return FAIL;
+ }
+ }
for (tabnr = 1;; tabnr++) {
tabpage_T *tp = find_tabpage(tabnr);
if (tp == NULL) {
break; // done all tab pages
}
- int need_tabnew = false;
+ bool need_tabnext = false;
int cnr = 1;
if ((ssop_flags & SSOP_TABPAGES)) {
@@ -624,7 +641,7 @@ static int makeopens(FILE *fd, char_u *dirnow)
tab_topframe = tp->tp_topframe;
}
if (tabnr > 1) {
- need_tabnew = true;
+ need_tabnext = true;
}
}
@@ -639,11 +656,15 @@ static int makeopens(FILE *fd, char_u *dirnow)
&& !bt_help(wp->w_buffer)
&& !bt_nofile(wp->w_buffer)
) {
- if (fputs(need_tabnew ? "tabedit " : "edit ", fd) < 0
+ if (need_tabnext && put_line(fd, "tabnext") == FAIL) {
+ return FAIL;
+ }
+ need_tabnext = false;
+
+ if (fputs("edit ", fd) < 0
|| ses_fname(fd, wp->w_buffer, &ssop_flags, true) == FAIL) {
return FAIL;
}
- need_tabnew = false;
if (!wp->w_arg_idx_invalid) {
edited_win = wp;
}
@@ -652,7 +673,7 @@ static int makeopens(FILE *fd, char_u *dirnow)
}
// If no file got edited create an empty tab page.
- if (need_tabnew && put_line(fd, "tabnew") == FAIL) {
+ if (need_tabnext && put_line(fd, "tabnext") == FAIL) {
return FAIL;
}
@@ -775,6 +796,7 @@ static int makeopens(FILE *fd, char_u *dirnow)
//
if (fprintf(fd, "%s",
"if exists('s:wipebuf') "
+ "&& len(win_findbuf(s:wipebuf)) == 0"
"&& getbufvar(s:wipebuf, '&buftype') isnot# 'terminal'\n"
" silent exe 'bwipe ' . s:wipebuf\n"
"endif\n"
diff --git a/src/nvim/testdir/test_mksession.vim b/src/nvim/testdir/test_mksession.vim
index 8ef8bbc23a..f71da92bf8 100644
--- a/src/nvim/testdir/test_mksession.vim
+++ b/src/nvim/testdir/test_mksession.vim
@@ -178,15 +178,20 @@ func Test_mksession_rtp()
set sessionoptions&
endfunc
-" Verify that arglist is stored correctly to the session file.
func Test_mksession_arglist()
%argdel
next file1 file2 file3 file4
+ new
+ next | next
mksession! Xtest_mks.out
source Xtest_mks.out
call assert_equal(['file1', 'file2', 'file3', 'file4'], argv())
+ call assert_equal(2, argidx())
+ wincmd w
+ call assert_equal(0, argidx())
call delete('Xtest_mks.out')
+ enew | only
argdel *
endfunc
@@ -220,6 +225,53 @@ func Test_mksession_one_buffer_two_windows()
call delete('Xtest_mks.out')
endfunc
+func Test_mksession_lcd_multiple_tabs()
+ tabnew
+ tabnew
+ lcd .
+ tabfirst
+ lcd .
+ mksession! Xtest_mks.out
+ tabonly
+ source Xtest_mks.out
+ call assert_true(haslocaldir(), 'Tab 1 localdir')
+ tabnext 2
+ call assert_true(!haslocaldir(), 'Tab 2 localdir')
+ tabnext 3
+ call assert_true(haslocaldir(), 'Tab 3 localdir')
+ call delete('Xtest_mks.out')
+endfunc
+
+func Test_mksession_blank_tabs()
+ tabnew
+ tabnew
+ tabnew
+ tabnext 3
+ mksession! Xtest_mks.out
+ tabnew
+ tabnew
+ tabnext 2
+ source Xtest_mks.out
+ call assert_equal(4, tabpagenr('$'), 'session restore should restore number of tabs')
+ call assert_equal(3, tabpagenr(), 'session restore should restore the active tab')
+ call delete('Xtest_mks.out')
+endfunc
+
+func Test_mksession_blank_windows()
+ split
+ split
+ split
+ 3 wincmd w
+ mksession! Xtest_mks.out
+ split
+ split
+ 2 wincmd w
+ source Xtest_mks.out
+ call assert_equal(4, winnr('$'), 'session restore should restore number of windows')
+ call assert_equal(3, winnr(), 'session restore should restore the active window')
+ call delete('Xtest_mks.out')
+endfunc
+
if has('extra_search')
func Test_mksession_hlsearch()
@@ -356,24 +408,28 @@ func Test_mksession_globals()
set sessionoptions+=globals
" create different global variables
- let g:Global_string = "Sun is shining"
+ let g:Global_string = "Sun is shining\r\n"
let g:Global_count = 100
let g:Global_pi = 3.14
+ let g:Global_neg_float = -2.68
mksession! Xtest_mks.out
unlet g:Global_string
unlet g:Global_count
unlet g:Global_pi
+ unlet g:Global_neg_float
source Xtest_mks.out
- call assert_equal("Sun is shining", g:Global_string)
+ call assert_equal("Sun is shining\r\n", g:Global_string)
call assert_equal(100, g:Global_count)
call assert_equal(3.14, g:Global_pi)
+ call assert_equal(-2.68, g:Global_neg_float)
unlet g:Global_string
unlet g:Global_count
unlet g:Global_pi
+ unlet g:Global_neg_float
call delete('Xtest_mks.out')
set sessionoptions&
endfunc
@@ -432,20 +488,123 @@ func Test_mksession_resize()
for line in lines
if line =~ '^set lines='
let found_resize = v:true
+ break
endif
endfor
- call assert_equal(v:false, found_resize)
+ call assert_false(found_resize)
let lines = readfile('Xtest_mks2.out')
let found_resize = v:false
for line in lines
if line =~ '^set lines='
let found_resize = v:true
+ break
+ endif
+ endfor
+ call assert_true(found_resize)
+
+ call delete('Xtest_mks1.out')
+ call delete('Xtest_mks2.out')
+ set sessionoptions&
+endfunc
+
+" Test for mksession with a named scratch buffer
+func Test_mksession_scratch()
+ set sessionoptions&vi
+ enew | only
+ file Xscratch
+ set buftype=nofile
+ mksession! Xtest_mks.out
+ %bwipe
+ source Xtest_mks.out
+ call assert_equal('Xscratch', bufname(''))
+ call assert_equal('nofile', &buftype)
+ %bwipe
+ call delete('Xtest_mks.out')
+ set sessionoptions&
+endfunc
+
+" Test for mksession with fold options
+func Test_mksession_foldopt()
+ set sessionoptions-=options
+ set sessionoptions+=folds
+ new
+ setlocal foldenable
+ setlocal foldmethod=expr
+ setlocal foldmarker=<<<,>>>
+ setlocal foldignore=%
+ setlocal foldlevel=2
+ setlocal foldminlines=10
+ setlocal foldnestmax=15
+ mksession! Xtest_mks.out
+ close
+ %bwipe
+
+ source Xtest_mks.out
+ call assert_true(&foldenable)
+ call assert_equal('expr', &foldmethod)
+ call assert_equal('<<<,>>>', &foldmarker)
+ call assert_equal('%', &foldignore)
+ call assert_equal(2, &foldlevel)
+ call assert_equal(10, &foldminlines)
+ call assert_equal(15, &foldnestmax)
+
+ close
+ %bwipe
+ set sessionoptions&
+endfunc
+
+" Test for mksession with window position
+func Test_mksession_winpos()
+ if !has('gui_running')
+ " Only applicable in GUI Vim
+ return
+ endif
+ set sessionoptions+=winpos
+ mksession! Xtest_mks.out
+ let found_winpos = v:false
+ let lines = readfile('Xtest_mks.out')
+ for line in lines
+ if line =~ '^winpos '
+ let found_winpos = v:true
+ break
+ endif
+ endfor
+ call assert_true(found_winpos)
+ call delete('Xtest_mks.out')
+ set sessionoptions&
+endfunc
+
+" Test for mksession with 'compatible' option
+func Test_mksession_compatible()
+ throw 'skipped: Nvim does not support "compatible" option'
+ mksession! Xtest_mks1.out
+ set compatible
+ mksession! Xtest_mks2.out
+ set nocp
+
+ let test_success = v:false
+ let lines = readfile('Xtest_mks1.out')
+ for line in lines
+ if line =~ '^if &cp | set nocp | endif'
+ let test_success = v:true
+ break
+ endif
+ endfor
+ call assert_true(test_success)
+
+ let test_success = v:false
+ let lines = readfile('Xtest_mks2.out')
+ for line in lines
+ if line =~ '^if !&cp | set cp | endif'
+ let test_success = v:true
+ break
endif
endfor
- call assert_equal(v:true, found_resize)
+ call assert_true(test_success)
call delete('Xtest_mks1.out')
call delete('Xtest_mks2.out')
+ set compatible&
set sessionoptions&
endfunc