# HG changeset patch # User Christian Brabandt # Date 1471194905 -7200 # Node ID 42adbf172ecdb24b8fe3388039e7a0fba1ab4eb8 # Parent f49646062d35a7c409c73625d1d4cb5be5665755 commit https://github.com/vim/vim/commit/e59215c7dcae17b03daf39517560cfaa03314f5a Author: Bram Moolenaar Date: Sun Aug 14 19:08:45 2016 +0200 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 https://github.com/vim/vim/issues/974) diff --git a/src/buffer.c b/src/buffer.c --- 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 --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -4,6 +4,7 @@ void get_wincmd_addr_type(char_u *arg, e 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 --- 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 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2212, +/**/ 2211, /**/ 2210, diff --git a/src/window.c b/src/window.c --- 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) @@ -1374,6 +1374,28 @@ win_valid(win_T *win) } /* + * 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. */ int