summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/evalfunc.c5
-rw-r--r--src/mark.c25
-rw-r--r--src/proto/mark.pro2
-rw-r--r--src/version.c2
4 files changed, 24 insertions, 10 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 959be0cf8..7ea106bf6 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -4858,13 +4858,12 @@ f_getjumplist(typval_T *argvars, typval_T *rettv)
return;
list_append_number(rettv->vval.v_list, (varnumber_T)wp->w_jumplistidx);
- cleanup_jumplist(wp);
+ cleanup_jumplist(wp, TRUE);
+
for (i = 0; i < wp->w_jumplistlen; ++i)
{
if (wp->w_jumplist[i].fmark.mark.lnum == 0)
continue;
- if (wp->w_jumplist[i].fmark.fnum == 0)
- fname2fnum(&wp->w_jumplist[i]);
if ((d = dict_alloc()) == NULL)
return;
if (list_append_dict(l, d) == FAIL)
diff --git a/src/mark.c b/src/mark.c
index 9ebc9c24c..dd714d800 100644
--- a/src/mark.c
+++ b/src/mark.c
@@ -221,7 +221,7 @@ movemark(int count)
pos_T *pos;
xfmark_T *jmp;
- cleanup_jumplist(curwin);
+ cleanup_jumplist(curwin, TRUE);
if (curwin->w_jumplistlen == 0) /* nothing to jump to */
return (pos_T *)NULL;
@@ -891,7 +891,7 @@ ex_jumps(exarg_T *eap UNUSED)
int i;
char_u *name;
- cleanup_jumplist(curwin);
+ cleanup_jumplist(curwin, TRUE);
/* Highlight title */
MSG_PUTS_TITLE(_("\n jump line col file/text"));
@@ -899,8 +899,6 @@ ex_jumps(exarg_T *eap UNUSED)
{
if (curwin->w_jumplist[i].fmark.mark.lnum != 0)
{
- if (curwin->w_jumplist[i].fmark.fnum == 0)
- fname2fnum(&curwin->w_jumplist[i]);
name = fm_getname(&curwin->w_jumplist[i].fmark, 16);
if (name == NULL) /* file name not available */
continue;
@@ -1303,13 +1301,28 @@ mark_col_adjust(
/*
* When deleting lines, this may create duplicate marks in the
* jumplist. They will be removed here for the specified window.
+ * When "loadfiles" is TRUE first ensure entries have the "fnum" field set
+ * (this may be a bit slow).
*/
void
-cleanup_jumplist(win_T *wp)
+cleanup_jumplist(win_T *wp, int loadfiles)
{
int i;
int from, to;
+ if (loadfiles)
+ {
+ /* If specified, load all the files from the jump list. This is
+ * needed to properly clean up duplicate entries, but will take some
+ * time. */
+ for (i = 0; i < wp->w_jumplistlen; ++i)
+ {
+ if ((wp->w_jumplist[i].fmark.fnum == 0) &&
+ (wp->w_jumplist[i].fmark.mark.lnum != 0))
+ fname2fnum(&wp->w_jumplist[i]);
+ }
+ }
+
to = 0;
for (from = 0; from < wp->w_jumplistlen; ++from)
{
@@ -1738,7 +1751,7 @@ write_viminfo_filemarks(FILE *fp)
/* Write the jumplist with -' */
fputs(_("\n# Jumplist (newest first):\n"), fp);
setpcmark(); /* add current cursor position */
- cleanup_jumplist(curwin);
+ cleanup_jumplist(curwin, FALSE);
vi_idx = 0;
idx = curwin->w_jumplistlen - 1;
for (i = 0; i < JUMPLISTSIZE; ++i)
diff --git a/src/proto/mark.pro b/src/proto/mark.pro
index aa6f44efc..448b45273 100644
--- a/src/proto/mark.pro
+++ b/src/proto/mark.pro
@@ -24,7 +24,7 @@ void mark_adjust_nofold(linenr_T line1, linenr_T line2, long amount, long amount
void mark_col_adjust(linenr_T lnum, colnr_T mincol, long lnum_amount, long col_amount);
void copy_jumplist(win_T *from, win_T *to);
void free_jumplist(win_T *wp);
-void cleanup_jumplist(win_T *wp);
+void cleanup_jumplist(win_T *wp, int loadfiles);
void set_last_cursor(win_T *win);
void free_all_marks(void);
int read_viminfo_filemark(vir_T *virp, int force);
diff --git a/src/version.c b/src/version.c
index 965df225a..e4f6f968c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1513,
+/**/
1512,
/**/
1511,