vim-patch:8.0.1497: getting the jump list requires parsing the output of :jumps

Problem:    Getting the jump list requires parsing the output of :jumps.
Solution:   Add getjumplist(). (Yegappan Lakshmanan, closes vim/vim#2609)
4f50588ba3
This commit is contained in:
Jan Edmund Lazo
2019-05-19 07:42:41 -04:00
parent 83aed410b6
commit 41828a7302
5 changed files with 114 additions and 0 deletions

View File

@@ -10051,6 +10051,32 @@ static void f_getftype(typval_T *argvars, typval_T *rettv, FunPtr fptr)
rettv->vval.v_string = type;
}
// "getjumplist()" function
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]);
if (wp == NULL) {
return;
}
list_T *const l = tv_list_alloc(wp->w_jumplistlen);
tv_list_append_list(rettv->vval.v_list, l);
tv_list_append_number(rettv->vval.v_list, wp->w_jumplistidx);
for (int i = 0; i < wp->w_jumplistlen; 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) {
tv_dict_add_str(d, S_LEN("filename"), (char *)wp->w_jumplist[i].fname);
}
}
}
/*
* "getline(lnum, [end])" function
*/

View File

@@ -131,6 +131,7 @@ return {
getfsize={args=1},
getftime={args=1},
getftype={args=1},
getjumplist={args={0, 2}},
getline={args={1, 2}},
getloclist={args={1, 2}},
getmatches={},

View File

@@ -0,0 +1,64 @@
" Tests for the jumplist functionality
" Tests for the getjumplist() function
func Test_getjumplist()
if !has("jumplist")
return
endif
%bwipe
clearjumps
call assert_equal([[], 0], getjumplist())
call assert_equal([[], 0], getjumplist(1))
call assert_equal([[], 0], getjumplist(1, 1))
call assert_equal([], getjumplist(100))
call assert_equal([], getjumplist(1, 100))
let lines = []
for i in range(1, 100)
call add(lines, "Line " . i)
endfor
call writefile(lines, "Xtest")
" Jump around and create a jump list
edit Xtest
let bnr = bufnr('%')
normal 50%
normal G
normal gg
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())
" Traverse the jump list and verify the results
5
exe "normal \<C-O>"
call assert_equal(2, getjumplist(1)[1])
exe "normal 2\<C-O>"
call assert_equal(0, getjumplist(1, 1)[1])
exe "normal 3\<C-I>"
call assert_equal(3, getjumplist()[1])
exe "normal \<C-O>"
normal 20%
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])
clearjumps
call test_garbagecollect_now()
call assert_equal(5, l[1])
call delete("Xtest")
endfunc