mirror of
https://github.com/neovim/neovim.git
synced 2025-09-15 07:48:18 +00:00
vim-patch:8.0.1498: getjumplist() returns duplicate entries
Problem: Getjumplist() returns duplicate entries. (lacygoill)
Solution: Call cleanup_jumplist(). (Yegappan Lakshmanan)
a7e18d237f
This commit is contained in:
@@ -214,7 +214,7 @@ pos_T *movemark(int count)
|
||||
pos_T *pos;
|
||||
xfmark_T *jmp;
|
||||
|
||||
cleanup_jumplist();
|
||||
cleanup_jumplist(curwin);
|
||||
|
||||
if (curwin->w_jumplistlen == 0) /* nothing to jump to */
|
||||
return (pos_T *)NULL;
|
||||
@@ -463,7 +463,7 @@ getnextmark (
|
||||
* This is used for marks obtained from the .shada file. It's postponed
|
||||
* until the mark is used to avoid a long startup delay.
|
||||
*/
|
||||
static void fname2fnum(xfmark_T *fm)
|
||||
void fname2fnum(xfmark_T *fm)
|
||||
{
|
||||
char_u *p;
|
||||
|
||||
@@ -781,7 +781,7 @@ void ex_jumps(exarg_T *eap)
|
||||
int i;
|
||||
char_u *name;
|
||||
|
||||
cleanup_jumplist();
|
||||
cleanup_jumplist(curwin);
|
||||
/* Highlight title */
|
||||
MSG_PUTS_TITLE(_("\n jump line col file/text"));
|
||||
for (i = 0; i < curwin->w_jumplistlen && !got_int; ++i) {
|
||||
@@ -1156,53 +1156,51 @@ void mark_col_adjust(
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* When deleting lines, this may create duplicate marks in the
|
||||
* jumplist. They will be removed here for the current window.
|
||||
*/
|
||||
void cleanup_jumplist(void)
|
||||
// When deleting lines, this may create duplicate marks in the
|
||||
// jumplist. They will be removed here for the specified window.
|
||||
void cleanup_jumplist(win_T *wp)
|
||||
{
|
||||
int i;
|
||||
int from, to;
|
||||
|
||||
to = 0;
|
||||
for (from = 0; from < curwin->w_jumplistlen; ++from) {
|
||||
if (curwin->w_jumplistidx == from)
|
||||
curwin->w_jumplistidx = to;
|
||||
for (i = from + 1; i < curwin->w_jumplistlen; ++i)
|
||||
if (curwin->w_jumplist[i].fmark.fnum
|
||||
== curwin->w_jumplist[from].fmark.fnum
|
||||
&& curwin->w_jumplist[from].fmark.fnum != 0
|
||||
&& curwin->w_jumplist[i].fmark.mark.lnum
|
||||
== curwin->w_jumplist[from].fmark.mark.lnum)
|
||||
for (from = 0; from < wp->w_jumplistlen; ++from) {
|
||||
if (wp->w_jumplistidx == from)
|
||||
wp->w_jumplistidx = to;
|
||||
for (i = from + 1; i < wp->w_jumplistlen; ++i)
|
||||
if (wp->w_jumplist[i].fmark.fnum
|
||||
== wp->w_jumplist[from].fmark.fnum
|
||||
&& wp->w_jumplist[from].fmark.fnum != 0
|
||||
&& wp->w_jumplist[i].fmark.mark.lnum
|
||||
== wp->w_jumplist[from].fmark.mark.lnum)
|
||||
break;
|
||||
if (i >= curwin->w_jumplistlen) { // no duplicate
|
||||
if (i >= wp->w_jumplistlen) { // no duplicate
|
||||
if (to != from) {
|
||||
// Not using curwin->w_jumplist[to++] = curwin->w_jumplist[from] because
|
||||
// Not using wp->w_jumplist[to++] = wp->w_jumplist[from] because
|
||||
// this way valgrind complains about overlapping source and destination
|
||||
// in memcpy() call. (clang-3.6.0, debug build with -DEXITFREE).
|
||||
curwin->w_jumplist[to] = curwin->w_jumplist[from];
|
||||
wp->w_jumplist[to] = wp->w_jumplist[from];
|
||||
}
|
||||
to++;
|
||||
} else {
|
||||
xfree(curwin->w_jumplist[from].fname);
|
||||
xfree(wp->w_jumplist[from].fname);
|
||||
}
|
||||
}
|
||||
if (curwin->w_jumplistidx == curwin->w_jumplistlen) {
|
||||
curwin->w_jumplistidx = to;
|
||||
if (wp->w_jumplistidx == wp->w_jumplistlen) {
|
||||
wp->w_jumplistidx = to;
|
||||
}
|
||||
curwin->w_jumplistlen = to;
|
||||
wp->w_jumplistlen = to;
|
||||
|
||||
// When pointer is below last jump, remove the jump if it matches the current
|
||||
// line. This avoids useless/phantom jumps. #9805
|
||||
if (curwin->w_jumplistlen
|
||||
&& curwin->w_jumplistidx == curwin->w_jumplistlen) {
|
||||
const xfmark_T *fm_last = &curwin->w_jumplist[curwin->w_jumplistlen - 1];
|
||||
if (wp->w_jumplistlen
|
||||
&& wp->w_jumplistidx == wp->w_jumplistlen) {
|
||||
const xfmark_T *fm_last = &wp->w_jumplist[wp->w_jumplistlen - 1];
|
||||
if (fm_last->fmark.fnum == curbuf->b_fnum
|
||||
&& fm_last->fmark.mark.lnum == curwin->w_cursor.lnum) {
|
||||
&& fm_last->fmark.mark.lnum == wp->w_cursor.lnum) {
|
||||
xfree(fm_last->fname);
|
||||
curwin->w_jumplistlen--;
|
||||
curwin->w_jumplistidx--;
|
||||
wp->w_jumplistlen--;
|
||||
wp->w_jumplistidx--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user