To: vim_dev@googlegroups.com Subject: Patch 7.4.313 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.313 (after 7.4.310) Problem: Changing the return value of getpos() causes an error. (Jie Zhu) Solution: Revert getpos() and add getcurpos(). Files: src/eval.c, src/testdir/test_eval.in, src/testdir/test_eval.ok, runtime/doc/eval.txt *** ../vim-7.4.312/src/eval.c 2014-05-28 18:22:37.876225054 +0200 --- src/eval.c 2014-05-28 20:11:55.364282457 +0200 *************** *** 560,565 **** --- 560,566 ---- static void f_getline __ARGS((typval_T *argvars, typval_T *rettv)); static void f_getmatches __ARGS((typval_T *argvars, typval_T *rettv)); static void f_getpid __ARGS((typval_T *argvars, typval_T *rettv)); + static void f_getcurpos __ARGS((typval_T *argvars, typval_T *rettv)); static void f_getpos __ARGS((typval_T *argvars, typval_T *rettv)); static void f_getqflist __ARGS((typval_T *argvars, typval_T *rettv)); static void f_getreg __ARGS((typval_T *argvars, typval_T *rettv)); *************** *** 7967,7972 **** --- 7968,7974 ---- {"getcmdline", 0, 0, f_getcmdline}, {"getcmdpos", 0, 0, f_getcmdpos}, {"getcmdtype", 0, 0, f_getcmdtype}, + {"getcurpos", 0, 0, f_getcurpos}, {"getcwd", 0, 0, f_getcwd}, {"getfontname", 0, 1, f_getfontname}, {"getfperm", 1, 1, f_getfperm}, *************** *** 11780,11785 **** --- 11782,11800 ---- rettv->vval.v_number = mch_get_pid(); } + static void getpos_both __ARGS((typval_T *argvars, typval_T *rettv, int getcurpos)); + + /* + * "getcurpos()" function + */ + static void + f_getcurpos(argvars, rettv) + typval_T *argvars; + typval_T *rettv; + { + getpos_both(argvars, rettv, TRUE); + } + /* * "getpos(string)" function */ *************** *** 11788,11793 **** --- 11803,11817 ---- typval_T *argvars; typval_T *rettv; { + getpos_both(argvars, rettv, FALSE); + } + + static void + getpos_both(argvars, rettv, getcurpos) + typval_T *argvars; + typval_T *rettv; + int getcurpos; + { pos_T *fp; list_T *l; int fnum = -1; *************** *** 11795,11801 **** if (rettv_list_alloc(rettv) == OK) { l = rettv->vval.v_list; ! fp = var2fpos(&argvars[0], TRUE, &fnum); if (fnum != -1) list_append_number(l, (varnumber_T)fnum); else --- 11819,11828 ---- if (rettv_list_alloc(rettv) == OK) { l = rettv->vval.v_list; ! if (getcurpos) ! fp = &curwin->w_cursor; ! else ! fp = var2fpos(&argvars[0], TRUE, &fnum); if (fnum != -1) list_append_number(l, (varnumber_T)fnum); else *************** *** 11810,11816 **** (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 --- 11837,11843 ---- (fp != NULL) ? (varnumber_T)fp->coladd : #endif (varnumber_T)0); ! if (getcurpos) list_append_number(l, (varnumber_T)curwin->w_curswant + 1); } else *** ../vim-7.4.312/src/testdir/test_eval.in 2014-05-28 14:32:47.160104334 +0200 --- src/testdir/test_eval.in 2014-05-28 20:14:27.048283785 +0200 *************** *** 190,198 **** :$put =v:exception :endtry :" ! :$put ='{{{1 setpos/getpos' /^012345678 ! 6l:let sp = getpos('.') 0:call setpos('.', sp) jyl:$put :" --- 190,198 ---- :$put =v:exception :endtry :" ! :$put ='{{{1 getcurpos/setpos' /^012345678 ! 6l:let sp = getcurpos() 0:call setpos('.', sp) jyl:$put :" *** ../vim-7.4.312/src/testdir/test_eval.ok 2014-05-28 14:32:47.160104334 +0200 --- src/testdir/test_eval.ok 2014-05-28 20:14:43.316283927 +0200 *************** *** 346,350 **** Bar exists: 1 func Bar exists: 1 Vim(call):E116: Invalid arguments for function append ! {{{1 setpos/getpos 6 --- 346,350 ---- Bar exists: 1 func Bar exists: 1 Vim(call):E116: Invalid arguments for function append ! {{{1 getcurpos/setpos 6 *** ../vim-7.4.312/runtime/doc/eval.txt 2014-05-28 18:22:37.872225054 +0200 --- runtime/doc/eval.txt 2014-05-28 20:27:57.092290876 +0200 *************** *** 1808,1817 **** getcmdline() String return the current command-line getcmdpos() Number return cursor position in command-line getcmdtype() String return the current command-line type getcwd() String the current working directory getfperm( {fname}) String file permissions of file {fname} getfsize( {fname}) Number size in bytes of file {fname} - getfontname( [{name}]) String name of font being used getftime( {fname}) Number last modification time of file getftype( {fname}) String description of type of file {fname} getline( {lnum}) String line {lnum} of current buffer --- 1808,1818 ---- getcmdline() String return the current command-line getcmdpos() Number return cursor position in command-line getcmdtype() String return the current command-line type + getcurpos() List position of the cursor getcwd() String the current working directory + getfontname( [{name}]) String name of font being used getfperm( {fname}) String file permissions of file {fname} getfsize( {fname}) Number size in bytes of file {fname} getftime( {fname}) Number last modification time of file getftype( {fname}) String description of type of file {fname} getline( {lnum}) String line {lnum} of current buffer *************** *** 2606,2613 **** 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, --- 2607,2614 ---- with two, three or four item: [{lnum}, {col}, {off}] [{lnum}, {col}, {off}, {curswant}] ! This is like the return value of |getpos()| or |getcurpos|, ! but without the first item. Does not change the jumplist. If {lnum} is greater than the number of lines in the buffer, *************** *** 2617,2622 **** --- 2618,2625 ---- the cursor will be positioned at the last character in the line. If {col} is zero, the cursor will stay in the current column. + If {curswant} is given it is used to set the preferred column + for vertical movment. Otherwise {col} is used. When 'virtualedit' is used {off} specifies the offset in screen columns from the start of the character. E.g., a position within a or after the last character. *************** *** 3339,3344 **** --- 3347,3363 ---- Returns an empty string otherwise. Also see |getcmdpos()|, |setcmdpos()| and |getcmdline()|. + *getcurpos()* + getcurpos() Get the position of the cursor. This is like getpos('.'), but + includes an extra item in the list: + [bufnum, lnum, col, off, curswant] + The "curswant" number is the preferred column when moving the + cursor vertically. + This can be used to save and restore the cursor position: > + let save_cursor = getcurpos() + MoveTheCursorAround + call setpos('.', save_cursor) + *getcwd()* getcwd() The result is a String, which is the name of the current working directory. *************** *** 4493,4502 **** *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 --- 4517,4526 ---- *getpos()* getpos({expr}) Get the position for {expr}. For possible values of {expr} ! see |line()|. For getting the cursor position see ! |getcurpos()|. ! 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 *************** *** 4505,4520 **** 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. ! This can be used to save and restore the cursor position: > ! let save_cursor = getpos(".") ! MoveTheCursorAround ! call setpos('.', save_cursor) ! < Also see |setpos()|. or({expr}, {expr}) *or()* Bitwise OR on the two arguments. The arguments are converted --- 4529,4542 ---- it is the offset in screen columns from the start of the character. E.g., a position within a or after the last character. 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 position of a mark: > ! let save_a_mark = getpos("'a") ! ... ! call setpos(''a', save_a_mark ! < Also see |getcurpos()| and |setpos()|. or({expr}, {expr}) *or()* Bitwise OR on the two arguments. The arguments are converted *************** *** 5347,5353 **** 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 --- 5369,5375 ---- Returns 0 when the position could be set, -1 otherwise. An error message is given if {expr} is invalid. ! Also see |getpos()| and |getcurpos()|. This does not restore the preferred column for moving vertically; if you set the cursor position with this, |j| and *** ../vim-7.4.312/src/version.c 2014-05-28 18:22:37.880225054 +0200 --- src/version.c 2014-05-28 20:15:52.164284530 +0200 *************** *** 736,737 **** --- 736,739 ---- { /* Add new patch number below this line */ + /**/ + 313, /**/ -- hundred-and-one symptoms of being an internet addict: 225. You sign up for free subscriptions for all the computer magazines /// 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 ///