# HG changeset patch # User Bram Moolenaar # Date 1401280486 -7200 # Node ID ccac0aa34eeaf46dad4b831461a532fc3fe71096 # Parent dd7113658e9e38997952d10bc947832667f89e25 updated for version 7.4.310 Problem: getpos()/setpos() don't include curswant. Solution: Add a fifth number when getting/setting the cursor. diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -2587,9 +2587,14 @@ cursor({lnum}, {col} [, {off}]) *curs cursor({list}) Positions the cursor at the column (byte count) {col} in the line {lnum}. The first column is one. + When there is one argument {list} this is used as a |List| - with two or three items {lnum}, {col} and {off}. This is like - the return value of |getpos()|, but without the first item. + with two, three or four item: + [{lnum}, {col}, {off}] + [{lnum}, {col}, {off}, {curswant}] + This is like the return value of |getpos()|, but without the + first item. + Does not change the jumplist. If {lnum} is greater than the number of lines in the buffer, the cursor will be positioned at the last line in the buffer. @@ -4481,8 +4486,9 @@ getpid() Return a Number which is the pr *getpos()* getpos({expr}) Get the position for {expr}. For possible values of {expr} see |line()|. - The result is a |List| with four numbers: + The result is a |List| with four or five numbers: [bufnum, lnum, col, off] + [bufnum, lnum, col, off, curswant] "bufnum" is zero, unless a mark like '0 or 'A is used, then it is the buffer number of the mark. "lnum" and "col" are the position in the buffer. The first @@ -4491,6 +4497,8 @@ getpos({expr}) Get the position for {exp it is the offset in screen columns from the start of the character. E.g., a position within a or after the last character. + The "curswant" number is only added for getpos('.'), it is the + preferred column when moving the cursor vertically. Note that for '< and '> Visual mode matters: when it is "V" (visual line mode) the column of '< is zero and the column of '> is a large number. @@ -5298,8 +5306,9 @@ setpos({expr}, {list}) . the cursor 'x mark x - {list} must be a |List| with four numbers: + {list} must be a |List| with four or five numbers: [bufnum, lnum, col, off] + [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 @@ -5317,6 +5326,12 @@ setpos({expr}, {list}) character. E.g., a position within a or after the last character. + The "curswant" number is only used when setting the cursor + position. It sets the preferred column for when moving the + cursor vertically. When the "curswant" number is missing the + preferred column is not set. When it is present and setting a + mark position it is not used. + Note that for '< and '> changing the line number may result in the marks to be effectively be swapped, so that '< is always before '>. @@ -5327,7 +5342,10 @@ setpos({expr}, {list}) Also see |getpos()| This does not restore the preferred column for moving - vertically. See |winrestview()| for that. + vertically; if you set the cursor position with this, |j| and + |k| motions will jump to previous columns! Use |cursor()| to + also set the preferred column. Also see the "curswant" key in + |winrestview()|. setqflist({list} [, {action}]) *setqflist()* diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -764,7 +764,7 @@ static void f_winwidth __ARGS((typval_T static void f_writefile __ARGS((typval_T *argvars, typval_T *rettv)); static void f_xor __ARGS((typval_T *argvars, typval_T *rettv)); -static int list2fpos __ARGS((typval_T *arg, pos_T *posp, int *fnump)); +static int list2fpos __ARGS((typval_T *arg, pos_T *posp, int *fnump, colnr_T *curswantp)); static pos_T *var2fpos __ARGS((typval_T *varp, int dollar_lnum, int *fnum)); static int get_env_len __ARGS((char_u **arg)); static int get_id_len __ARGS((char_u **arg)); @@ -9799,14 +9799,17 @@ f_cursor(argvars, rettv) if (argvars[1].v_type == VAR_UNKNOWN) { pos_T pos; - - if (list2fpos(argvars, &pos, NULL) == FAIL) + colnr_T curswant = -1; + + if (list2fpos(argvars, &pos, NULL, &curswant) == FAIL) return; line = pos.lnum; col = pos.col; #ifdef FEAT_VIRTUALEDIT coladd = pos.coladd; #endif + if (curswant >= 0) + curwin->w_curswant = curswant - 1; } else { @@ -11770,6 +11773,8 @@ f_getpos(argvars, rettv) (fp != NULL) ? (varnumber_T)fp->coladd : #endif (varnumber_T)0); + if (fp == &curwin->w_cursor) + list_append_number(l, (varnumber_T)curwin->w_curswant + 1); } else rettv->vval.v_number = FALSE; @@ -16751,12 +16756,13 @@ f_setpos(argvars, rettv) pos_T pos; int fnum; char_u *name; + colnr_T curswant = -1; rettv->vval.v_number = -1; name = get_tv_string_chk(argvars); if (name != NULL) { - if (list2fpos(&argvars[1], &pos, &fnum) == OK) + if (list2fpos(&argvars[1], &pos, &fnum, &curswant) == OK) { if (--pos.col < 0) pos.col = 0; @@ -16766,6 +16772,8 @@ f_setpos(argvars, rettv) if (fnum == curbuf->b_fnum) { curwin->w_cursor = pos; + if (curswant >= 0) + curwin->w_curswant = curswant - 1; check_cursor(); rettv->vval.v_number = 0; } @@ -19532,21 +19540,22 @@ var2fpos(varp, dollar_lnum, fnum) * validity. */ static int -list2fpos(arg, posp, fnump) +list2fpos(arg, posp, fnump, curswantp) typval_T *arg; pos_T *posp; int *fnump; + colnr_T *curswantp; { list_T *l = arg->vval.v_list; long i = 0; long n; - /* List must be: [fnum, lnum, col, coladd], where "fnum" is only there - * when "fnump" isn't NULL and "coladd" is optional. */ + /* List must be: [fnum, lnum, col, coladd, curswant], where "fnum" is only + * there when "fnump" isn't NULL; "coladd" and "curswant" are optional. */ if (arg->v_type != VAR_LIST || l == NULL || l->lv_len < (fnump == NULL ? 2 : 3) - || l->lv_len > (fnump == NULL ? 3 : 4)) + || l->lv_len > (fnump == NULL ? 4 : 5)) return FAIL; if (fnump != NULL) @@ -19570,13 +19579,16 @@ list2fpos(arg, posp, fnump) posp->col = n; #ifdef FEAT_VIRTUALEDIT - n = list_find_nr(l, i, NULL); + n = list_find_nr(l, i, NULL); /* off */ if (n < 0) posp->coladd = 0; else posp->coladd = n; #endif + if (curswantp != NULL) + *curswantp = list_find_nr(l, i + 1, NULL); /* curswant */ + return OK; } diff --git a/src/testdir/test_eval.in b/src/testdir/test_eval.in --- a/src/testdir/test_eval.in +++ b/src/testdir/test_eval.in @@ -190,9 +190,18 @@ endfun :$put =v:exception :endtry :" +:$put ='{{{1 setpos/getpos' +/^012345678 +6l:let sp = getpos('.') +0:call setpos('.', sp) +jyl:$put +:" :/^start:/+1,$wq! test.out :" vim: et ts=4 isk-=\: fmr=???,??? :call getchar() ENDTEST +012345678 +012345678 + start: diff --git a/src/testdir/test_eval.ok b/src/testdir/test_eval.ok index 313f39eef393647a0c4727c03c1f546a10eaf8e0..7bbce810f8273c4457d27be9572ee406300c0502 GIT binary patch literal 11007 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