To: vim_dev@googlegroups.com Subject: Patch 8.0.1497 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1497 Problem: Getting the jump list requires parsing the output of :jumps. Solution: Add getjumplist(). (Yegappan Lakshmanan, closes #2609) Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/Makefile, src/evalfunc.c, src/list.c, src/proto/list.pro, src/testdir/Make_all.mak, src/testdir/test_jumplist.vim *** ../vim-8.0.1496/runtime/doc/eval.txt 2018-02-09 20:53:52.634060838 +0100 --- runtime/doc/eval.txt 2018-02-10 19:53:47.703047148 +0100 *************** *** 2167,2175 **** 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} 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 getmatches() List list of current matches getpid() Number process ID of Vim getpos({expr}) List position of cursor, mark, etc. --- 2167,2177 ---- 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 getmatches() List list of current matches getpid() Number process ID of Vim getpos({expr}) List position of cursor, mark, etc. *************** *** 4548,4553 **** --- 4562,4587 ---- "file" are returned. On MS-Windows a symbolic link to a directory returns "dir" instead of "link". + *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} *** ../vim-8.0.1496/runtime/doc/usr_41.txt 2017-03-09 18:19:58.153107904 +0100 --- runtime/doc/usr_41.txt 2018-02-10 19:49:08.693433077 +0100 *************** *** 807,812 **** --- 807,813 ---- 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 *** ../vim-8.0.1496/src/Makefile 2018-01-31 19:30:04.572336425 +0100 --- src/Makefile 2018-02-10 19:49:08.697433040 +0100 *************** *** 2198,2203 **** --- 2202,2208 ---- test_job_fails \ test_join \ test_json \ + test_jumplist \ test_jumps \ test_lambda \ test_langmap \ *** ../vim-8.0.1496/src/evalfunc.c 2018-02-10 18:45:21.048822301 +0100 --- src/evalfunc.c 2018-02-10 20:59:38.085439462 +0100 *************** *** 180,185 **** --- 180,186 ---- static void f_getfsize(typval_T *argvars, typval_T *rettv); static void f_getftime(typval_T *argvars, typval_T *rettv); static void f_getftype(typval_T *argvars, typval_T *rettv); + static void f_getjumplist(typval_T *argvars, typval_T *rettv); static void f_getline(typval_T *argvars, typval_T *rettv); static void f_getloclist(typval_T *argvars UNUSED, typval_T *rettv UNUSED); static void f_getmatches(typval_T *argvars, typval_T *rettv); *************** *** 621,626 **** --- 622,628 ---- {"getfsize", 1, 1, f_getfsize}, {"getftime", 1, 1, f_getftime}, {"getftype", 1, 1, f_getftype}, + {"getjumplist", 0, 2, f_getjumplist}, {"getline", 1, 2, f_getline}, {"getloclist", 1, 2, f_getloclist}, {"getmatches", 0, 0, f_getmatches}, *************** *** 4841,4846 **** --- 4843,4898 ---- } /* + * "getjumplist()" function + */ + static void + f_getjumplist(typval_T *argvars, typval_T *rettv) + { + #ifdef FEAT_JUMPLIST + win_T *wp; + int i; + list_T *l; + dict_T *d; + #endif + + if (rettv_list_alloc(rettv) != OK) + return; + + #ifdef FEAT_JUMPLIST + wp = find_tabwin(&argvars[0], &argvars[1]); + if (wp == NULL) + return; + + l = list_alloc(); + if (l == NULL) + return; + + if (list_append_list(rettv->vval.v_list, l) == FAIL) + return; + list_append_number(rettv->vval.v_list, (varnumber_T)wp->w_jumplistidx); + + for (i = 0; i < wp->w_jumplistlen; ++i) + { + if ((d = dict_alloc()) == NULL) + return; + if (list_append_dict(l, d) == FAIL) + return; + dict_add_nr_str(d, "lnum", (long)wp->w_jumplist[i].fmark.mark.lnum, + NULL); + dict_add_nr_str(d, "col", (long)wp->w_jumplist[i].fmark.mark.col, + NULL); + # ifdef FEAT_VIRTUALEDIT + dict_add_nr_str(d, "coladd", (long)wp->w_jumplist[i].fmark.mark.coladd, + NULL); + # endif + dict_add_nr_str(d, "bufnr", (long)wp->w_jumplist[i].fmark.fnum, NULL); + if (wp->w_jumplist[i].fmark.fnum == 0) + dict_add_nr_str(d, "filename", 0L, wp->w_jumplist[i].fname); + } + #endif + } + + /* * "getline(lnum, [end])" function */ static void *************** *** 5612,5622 **** "beos", #endif #ifdef MACOS_X ! "mac", /* Mac OS X (and, once, Mac OS Classic) */ ! "osx", /* Mac OS X */ # ifdef MACOS_X_DARWIN ! "macunix", /* Mac OS X, with the darwin feature */ ! "osxdarwin", /* synonym for macunix */ # endif #endif #ifdef __QNX__ --- 5664,5674 ---- "beos", #endif #ifdef MACOS_X ! "mac", /* Mac OS X (and, once, Mac OS Classic) */ ! "osx", /* Mac OS X */ # ifdef MACOS_X_DARWIN ! "macunix", /* Mac OS X, with the darwin feature */ ! "osxdarwin", /* synonym for macunix */ # endif #endif #ifdef __QNX__ *** ../vim-8.0.1496/src/list.c 2017-08-05 16:33:52.526755704 +0200 --- src/list.c 2018-02-10 19:49:08.697433040 +0100 *************** *** 475,480 **** --- 475,501 ---- } /* + * Append list2 to list1. + * Return FAIL when out of memory. + */ + int + list_append_list(list1, list2) + list_T *list1; + list_T *list2; + { + listitem_T *li = listitem_alloc(); + + if (li == NULL) + return FAIL; + li->li_tv.v_type = VAR_LIST; + li->li_tv.v_lock = 0; + li->li_tv.vval.v_list = list2; + list_append(list1, li); + ++list2->lv_refcount; + return OK; + } + + /* * Make a copy of "str" and append it as an item to list "l". * When "len" >= 0 use "str[len]". * Returns FAIL when out of memory. *** ../vim-8.0.1496/src/proto/list.pro 2017-04-30 20:12:53.378810666 +0200 --- src/proto/list.pro 2018-02-10 19:49:08.697433040 +0100 *************** *** 21,26 **** --- 21,27 ---- void list_append(list_T *l, listitem_T *item); int list_append_tv(list_T *l, typval_T *tv); int list_append_dict(list_T *list, dict_T *dict); + int list_append_list(list_T *list1, list_T *list2); int list_append_string(list_T *l, char_u *str, int len); int list_append_number(list_T *l, varnumber_T n); int list_insert_tv(list_T *l, typval_T *tv, listitem_T *item); *** ../vim-8.0.1496/src/testdir/Make_all.mak 2018-01-31 19:30:04.572336425 +0100 --- src/testdir/Make_all.mak 2018-02-10 19:49:08.697433040 +0100 *************** *** 120,125 **** --- 120,126 ---- test_ins_complete.res \ test_job_fails.res \ test_json.res \ + test_jumplist.res \ test_langmap.res \ test_let.res \ test_lineending.res \ *** ../vim-8.0.1496/src/testdir/test_jumplist.vim 2018-02-10 21:04:42.443349327 +0100 --- src/testdir/test_jumplist.vim 2018-02-10 19:49:08.697433040 +0100 *************** *** 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 \" + call assert_equal(2, getjumplist(1)[1]) + exe "normal 2\" + call assert_equal(0, getjumplist(1, 1)[1]) + exe "normal 3\" + call assert_equal(3, getjumplist()[1]) + exe "normal \" + 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 *** ../vim-8.0.1496/src/version.c 2018-02-10 18:45:21.100821928 +0100 --- src/version.c 2018-02-10 21:04:10.355572882 +0100 *************** *** 773,774 **** --- 773,776 ---- { /* Add new patch number below this line */ + /**/ + 1497, /**/ -- ARTHUR: Well, I AM king... DENNIS: Oh king, eh, very nice. An' how'd you get that, eh? By exploitin' the workers -- by 'angin' on to outdated imperialist dogma which perpetuates the economic an' social differences in our society! If there's ever going to be any progress-- The Quest for the Holy Grail (Monty Python) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///