diff --git a/7.4.310 b/7.4.310 new file mode 100644 index 0000000..2d25f0f --- /dev/null +++ b/7.4.310 @@ -0,0 +1,373 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.4.310 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.4.310 +Problem: getpos()/setpos() don't include curswant. +Solution: Add a fifth number when getting/setting the cursor. +Files: src/eval.c, src/testdir/test_eval.in, src/testdir/test_eval.ok, + runtime/doc/eval.txt + + +*** ../vim-7.4.309/src/eval.c 2014-05-22 18:59:54.506169240 +0200 +--- src/eval.c 2014-05-28 14:23:37.608099523 +0200 +*************** +*** 764,770 **** + 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 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)); +--- 764,770 ---- + 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, 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,9812 **** + if (argvars[1].v_type == VAR_UNKNOWN) + { + pos_T pos; + +! if (list2fpos(argvars, &pos, NULL) == FAIL) + return; + line = pos.lnum; + col = pos.col; + #ifdef FEAT_VIRTUALEDIT + coladd = pos.coladd; + #endif + } + else + { +--- 9799,9815 ---- + if (argvars[1].v_type == VAR_UNKNOWN) + { + pos_T pos; ++ 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,11775 **** +--- 11773,11780 ---- + (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,16762 **** + pos_T pos; + int fnum; + char_u *name; + + rettv->vval.v_number = -1; + name = get_tv_string_chk(argvars); + if (name != NULL) + { +! if (list2fpos(&argvars[1], &pos, &fnum) == OK) + { + if (--pos.col < 0) + pos.col = 0; +--- 16756,16768 ---- + 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, &curswant) == OK) + { + if (--pos.col < 0) + pos.col = 0; +*************** +*** 16766,16771 **** +--- 16772,16779 ---- + 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,19552 **** + * validity. + */ + static int +! list2fpos(arg, posp, fnump) + typval_T *arg; + pos_T *posp; + int *fnump; + { + 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. */ + if (arg->v_type != VAR_LIST + || l == NULL + || l->lv_len < (fnump == NULL ? 2 : 3) +! || l->lv_len > (fnump == NULL ? 3 : 4)) + return FAIL; + + if (fnump != NULL) +--- 19540,19561 ---- + * validity. + */ + static int +! 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, 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 ? 4 : 5)) + return FAIL; + + if (fnump != NULL) +*************** +*** 19570,19582 **** + posp->col = n; + + #ifdef FEAT_VIRTUALEDIT +! n = list_find_nr(l, i, NULL); + if (n < 0) + posp->coladd = 0; + else + posp->coladd = n; + #endif + + return OK; + } + +--- 19579,19594 ---- + posp->col = n; + + #ifdef FEAT_VIRTUALEDIT +! 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; + } + +*** ../vim-7.4.309/src/testdir/test_eval.in 2014-04-29 17:41:18.351689927 +0200 +--- src/testdir/test_eval.in 2014-05-28 14:22:31.780098947 +0200 +*************** +*** 190,198 **** +--- 190,207 ---- + :$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: +*** ../vim-7.4.309/src/testdir/test_eval.ok 2014-04-29 17:41:18.351689927 +0200 +--- src/testdir/test_eval.ok 2014-05-28 14:19:31.836097372 +0200 +*************** +*** 346,348 **** +--- 346,350 ---- + Bar exists: 1 + func Bar exists: 1 + Vim(call):E116: Invalid arguments for function append ++ {{{1 setpos/getpos ++ 6 +*** ../vim-7.4.309/runtime/doc/eval.txt 2014-05-07 18:35:25.661216052 +0200 +--- runtime/doc/eval.txt 2014-05-28 14:04:40.928089573 +0200 +*************** +*** 2587,2595 **** + 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. + 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. +--- 2587,2600 ---- + 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, 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. +*************** +*** 4475,4482 **** + *getpos()* + getpos({expr}) Get the position for {expr}. For possible values of {expr} + see |line()|. +! The result is a |List| with four numbers: + [bufnum, lnum, col, off] + "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 +--- 4490,4498 ---- + *getpos()* + getpos({expr}) Get the position for {expr}. For possible values of {expr} + see |line()|. +! 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 +*************** +*** 4485,4490 **** +--- 4501,4511 ---- + it is the offset in screen columns from the start of the + character. E.g., a position within a <Tab> 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. + This can be used to save and restore the cursor position: > + let save_cursor = getpos(".") + MoveTheCursorAround +*************** +*** 5289,5296 **** + . the cursor + 'x mark x + +! {list} must be a |List| with four numbers: + [bufnum, lnum, col, off] + + "bufnum" is the buffer number. Zero can be used for the + current buffer. Setting the cursor is only possible for +--- 5310,5318 ---- + . the cursor + 'x mark x + +! {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 +*************** +*** 5308,5320 **** + character. E.g., a position within a <Tab> or after the last + character. + + Returns 0 when the position could be set, -1 otherwise. + An error message is given if {expr} is invalid. + + Also see |getpos()| + + This does not restore the preferred column for moving +! vertically. See |winrestview()| for that. + + + setqflist({list} [, {action}]) *setqflist()* +--- 5330,5355 ---- + character. E.g., a position within a <Tab> 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 '>. ++ + Returns 0 when the position could be set, -1 otherwise. + An error message is given if {expr} is invalid. + + Also see |getpos()| + + This does not restore the preferred column for moving +! 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()* +*** ../vim-7.4.309/src/version.c 2014-05-28 13:42:59.884078184 +0200 +--- src/version.c 2014-05-28 14:27:20.132101471 +0200 +*************** +*** 736,737 **** +--- 736,739 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 310, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +218. Your spouse hands you a gift wrapped magnet with your PC's name + on it and you accuse him or her of genocide. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org ///