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.

Raspunde prin e-mail lui