aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval.c31
-rw-r--r--src/nvim/testdir/test_cursor_func.vim10
2 files changed, 22 insertions, 19 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index c1905b31d0..3e855ece15 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -7739,7 +7739,6 @@ pos_T *var2fpos(const typval_T *const tv, const bool dollar_lnum, int *const ret
FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{
static pos_T pos;
- pos_T *pp;
// Argument can be [lnum, col, coladd].
if (tv->v_type == VAR_LIST) {
@@ -7799,33 +7798,31 @@ pos_T *var2fpos(const typval_T *const tv, const bool dollar_lnum, int *const ret
if (name == NULL) {
return NULL;
}
- if (name[0] == '.') { // Cursor.
+
+ pos.lnum = 0;
+ if (name[0] == '.') {
+ // cursor
pos = curwin->w_cursor;
- if (charcol) {
- pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col);
- }
- return &pos;
- }
- if (name[0] == 'v' && name[1] == NUL) { // Visual start.
+ } else if (name[0] == 'v' && name[1] == NUL) {
+ // Visual start
if (VIsual_active) {
pos = VIsual;
} else {
pos = curwin->w_cursor;
}
- if (charcol) {
- pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col);
- }
- return &pos;
- }
- if (name[0] == '\'') { // Mark.
- pp = getmark_buf_fnum(curbuf, (uint8_t)name[1], false, ret_fnum);
+ } else if (name[0] == '\'') {
+ // mark
+ const pos_T *const pp = getmark_buf_fnum(curbuf, (uint8_t)name[1], false, ret_fnum);
if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0) {
return NULL;
}
+ pos = *pp;
+ }
+ if (pos.lnum != 0) {
if (charcol) {
- pp->col = buf_byteidx_to_charidx(curbuf, pp->lnum, pp->col);
+ pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col);
}
- return pp;
+ return &pos;
}
pos.coladd = 0;
diff --git a/src/nvim/testdir/test_cursor_func.vim b/src/nvim/testdir/test_cursor_func.vim
index 57825b4551..9ba82e3b70 100644
--- a/src/nvim/testdir/test_cursor_func.vim
+++ b/src/nvim/testdir/test_cursor_func.vim
@@ -140,12 +140,12 @@ func Test_getcharpos()
call assert_fails('call getcharpos({})', 'E731:')
call assert_equal([0, 0, 0, 0], getcharpos(0))
new
- call setline(1, ['', "01\tà4è678", 'Ⅵ', '012345678'])
+ call setline(1, ['', "01\tà4è678", 'Ⅵ', '012345678', ' │ x'])
" Test for '.' and '$'
normal 1G
call assert_equal([0, 1, 1, 0], getcharpos('.'))
- call assert_equal([0, 4, 1, 0], getcharpos('$'))
+ call assert_equal([0, 5, 1, 0], getcharpos('$'))
normal 2G6l
call assert_equal([0, 2, 7, 0], getcharpos('.'))
normal 3G$
@@ -159,6 +159,12 @@ func Test_getcharpos()
delmarks m
call assert_equal([0, 0, 0, 0], getcharpos("'m"))
+ " Check mark does not move
+ normal 5Gfxma
+ call assert_equal([0, 5, 5, 0], getcharpos("'a"))
+ call assert_equal([0, 5, 5, 0], getcharpos("'a"))
+ call assert_equal([0, 5, 5, 0], getcharpos("'a"))
+
" Test for the visual start column
vnoremap <expr> <F3> SaveVisualStartCharPos()
let g:VisualStartPos = []