changeset 18979:de2d1820215a v8.2.0050

patch 8.2.0050: after deleting a file mark it is still in viminfo Commit: https://github.com/vim/vim/commit/8cd6cd8087ccf08e4303dbf5f732fc4b82b917e1 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Dec 27 17:33:26 2019 +0100 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)
author Bram Moolenaar <Bram@vim.org>
date Fri, 27 Dec 2019 17:45:04 +0100
parents 51c1bf5c3bb0
children 120c9621fd30
files src/mark.c src/testdir/test_marks.vim src/testdir/test_viminfo.vim src/version.c src/viminfo.c
diffstat 5 files changed, 27 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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
 		    }
 		}
--- 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
--- 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
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    50,
+/**/
     49,
 /**/
     48,
--- 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];