To: vim_dev@googlegroups.com Subject: Patch 8.0.0255 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- 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 ///