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.