Mercurial > vim
diff src/mark.c @ 10730:44e9340dc604 v8.0.0255
patch 8.0.0255: setpos() does not use the buffer argument for all marks
commit https://github.com/vim/vim/commit/f13e00b2cf381e13fd327b5387a5bd6f004ac2a3
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jan 28 18:23:54 2017 +0100
patch 8.0.0255: setpos() does not use the buffer argument for all marks
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.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 28 Jan 2017 18:30:04 +0100 |
parents | cd16ef948ad1 |
children | 778c10516955 |
line wrap: on
line diff
--- 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;