aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-05-20 12:49:42 -0400
committerJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-05-20 13:33:59 -0400
commit783aa6b507bc40565c0b7dbd146beaa7645e72c5 (patch)
treec9963880f21c3a771db3109b61157352500d740b /src/nvim/eval.c
parentb9ba1295b466a440600b36a717c701bfcea53dbc (diff)
downloadrneovim-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.c31
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
*/