diff options
author | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2019-05-20 12:49:42 -0400 |
---|---|---|
committer | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2019-05-20 13:33:59 -0400 |
commit | 783aa6b507bc40565c0b7dbd146beaa7645e72c5 (patch) | |
tree | c9963880f21c3a771db3109b61157352500d740b /src/nvim/eval.c | |
parent | b9ba1295b466a440600b36a717c701bfcea53dbc (diff) | |
download | rneovim-783aa6b507bc40565c0b7dbd146beaa7645e72c5.tar.gz rneovim-783aa6b507bc40565c0b7dbd146beaa7645e72c5.tar.bz2 rneovim-783aa6b507bc40565c0b7dbd146beaa7645e72c5.zip |
vim-patch:8.0.1514: getting the list of changes is not easy
Problem: Getting the list of changes is not easy.
Solution: Add the getchangelist() function. (Yegappan Lakshmanan,
closes vim/vim#2634)
https://github.com/vim/vim/commit/07ad816525da67cab3c0db21d1286d221dbc7477
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r-- | src/nvim/eval.c | 31 |
1 files changed, 31 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 */ |