summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-12-27 17:33:26 +0100
committerBram Moolenaar <Bram@vim.org>2019-12-27 17:33:26 +0100
commit8cd6cd8087ccf08e4303dbf5f732fc4b82b917e1 (patch)
tree3db4f208a27870f88bc8bfe4a290caa2b33062bb
parent297610ba4b110c918ffe60c45eb4a1d6ea2daae5 (diff)
downloadvim-git-8cd6cd8087ccf08e4303dbf5f732fc4b82b917e1.tar.gz
patch 8.2.0050: after deleting a file mark it is still in viminfov8.2.0050
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)
-rw-r--r--src/mark.c3
-rw-r--r--src/testdir/test_marks.vim5
-rw-r--r--src/testdir/test_viminfo.vim17
-rw-r--r--src/version.c2
-rw-r--r--src/viminfo.c3
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
@@ -743,6 +743,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 50,
+/**/
49,
/**/
48,
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];