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 \<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
*** ../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 -- [email protected] -- 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 ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.