diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/eval.c | 11 | ||||
| -rw-r--r-- | src/nvim/mark.c | 58 | ||||
| -rw-r--r-- | src/nvim/shada.c | 2 | ||||
| -rw-r--r-- | src/nvim/testdir/test_jumplist.vim | 6 | 
4 files changed, 40 insertions, 37 deletions
| diff --git a/src/nvim/eval.c b/src/nvim/eval.c index d48161d736..5c1c722a61 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -10055,7 +10055,7 @@ static void f_getftype(typval_T *argvars, typval_T *rettv, FunPtr fptr)  static void f_getjumplist(typval_T *argvars, typval_T *rettv, FunPtr fptr)  {    tv_list_alloc_ret(rettv, kListLenMayKnow); -  const win_T *const wp = find_tabwin(&argvars[0], &argvars[1]); +  win_T *const wp = find_tabwin(&argvars[0], &argvars[1]);    if (wp == NULL) {      return;    } @@ -10064,14 +10064,21 @@ static void f_getjumplist(typval_T *argvars, typval_T *rettv, FunPtr fptr)    tv_list_append_list(rettv->vval.v_list, l);    tv_list_append_number(rettv->vval.v_list, wp->w_jumplistidx); +  cleanup_jumplist(wp);    for (int 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]); +    }      dict_T *const d = tv_dict_alloc();      tv_list_append_dict(l, d);      tv_dict_add_nr(d, S_LEN("lnum"), wp->w_jumplist[i].fmark.mark.lnum);      tv_dict_add_nr(d, S_LEN("col"), wp->w_jumplist[i].fmark.mark.col);      tv_dict_add_nr(d, S_LEN("coladd"), wp->w_jumplist[i].fmark.mark.coladd);      tv_dict_add_nr(d, S_LEN("bufnr"), wp->w_jumplist[i].fmark.fnum); -    if (wp->w_jumplist[i].fmark.fnum == 0) { +    if (wp->w_jumplist[i].fname != NULL) {        tv_dict_add_str(d, S_LEN("filename"), (char *)wp->w_jumplist[i].fname);      }    } diff --git a/src/nvim/mark.c b/src/nvim/mark.c index ecd1f098ca..64b7b2e002 100644 --- a/src/nvim/mark.c +++ b/src/nvim/mark.c @@ -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--;      }    }  } diff --git a/src/nvim/shada.c b/src/nvim/shada.c index eace4a524c..9f376ef9a0 100644 --- a/src/nvim/shada.c +++ b/src/nvim/shada.c @@ -2739,7 +2739,7 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,    // Initialize jump list    const void *jump_iter = NULL; -  cleanup_jumplist(); +  cleanup_jumplist(curwin);    setpcmark();    do {      xfmark_T fm; diff --git a/src/nvim/testdir/test_jumplist.vim b/src/nvim/testdir/test_jumplist.vim index 7079d21aa4..02dbd76194 100644 --- a/src/nvim/testdir/test_jumplist.vim +++ b/src/nvim/testdir/test_jumplist.vim @@ -30,7 +30,6 @@ func Test_getjumplist()    call assert_equal([[  	      \ {'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0}, -	      \ {'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0},  	      \ {'lnum': 50, 'bufnr': bnr, 'col': 0, 'coladd': 0},  	      \ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0}], 4],  	      \ getjumplist()) @@ -48,17 +47,16 @@ func Test_getjumplist()    call assert_equal([[  	      \ {'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0},  	      \ {'lnum': 50, 'bufnr': bnr, 'col': 0, 'coladd': 0}, -	      \ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0},  	      \ {'lnum': 5, 'bufnr': bnr, 'col': 0, 'coladd': 0},  	      \ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0}], 5],  	      \ getjumplist())    let l = getjumplist()    call test_garbagecollect_now() -  call assert_equal(5, l[1]) +  call assert_equal(4, l[1])    clearjumps    call test_garbagecollect_now() -  call assert_equal(5, l[1]) +  call assert_equal(4, l[1])    call delete("Xtest")  endfunc | 
