diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/eval.c | 31 | ||||
| -rw-r--r-- | src/nvim/eval.lua | 1 | ||||
| -rw-r--r-- | src/nvim/testdir/test_changelist.vim | 48 | 
3 files changed, 80 insertions, 0 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 6479163028..7229b2f977 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -9547,6 +9547,37 @@ f_getbufvar_end:    }  } +// "getchangelist()" function +static void f_getchangelist(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ +  tv_list_alloc_ret(rettv, 2); +  const buf_T *const buf = find_buffer(&argvars[0]); +  if (buf == NULL) { +    return; +  } + +  list_T *const l = tv_list_alloc(buf->b_changelistlen); +  tv_list_append_list(rettv->vval.v_list, l); +  // The current window change list index tracks only the position in the +  // current buffer change list. For other buffers, use the change list +  // length as the current index. +  tv_list_append_number(rettv->vval.v_list, +                        (buf == curwin->w_buffer) +                        ? curwin->w_changelistidx +                        : buf->b_changelistlen); + +  for (int i = 0; i < buf->b_changelistlen; i++) { +    if (buf->b_changelist[i].mark.lnum == 0) { +      continue; +    } +    dict_T *const d = tv_dict_alloc(); +    tv_list_append_dict(l, d); +    tv_dict_add_nr(d, S_LEN("lnum"), buf->b_changelist[i].mark.lnum); +    tv_dict_add_nr(d, S_LEN("col"), buf->b_changelist[i].mark.col); +    tv_dict_add_nr(d, S_LEN("coladd"), buf->b_changelist[i].mark.coladd); +  } +} +  /*   * "getchar()" function   */ diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua index d4bb69613e..aad2de5d30 100644 --- a/src/nvim/eval.lua +++ b/src/nvim/eval.lua @@ -116,6 +116,7 @@ return {      getbufinfo={args={0, 1}},      getbufline={args={2, 3}},      getbufvar={args={2, 3}}, +    getchangelist={args={1, 1}},      getchar={args={0, 1}},      getcharmod={},      getcharsearch={}, diff --git a/src/nvim/testdir/test_changelist.vim b/src/nvim/testdir/test_changelist.vim new file mode 100644 index 0000000000..0880fce840 --- /dev/null +++ b/src/nvim/testdir/test_changelist.vim @@ -0,0 +1,48 @@ +" Tests for the changelist functionality + +" Tests for the getchangelist() function +func Test_getchangelist() +  if !has("jumplist") +    return +  endif + +  bwipe! +  enew +  call assert_equal([], getchangelist(10)) +  call assert_equal([[], 0], getchangelist(bufnr('%'))) + +  call writefile(['line1', 'line2', 'line3'], 'Xfile1.txt') +  call writefile(['line1', 'line2', 'line3'], 'Xfile2.txt') + +  edit Xfile1.txt +  exe "normal 1Goline\<C-G>u1.1" +  exe "normal 3Goline\<C-G>u2.1" +  exe "normal 5Goline\<C-G>u3.1" +  normal g; +  call assert_equal([[ +	      \ {'lnum' : 2, 'col' : 4, 'coladd' : 0}, +	      \ {'lnum' : 4, 'col' : 4, 'coladd' : 0}, +	      \ {'lnum' : 6, 'col' : 4, 'coladd' : 0}], 2], +	      \ getchangelist(bufnr('%'))) + +  hide edit Xfile2.txt +  exe "normal 1GOline\<C-G>u1.0" +  exe "normal 2Goline\<C-G>u2.0" +  call assert_equal([[ +	      \ {'lnum' : 1, 'col' : 6, 'coladd' : 0}, +	      \ {'lnum' : 3, 'col' : 6, 'coladd' : 0}], 2], +	      \ getchangelist(bufnr('%'))) +  hide enew + +  call assert_equal([[ +	      \ {'lnum' : 2, 'col' : 4, 'coladd' : 0}, +	      \ {'lnum' : 4, 'col' : 4, 'coladd' : 0}, +	      \ {'lnum' : 6, 'col' : 4, 'coladd' : 0}], 3], getchangelist(2)) +  call assert_equal([[ +	      \ {'lnum' : 1, 'col' : 6, 'coladd' : 0}, +	      \ {'lnum' : 3, 'col' : 6, 'coladd' : 0}], 2], getchangelist(3)) + +  bwipe! +  call delete('Xfile1.txt') +  call delete('Xfile2.txt') +endfunc  | 
