From 8cd6cd8087ccf08e4303dbf5f732fc4b82b917e1 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Fri, 27 Dec 2019 17:33:26 +0100 Subject: [PATCH] patch 8.2.0050: after deleting a file mark it is still in viminfo Problem: After deleting a file mark it is still in viminfo. Solution: When a file mark was deleted more recently than the mark in the merged viminfo file was updated, do not store the mark. (Pavol Juhas, closes #5401, closes #1339) --- src/mark.c | 3 ++- src/testdir/test_marks.vim | 5 +++++ src/testdir/test_viminfo.vim | 17 +++++++++++++++++ src/version.c | 2 ++ src/viminfo.c | 3 +-- 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/mark.c b/src/mark.c index ba24220ac..e1dbe3a74 100644 --- a/src/mark.c +++ b/src/mark.c @@ -854,9 +854,10 @@ ex_delmarks(exarg_T *eap) else n = i - 'A'; namedfm[n].fmark.mark.lnum = 0; + namedfm[n].fmark.fnum = 0; VIM_CLEAR(namedfm[n].fname); #ifdef FEAT_VIMINFO - namedfm[n].time_set = 0; + namedfm[n].time_set = digit ? 0 : vim_time(); #endif } } diff --git a/src/testdir/test_marks.vim b/src/testdir/test_marks.vim index 96a77667f..3d04c70aa 100644 --- a/src/testdir/test_marks.vim +++ b/src/testdir/test_marks.vim @@ -144,6 +144,11 @@ func Test_delmarks() " Deleting an already deleted mark should not fail. delmarks x + " getpos() should return all zeros after deleting a filemark. + norm mA + delmarks A + call assert_equal([0, 0, 0, 0], getpos("'A")) + " Test deleting a range of marks. norm ma norm mb diff --git a/src/testdir/test_viminfo.vim b/src/testdir/test_viminfo.vim index a9dc8fd31..78e0f1a81 100644 --- a/src/testdir/test_viminfo.vim +++ b/src/testdir/test_viminfo.vim @@ -323,6 +323,23 @@ func Test_viminfo_marks() call assert_equal([bufb, 22, 1, 0], getpos("'3")) " time 30 call assert_equal([bufb, 12, 1, 0], getpos("'4")) " time 25 + " deleted file marks are removed from viminfo + delmark C + wviminfo Xviminfo + rviminfo Xviminfo + call assert_equal([0, 0, 0, 0], getpos("'C")) + + " deleted file marks stay in viminfo if defined in another vim later + call test_settime(70) + call setpos("'D", [bufb, 8, 1, 0]) + wviminfo Xviminfo + call test_settime(65) + delmark D + call assert_equal([0, 0, 0, 0], getpos("'D")) + call test_settime(75) + rviminfo Xviminfo + call assert_equal([bufb, 8, 1, 0], getpos("'D")) + call delete('Xviminfo') exe 'bwipe ' . bufa exe 'bwipe ' . bufb diff --git a/src/version.c b/src/version.c index 85c8462df..568c15649 100644 --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 50, /**/ 49, /**/ diff --git a/src/viminfo.c b/src/viminfo.c index fd2be5f5c..308a9a609 100644 --- a/src/viminfo.c +++ b/src/viminfo.c @@ -2055,8 +2055,7 @@ write_viminfo_filemarks(FILE *fp) for (i = 0; i < NMARKS; i++) { if (vi_namedfm != NULL - && (vi_namedfm[i].time_set > namedfm_p[i].time_set - || namedfm_p[i].fmark.mark.lnum == 0)) + && (vi_namedfm[i].time_set > namedfm_p[i].time_set)) fm = &vi_namedfm[i]; else fm = &namedfm_p[i]; -- 2.40.0