Patch 8.0.0255
Problem:    When calling setpos() with a buffer argument it often is ignored.
            (Matthew Malcomson)
Solution:   Make the buffer argument work for all marks local to a buffer.
            (neovim #5713)  Add more tests.
Files:      src/mark.c, src/testdir/test_marks.vim, runtime/doc/eval.txt


*** ../vim-8.0.0254/src/mark.c  2016-10-15 20:46:13.580656069 +0200
--- src/mark.c  2017-01-28 18:14:39.884526505 +0100
***************
*** 57,62 ****
--- 57,63 ----
  setmark_pos(int c, pos_T *pos, int fnum)
  {
      int               i;
+     buf_T     *buf;
  
      /* Check for a special key (may cause islower() to crash). */
      if (c < 0)
***************
*** 75,83 ****
        return OK;
      }
  
      if (c == '"')
      {
!       curbuf->b_last_cursor = *pos;
        return OK;
      }
  
--- 76,88 ----
        return OK;
      }
  
+     buf = buflist_findnr(fnum);
+     if (buf == NULL)
+       return FAIL;
+ 
      if (c == '"')
      {
!       buf->b_last_cursor = *pos;
        return OK;
      }
  
***************
*** 85,115 ****
       * file. */
      if (c == '[')
      {
!       curbuf->b_op_start = *pos;
        return OK;
      }
      if (c == ']')
      {
!       curbuf->b_op_end = *pos;
        return OK;
      }
  
      if (c == '<' || c == '>')
      {
        if (c == '<')
!           curbuf->b_visual.vi_start = *pos;
        else
!           curbuf->b_visual.vi_end = *pos;
!       if (curbuf->b_visual.vi_mode == NUL)
            /* Visual_mode has not yet been set, use a sane default. */
!           curbuf->b_visual.vi_mode = 'v';
        return OK;
      }
  
      if (ASCII_ISLOWER(c))
      {
        i = c - 'a';
!       curbuf->b_namedm[i] = *pos;
        return OK;
      }
      if (ASCII_ISUPPER(c) || VIM_ISDIGIT(c))
--- 90,120 ----
       * file. */
      if (c == '[')
      {
!       buf->b_op_start = *pos;
        return OK;
      }
      if (c == ']')
      {
!       buf->b_op_end = *pos;
        return OK;
      }
  
      if (c == '<' || c == '>')
      {
        if (c == '<')
!           buf->b_visual.vi_start = *pos;
        else
!           buf->b_visual.vi_end = *pos;
!       if (buf->b_visual.vi_mode == NUL)
            /* Visual_mode has not yet been set, use a sane default. */
!           buf->b_visual.vi_mode = 'v';
        return OK;
      }
  
      if (ASCII_ISLOWER(c))
      {
        i = c - 'a';
!       buf->b_namedm[i] = *pos;
        return OK;
      }
      if (ASCII_ISUPPER(c) || VIM_ISDIGIT(c))
***************
*** 396,402 ****
      {
        startp = &buf->b_visual.vi_start;
        endp = &buf->b_visual.vi_end;
!       if ((c == '<') == lt(*startp, *endp))
            posp = startp;
        else
            posp = endp;
--- 401,408 ----
      {
        startp = &buf->b_visual.vi_start;
        endp = &buf->b_visual.vi_end;
!       if (((c == '<') == lt(*startp, *endp) || endp->lnum == 0)
!                                                         && startp->lnum != 0)
            posp = startp;
        else
            posp = endp;
*** ../vim-8.0.0254/src/testdir/test_marks.vim  2016-09-01 22:07:07.000000000 
+0200
--- src/testdir/test_marks.vim  2017-01-28 17:56:37.099380247 +0100
***************
*** 24,26 ****
--- 24,70 ----
    call assert_equal("XXX 123 123", getline(3))
    enew!
  endfunction
+ 
+ func Test_setpos()
+   new one
+   let onebuf = bufnr('%')
+   let onewin = win_getid()
+   call setline(1, ['aaa', 'bbb', 'ccc'])
+   new two
+   let twobuf = bufnr('%')
+   let twowin = win_getid()
+   call setline(1, ['aaa', 'bbb', 'ccc'])
+ 
+   " for the cursor the buffer number is ignored
+   call setpos(".", [0, 2, 1, 0])
+   call assert_equal([0, 2, 1, 0], getpos("."))
+   call setpos(".", [onebuf, 3, 3, 0])
+   call assert_equal([0, 3, 3, 0], getpos("."))
+ 
+   call setpos("''", [0, 1, 3, 0])
+   call assert_equal([0, 1, 3, 0], getpos("''"))
+   call setpos("''", [onebuf, 2, 2, 0])
+   call assert_equal([0, 2, 2, 0], getpos("''"))
+ 
+   " buffer-local marks
+   for mark in ["'a", "'\"", "'[", "']", "'<", "'>"]
+     call win_gotoid(twowin)
+     call setpos(mark, [0, 2, 1, 0])
+     call assert_equal([0, 2, 1, 0], getpos(mark), "for mark " . mark)
+     call setpos(mark, [onebuf, 1, 3, 0])
+     call win_gotoid(onewin)
+     call assert_equal([0, 1, 3, 0], getpos(mark), "for mark " . mark)
+   endfor
+ 
+   " global marks
+   call win_gotoid(twowin)
+   call setpos("'N", [0, 2, 1, 0])
+   call assert_equal([twobuf, 2, 1, 0], getpos("'N"))
+   call setpos("'N", [onebuf, 1, 3, 0])
+   call assert_equal([onebuf, 1, 3, 0], getpos("'N"))
+ 
+   call win_gotoid(onewin)
+   bwipe!
+   call win_gotoid(twowin)
+   bwipe!
+ endfunc
*** ../vim-8.0.0254/runtime/doc/eval.txt        2017-01-28 15:58:45.336197327 
+0100
--- runtime/doc/eval.txt        2017-01-28 17:52:00.605128498 +0100
***************
*** 6797,6806 ****
                    [bufnum, lnum, col, off, curswant]
  
                "bufnum" is the buffer number.  Zero can be used for the
!               current buffer.  Setting the cursor is only possible for
!               the current buffer.  To set a mark in another buffer you can
!               use the |bufnr()| function to turn a file name into a buffer
!               number.
                Does not change the jumplist.
  
                "lnum" and "col" are the position in the buffer.  The first
--- 6806,6817 ----
                    [bufnum, lnum, col, off, curswant]
  
                "bufnum" is the buffer number.  Zero can be used for the
!               current buffer.  When setting an uppercase mark "bufnum" is
!               used for the mark position.  For other marks it specifies the
!               buffer to set the mark in.  You can use the |bufnr()| function
!               to turn a file name into a buffer number.
!               For setting the cursor and the ' mark "bufnum" is ignored,
!               since these are associated with a window, not a buffer.
                Does not change the jumplist.
  
                "lnum" and "col" are the position in the buffer.  The first
*** ../vim-8.0.0254/src/version.c       2017-01-28 18:08:08.155009961 +0100
--- src/version.c       2017-01-28 18:22:31.973532336 +0100
***************
*** 766,767 ****
--- 766,769 ----
  {   /* Add new patch number below this line */
+ /**/
+     255,
  /**/

-- 
LAUNCELOT: I am, sir. I am a Knight of King Arthur.
FATHER:    'Mm ... very nice castle, Camelot ... very good pig country....
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// 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