diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-01-28 18:23:54 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-01-28 18:23:54 +0100 |
commit | f13e00b2cf381e13fd327b5387a5bd6f004ac2a3 (patch) | |
tree | 31105fdbc8e8c7894b986619c65e14d369fa0090 /src/mark.c | |
parent | c7b831ca154537505f5a22d01335a86b2e9cb023 (diff) | |
download | vim-git-f13e00b2cf381e13fd327b5387a5bd6f004ac2a3.tar.gz |
patch 8.0.0255: setpos() does not use the buffer argument for all marksv8.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.
Diffstat (limited to 'src/mark.c')
-rw-r--r-- | src/mark.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/mark.c b/src/mark.c index 9c84bc40d..59ac01dc5 100644 --- a/src/mark.c +++ b/src/mark.c @@ -57,6 +57,7 @@ setmark(int c) 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,9 +76,13 @@ setmark_pos(int c, pos_T *pos, int fnum) return OK; } + buf = buflist_findnr(fnum); + if (buf == NULL) + return FAIL; + if (c == '"') { - curbuf->b_last_cursor = *pos; + buf->b_last_cursor = *pos; return OK; } @@ -85,31 +90,31 @@ setmark_pos(int c, pos_T *pos, int fnum) * file. */ if (c == '[') { - curbuf->b_op_start = *pos; + buf->b_op_start = *pos; return OK; } if (c == ']') { - curbuf->b_op_end = *pos; + buf->b_op_end = *pos; return OK; } if (c == '<' || c == '>') { if (c == '<') - curbuf->b_visual.vi_start = *pos; + buf->b_visual.vi_start = *pos; else - curbuf->b_visual.vi_end = *pos; - if (curbuf->b_visual.vi_mode == NUL) + buf->b_visual.vi_end = *pos; + if (buf->b_visual.vi_mode == NUL) /* Visual_mode has not yet been set, use a sane default. */ - curbuf->b_visual.vi_mode = 'v'; + buf->b_visual.vi_mode = 'v'; return OK; } if (ASCII_ISLOWER(c)) { i = c - 'a'; - curbuf->b_namedm[i] = *pos; + buf->b_namedm[i] = *pos; return OK; } if (ASCII_ISUPPER(c) || VIM_ISDIGIT(c)) @@ -396,7 +401,8 @@ getmark_buf_fnum( { startp = &buf->b_visual.vi_start; endp = &buf->b_visual.vi_end; - if ((c == '<') == lt(*startp, *endp)) + if (((c == '<') == lt(*startp, *endp) || endp->lnum == 0) + && startp->lnum != 0) posp = startp; else posp = endp; |