changeset 5944:332a5c2b2956 v7.4.313

updated for version 7.4.313 Problem: Changing the return value of getpos() causes an error. (Jie Zhu) Solution: Revert getpos() and add getcurpos().
author Bram Moolenaar <bram@vim.org>
date Wed, 28 May 2014 20:31:42 +0200
parents 67f652389aff
children 5976b378f610
files runtime/doc/eval.txt src/eval.c src/testdir/test_eval.in src/testdir/test_eval.ok src/version.c
diffstat 5 files changed, 59 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1808,10 +1808,11 @@ getcharmod( )			Number	modifiers for the
 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}
-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
@@ -2606,8 +2607,8 @@ cursor({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.
+		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,6 +2618,8 @@ cursor({list})
 		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 <Tab> or after the last character.
@@ -3340,6 +3343,17 @@ getcmdtype()						*getcmdtype()*
 		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.
@@ -4499,10 +4513,10 @@ 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 or five numbers:
+		see |line()|.  For getting the cursor position see
+		|getcurpos()|.
+		The result is a |List| with four 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
@@ -4511,16 +4525,14 @@ 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 <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
-			call setpos('.', save_cursor)
-<		Also see |setpos()|.
+		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
@@ -5353,7 +5365,7 @@ setpos({expr}, {list})
 		Returns 0 when the position could be set, -1 otherwise.
 		An error message is given if {expr} is invalid.
 
-		Also see |getpos()|
+		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
--- a/src/eval.c
+++ b/src/eval.c
@@ -560,6 +560,7 @@ static void f_getftype __ARGS((typval_T 
 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,6 +7968,7 @@ static struct fst
     {"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,6 +11782,19 @@ f_getpid(argvars, rettv)
     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,6 +11803,15 @@ f_getpos(argvars, rettv)
     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,7 +11819,10 @@ f_getpos(argvars, rettv)
     if (rettv_list_alloc(rettv) == OK)
     {
 	l = rettv->vval.v_list;
-	fp = var2fpos(&argvars[0], TRUE, &fnum);
+	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,7 +11837,7 @@ f_getpos(argvars, rettv)
 				(fp != NULL) ? (varnumber_T)fp->coladd :
 #endif
 							      (varnumber_T)0);
-	if (fp == &curwin->w_cursor)
+	if (getcurpos)
 	    list_append_number(l, (varnumber_T)curwin->w_curswant + 1);
     }
     else
--- a/src/testdir/test_eval.in
+++ b/src/testdir/test_eval.in
@@ -190,9 +190,9 @@ endfun
 :$put =v:exception
 :endtry
 :"
-:$put ='{{{1 setpos/getpos'
+:$put ='{{{1 getcurpos/setpos'
 /^012345678
-6l:let sp = getpos('.')
+6l:let sp = getcurpos()
 0:call setpos('.', sp)
 jyl:$put
 :"
index 7bbce810f8273c4457d27be9572ee406300c0502..59112d028e72a937287ae2d2b7e60a0a03bd4493
GIT binary patch
literal 11010
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
MJ@%&ACHN5h11f>ko&W#<
--- a/src/version.c
+++ b/src/version.c
@@ -735,6 +735,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    313,
+/**/
     312,
 /**/
     311,