diff -r b1b18442cf4b runtime/doc/tags
--- a/runtime/doc/tags	Tue Nov 20 17:55:10 2012 +0100
+++ b/runtime/doc/tags	Wed Nov 21 19:41:31 2012 -0800
@@ -5728,6 +5728,7 @@
 ft-r-indent	indent.txt	/*ft-r-indent*
 ft-readline-syntax	syntax.txt	/*ft-readline-syntax*
 ft-rexx-syntax	syntax.txt	/*ft-rexx-syntax*
+ft-rst-syntax	syntax.txt	/*ft-rst-syntax*
 ft-ruby-omni	insert.txt	/*ft-ruby-omni*
 ft-ruby-syntax	syntax.txt	/*ft-ruby-syntax*
 ft-scheme-syntax	syntax.txt	/*ft-scheme-syntax*
@@ -5872,6 +5873,7 @@
 g:netrw_dav_cmd	pi_netrw.txt	/*g:netrw_dav_cmd*
 g:netrw_decompress	pi_netrw.txt	/*g:netrw_decompress*
 g:netrw_dirhistmax	pi_netrw.txt	/*g:netrw_dirhistmax*
+g:netrw_dynamic_maxfilenamelen	pi_netrw.txt	/*g:netrw_dynamic_maxfilenamelen*
 g:netrw_errorlvl	pi_netrw.txt	/*g:netrw_errorlvl*
 g:netrw_fastbrowse	pi_netrw.txt	/*g:netrw_fastbrowse*
 g:netrw_fetch_cmd	pi_netrw.txt	/*g:netrw_fetch_cmd*
@@ -6840,6 +6842,7 @@
 netrw-S	pi_netrw.txt	/*netrw-S*
 netrw-T	pi_netrw.txt	/*netrw-T*
 netrw-U	pi_netrw.txt	/*netrw-U*
+netrw-X	pi_netrw.txt	/*netrw-X*
 netrw-a	pi_netrw.txt	/*netrw-a*
 netrw-activate	pi_netrw.txt	/*netrw-activate*
 netrw-bookmark	pi_netrw.txt	/*netrw-bookmark*
@@ -7426,6 +7429,7 @@
 riscos	os_risc.txt	/*riscos*
 rot13	change.txt	/*rot13*
 round()	eval.txt	/*round()*
+rst.vim	syntax.txt	/*rst.vim*
 rsync	pi_netrw.txt	/*rsync*
 ruby	if_ruby.txt	/*ruby*
 ruby-buffer	if_ruby.txt	/*ruby-buffer*
diff -r b1b18442cf4b src/eval.c
--- a/src/eval.c	Tue Nov 20 17:55:10 2012 +0100
+++ b/src/eval.c	Wed Nov 21 19:41:31 2012 -0800
@@ -200,6 +200,7 @@
 #define FC_ABORT    1		/* abort function on error */
 #define FC_RANGE    2		/* function accepts range */
 #define FC_DICT	    4		/* Dict function, uses "self" */
+#define FC_STAY	    8		/* save function, prevent moving cursor */
 
 /*
  * All user-defined functions are found in this hashtable.
@@ -3453,7 +3454,15 @@
 	lnum = eap->line1;
     for ( ; lnum <= eap->line2; ++lnum)
     {
-	if (!eap->skip && eap->addr_count > 0)
+	arg = startarg;
+	if (get_func_tv(name, (int)STRLEN(name), &rettv, &arg,
+		    eap->line1, eap->line2, &doesrange,
+					    !eap->skip, fudi.fd_dict) == FAIL)
+	{
+	    failed = TRUE;
+	    break;
+	}
+	if (!eap->skip && eap->addr_count > 0 && !(doesrange & FC_STAY))
 	{
 	    curwin->w_cursor.lnum = lnum;
 	    curwin->w_cursor.col = 0;
@@ -3461,14 +3470,6 @@
 	    curwin->w_cursor.coladd = 0;
 #endif
 	}
-	arg = startarg;
-	if (get_func_tv(name, (int)STRLEN(name), &rettv, &arg,
-		    eap->line1, eap->line2, &doesrange,
-					    !eap->skip, fudi.fd_dict) == FAIL)
-	{
-	    failed = TRUE;
-	    break;
-	}
 
 	/* Handle a function returning a Funcref, Dictionary or List. */
 	if (handle_subscript(&arg, &rettv, !eap->skip, TRUE) == FAIL)
@@ -8422,7 +8423,7 @@
     else
 	fname = name;
 
-    *doesrange = FALSE;
+    *doesrange = 0;
 
 
     /* execute the function if no errors detected and executing */
@@ -8460,7 +8461,7 @@
 	    if (fp != NULL)
 	    {
 		if (fp->uf_flags & FC_RANGE)
-		    *doesrange = TRUE;
+		    *doesrange = fp->uf_flags & (FC_STAY | FC_RANGE);
 		if (argcount < fp->uf_args.ga_len)
 		    error = ERROR_TOOFEW;
 		else if (!fp->uf_varargs && argcount > fp->uf_args.ga_len)
@@ -21145,6 +21146,11 @@
 	    flags |= FC_RANGE;
 	    p += 5;
 	}
+	else if (STRNCMP(p, "stay", 4) == 0)
+	{
+	    flags |= FC_STAY;
+	    p += 4;
+	}
 	else if (STRNCMP(p, "dict", 4) == 0)
 	{
 	    flags |= FC_DICT;
