mirror of
https://github.com/neovim/neovim.git
synced 2025-12-03 15:33:03 +00:00
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:
@@ -2097,6 +2097,8 @@ getfperm({fname}) String file permissions of file {fname}
|
||||
getfsize({fname}) Number size in bytes of file {fname}
|
||||
getftime({fname}) Number last modification time of file
|
||||
getftype({fname}) String description of type of file {fname}
|
||||
getjumplist([{winnr} [, {tabnr}]])
|
||||
List list of jump list items
|
||||
getline({lnum}) String line {lnum} of current buffer
|
||||
getline({lnum}, {end}) List lines {lnum} to {end} of current buffer
|
||||
getloclist({nr} [, {what}]) List list of location list items
|
||||
@@ -4299,6 +4301,26 @@ getftype({fname}) *getftype()*
|
||||
systems that support it. On some systems only "dir" and
|
||||
"file" are returned.
|
||||
|
||||
*getjumplist()*
|
||||
getjumplist([{winnr} [, {tabnr}]])
|
||||
Returns the |jumplist| for the specified window.
|
||||
|
||||
Without arguments use the current window.
|
||||
With {winnr} only use this window in the current tab page.
|
||||
{winnr} can also be a |window-ID|.
|
||||
With {winnr} and {tabnr} use the window in the specified tab
|
||||
page.
|
||||
|
||||
The returned list contains two entries: a list with the jump
|
||||
locations and the last used jump position number in the list.
|
||||
Each entry in the jump location list is a dictionary with
|
||||
the following entries:
|
||||
bufnr buffer number
|
||||
col column number
|
||||
coladd column offset for 'virtualedit'
|
||||
filename filename if available
|
||||
lnum line number
|
||||
|
||||
*getline()*
|
||||
getline({lnum} [, {end}])
|
||||
Without {end} the result is a String, which is line {lnum}
|
||||
|
||||
@@ -806,6 +806,7 @@ Buffers, windows and the argument list:
|
||||
getbufinfo() get a list with buffer information
|
||||
gettabinfo() get a list with tab page information
|
||||
getwininfo() get a list with window information
|
||||
getjumplist() get a list of jump list entries
|
||||
|
||||
Command line: *command-line-functions*
|
||||
getcmdline() get the current command line
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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={},
|
||||
|
||||
64
src/nvim/testdir/test_jumplist.vim
Normal file
64
src/nvim/testdir/test_jumplist.vim
Normal 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
|
||||
Reference in New Issue
Block a user