Merge #8491 from janlazo/vim-8.0.0255

This commit is contained in:
Justin M. Keyes 2018-06-07 18:31:50 +02:00 committed by GitHub
commit db68d1d638
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 84 additions and 40 deletions

View File

@ -6789,10 +6789,12 @@ setpos({expr}, {list})
[bufnum, lnum, col, off, curswant] [bufnum, lnum, col, off, curswant]
"bufnum" is the buffer number. Zero can be used for the "bufnum" is the buffer number. Zero can be used for the
current buffer. Setting the cursor is only possible for current buffer. When setting an uppercase mark "bufnum" is
the current buffer. To set a mark in another buffer you can used for the mark position. For other marks it specifies the
use the |bufnr()| function to turn a file name into a buffer buffer to set the mark in. You can use the |bufnr()| function
number. 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. Does not change the jumplist.
"lnum" and "col" are the position in the buffer. The first "lnum" and "col" are the position in the buffer. The first

View File

@ -14809,8 +14809,7 @@ static void f_setpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
pos.col = 0; pos.col = 0;
} }
if (name[0] == '.' && name[1] == NUL) { if (name[0] == '.' && name[1] == NUL) {
// set cursor // set cursor; "fnum" is ignored
if (fnum == curbuf->b_fnum) {
curwin->w_cursor = pos; curwin->w_cursor = pos;
if (curswant >= 0) { if (curswant >= 0) {
curwin->w_curswant = curswant - 1; curwin->w_curswant = curswant - 1;
@ -14818,9 +14817,6 @@ static void f_setpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
} }
check_cursor(); check_cursor();
rettv->vval.v_number = 0; rettv->vval.v_number = 0;
} else {
EMSG(_(e_invarg));
}
} else if (name[0] == '\'' && name[1] != NUL && name[2] == NUL) { } else if (name[0] == '\'' && name[1] != NUL && name[2] == NUL) {
// set mark // set mark
if (setmark_pos((uint8_t)name[1], &pos, fnum) == OK) { if (setmark_pos((uint8_t)name[1], &pos, fnum) == OK) {

View File

@ -106,37 +106,39 @@ int setmark_pos(int c, pos_T *pos, int fnum)
return OK; return OK;
} }
// Can't set a mark in a non-existant buffer.
buf_T *buf = buflist_findnr(fnum);
if (buf == NULL) {
return FAIL;
}
if (c == '"') { if (c == '"') {
RESET_FMARK(&curbuf->b_last_cursor, *pos, curbuf->b_fnum); RESET_FMARK(&buf->b_last_cursor, *pos, buf->b_fnum);
return OK; return OK;
} }
/* Allow setting '[ and '] for an autocommand that simulates reading a /* Allow setting '[ and '] for an autocommand that simulates reading a
* file. */ * file. */
if (c == '[') { if (c == '[') {
curbuf->b_op_start = *pos; buf->b_op_start = *pos;
return OK; return OK;
} }
if (c == ']') { if (c == ']') {
curbuf->b_op_end = *pos; buf->b_op_end = *pos;
return OK; return OK;
} }
if (c == '<' || c == '>') { if (c == '<' || c == '>') {
if (c == '<') if (c == '<') {
curbuf->b_visual.vi_start = *pos; buf->b_visual.vi_start = *pos;
else } else {
curbuf->b_visual.vi_end = *pos; buf->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 (buf->b_visual.vi_mode == NUL) {
buf_T *buf = buflist_findnr(fnum); // Visual_mode has not yet been set, use a sane default.
// Can't set a mark in a non-existant buffer. buf->b_visual.vi_mode = 'v';
if (buf == NULL) { }
return FAIL; return OK;
} }
if (ASCII_ISLOWER(c)) { if (ASCII_ISLOWER(c)) {
@ -358,13 +360,14 @@ pos_T *getmark_buf_fnum(buf_T *buf, int c, int changefile, int *fnum)
} else if (c == '<' || c == '>') { /* start/end of visual area */ } else if (c == '<' || c == '>') { /* start/end of visual area */
startp = &buf->b_visual.vi_start; startp = &buf->b_visual.vi_start;
endp = &buf->b_visual.vi_end; endp = &buf->b_visual.vi_end;
if ((c == '<') == lt(*startp, *endp)) if (((c == '<') == lt(*startp, *endp) || endp->lnum == 0)
&& startp->lnum != 0) {
posp = startp; posp = startp;
else } else {
posp = endp; posp = endp;
/* }
* For Visual line mode, set mark at begin or end of line
*/ // For Visual line mode, set mark at begin or end of line
if (buf->b_visual.vi_mode == 'V') { if (buf->b_visual.vi_mode == 'V') {
pos_copy = *posp; pos_copy = *posp;
posp = &pos_copy; posp = &pos_copy;
@ -648,7 +651,7 @@ void do_marks(exarg_T *eap)
} }
static void static void
show_one_mark ( show_one_mark(
int c, int c,
char_u *arg, char_u *arg,
pos_T *p, pos_T *p,

View File

@ -24,3 +24,47 @@ function! Test_Incr_Marks()
call assert_equal("XXX 123 123", getline(3)) call assert_equal("XXX 123 123", getline(3))
enew! enew!
endfunction 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

View File

@ -27,9 +27,8 @@ describe('setpos() function', function()
eq(getpos("."), {0, 2, 1, 0}) eq(getpos("."), {0, 2, 1, 0})
setpos(".", {2, 1, 1, 0}) setpos(".", {2, 1, 1, 0})
eq(getpos("."), {0, 1, 1, 0}) eq(getpos("."), {0, 1, 1, 0})
-- Ensure get an error attempting to set position to another buffer
local ret = exc_exec('call setpos(".", [1, 1, 1, 0])') local ret = exc_exec('call setpos(".", [1, 1, 1, 0])')
eq('Vim(call):E474: Invalid argument', ret) eq(0, ret)
end) end)
it('can set lowercase marks in the current buffer', function() it('can set lowercase marks in the current buffer', function()
setpos("'d", {0, 2, 1, 0}) setpos("'d", {0, 2, 1, 0})