From e59215c7dcae17b03daf39517560cfaa03314f5a Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 14 Aug 2016 19:08:45 +0200 Subject: patch 7.4.2212 Problem: Mark " is not set when closing a window in another tab. (Guraga) Solution: Check all tabs for the window to be valid. (based on patch by Hirohito Higashi, closes #974) --- src/buffer.c | 4 ++-- src/proto/window.pro | 1 + src/testdir/test_viminfo.vim | 30 ++++++++++++++++++++++++++++++ src/version.c | 2 ++ src/window.c | 24 +++++++++++++++++++++++- 5 files changed, 58 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/buffer.c b/src/buffer.c index 2a09a6308b..4f68882558 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -475,7 +475,7 @@ close_buffer( if (win != NULL #ifdef FEAT_WINDOWS - && win_valid(win) /* in case autocommands closed the window */ + && win_valid_any_tab(win) /* in case autocommands closed the window */ #endif ) { @@ -581,7 +581,7 @@ aucmd_abort: if ( #ifdef FEAT_WINDOWS - win_valid(win) && + win_valid_any_tab(win) && #else win != NULL && #endif diff --git a/src/proto/window.pro b/src/proto/window.pro index ebd71ed951..d82988e30b 100644 --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -4,6 +4,7 @@ void get_wincmd_addr_type(char_u *arg, exarg_T *eap); int win_split(int size, int flags); int win_split_ins(int size, int flags, win_T *new_wp, int dir); int win_valid(win_T *win); +int win_valid_any_tab(win_T *win); int win_count(void); int make_windows(int count, int vertical); void win_move_after(win_T *win1, win_T *win2); diff --git a/src/testdir/test_viminfo.vim b/src/testdir/test_viminfo.vim index 4c4935b92e..cbe481c594 100644 --- a/src/testdir/test_viminfo.vim +++ b/src/testdir/test_viminfo.vim @@ -425,3 +425,33 @@ func Test_viminfo_file_marks() call delete('Xviminfo') endfunc + +func Test_viminfo_file_mark_tabclose() + tabnew Xtestfileintab + call setline(1, ['a','b','c','d','e']) + 4 + q! + wviminfo Xviminfo + sp Xviminfo + /^> .*Xtestfileintab + let lnum = line('.') + while 1 + if lnum == line('$') + call assert_false(1, 'mark not found in Xtestfileintab') + break + endif + let lnum += 1 + let line = getline(lnum) + if line == '' + call assert_false(1, 'mark not found in Xtestfileintab') + break + endif + if line =~ "^\t\"" + call assert_equal('4', substitute(line, ".*\"\t\\(\\d\\).*", '\1', '')) + break + endif + endwhile + + call delete('Xviminfo') + silent! bwipe Xtestfileintab +endfunc diff --git a/src/version.c b/src/version.c index 9be301f1d4..c2900c18d2 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2212, /**/ 2211, /**/ diff --git a/src/window.c b/src/window.c index c6409e1e03..b015d1d01f 100644 --- a/src/window.c +++ b/src/window.c @@ -1358,7 +1358,7 @@ win_init_some(win_T *newp, win_T *oldp) #if defined(FEAT_WINDOWS) || defined(PROTO) /* - * Check if "win" is a pointer to an existing window. + * Check if "win" is a pointer to an existing window in the current tab page. */ int win_valid(win_T *win) @@ -1373,6 +1373,28 @@ win_valid(win_T *win) return FALSE; } +/* + * Check if "win" is a pointer to an existing window in any tab page. + */ + int +win_valid_any_tab(win_T *win) +{ + win_T *wp; + tabpage_T *tp; + + if (win == NULL) + return FALSE; + FOR_ALL_TABPAGES(tp) + { + FOR_ALL_WINDOWS_IN_TAB(tp, wp) + { + if (wp == win) + return TRUE; + } + } + return FALSE; +} + /* * Return the number of windows. */ -- cgit v1.2.3