updated for version 7.0106
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index 449fd99..8e65ef6 100644
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 7.0aa.  Last change: 2005 Jul 08
+*todo.txt*      For Vim version 7.0aa.  Last change: 2005 Jul 09
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -30,6 +30,11 @@
 							*known-bugs*
 -------------------- Known bugs and current work -----------------------
 
+9   Editing a XML file with a long line is extremely slow.  Example file from
+    Randy Parker (Dec 13).  Editing the dictionaries for engspchk plugin with
+    syntax highlighting is also very slow.
+    Limit the searching for items to a few hundred characters?
+
 Add extra list of file locations.  Can be used with:
     :ltag	      list of matching tags, like :tselect
 
@@ -862,10 +867,6 @@
     Alternate one: http://www.pramodx.20m.com/tee_for_win32.htm, but Walter
     Briscoe says it's not as good.
 8   'fillchars' doesn't work for multi-byte characters.
-9   Editing a XML file with a long line is extremely slow.  Example file from
-    Randy Parker (Dec 13).  Editing the dictionaries for engspchk plugin with
-    syntax highlighting is also very slow.
-    Limit the searching for items to a few hundred characters?
 8   Command line completion: buffers "foo.txt" and "../b/foo.txt", completing
     ":buf foo<Tab>" doesn't find the second one. (George V. Reilly)
 7   Output for ":scriptnames" and ":breaklist" should shorten the file names:
@@ -2339,6 +2340,11 @@
 8   Wrong indent below ? : with ():
 	if ((a ? (b) : c) != 0)
 		       aligns with ":".
+8   Using "+" part of 'cinoptions' where it's not expected (Alexei Alexandrov):
+	if (a)
+	{
+	} else
+			asdf;
 8   Wrong indent for ":" after a method with line break in arguments:
 	Foo::Foo (int one,
 		    int two)
diff --git a/runtime/doc/version7.txt b/runtime/doc/version7.txt
index f6d4965..10a561f 100644
--- a/runtime/doc/version7.txt
+++ b/runtime/doc/version7.txt
@@ -1,4 +1,4 @@
-*version7.txt*  For Vim version 7.0aa.  Last change: 2005 Jul 08
+*version7.txt*  For Vim version 7.0aa.  Last change: 2005 Jul 09
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -678,6 +678,14 @@
 A ! can be added to ":popup" to have the popup menu appear at the mouse
 pointer position instead of the text cursor.
 
+The table with encodings has been expanded with many MS-Windows codepages,
+such as cp1250 and cp737, so that these can also be used on Unix without
+prepending "8bit-".
+
+Added the "customlist" completion argument to a user-defined command.  The
+user-defined completion function should return the completion candidates as a
+Vim List and the returned results are not filtered by Vim.
+
 ==============================================================================
 COMPILE TIME CHANGES					*compile-changes-7*
 
diff --git a/src/edit.c b/src/edit.c
index 25d4b58..7028dd3 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -2683,7 +2683,7 @@
     args[1] = base;
     args[2] = colbuf;
     args[3] = (char_u *)(preproc ? "1" : "0");
-    return call_vim_function(curbuf->b_p_cfu, 4, args, FALSE);
+    return (char_u *)call_func_retstr(curbuf->b_p_cfu, 4, args, FALSE);
 }
 
 /*
diff --git a/src/eval.c b/src/eval.c
index c176226..2b6703a 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -1272,28 +1272,29 @@
 
 #if (defined(FEAT_USR_CMDS) && defined(FEAT_CMDL_COMPL)) || defined(PROTO)
 /*
- * Call some vimL function and return the result as a string
+ * Call some vimL function and return the result in "*rettv".
  * Uses argv[argc] for the function arguments.
+ * Returns OK or FAIL.
  */
-    char_u *
-call_vim_function(func, argc, argv, safe)
+    static int
+call_vim_function(func, argc, argv, safe, rettv)
     char_u      *func;
     int		argc;
     char_u      **argv;
     int		safe;		/* use the sandbox */
+    typval_T	*rettv;
 {
-    char_u	*retval = NULL;
-    typval_T	rettv;
     typval_T	*argvars;
     long	n;
     int		len;
     int		i;
     int		doesrange;
     void	*save_funccalp = NULL;
+    int		ret;
 
     argvars = (typval_T *)alloc((unsigned)(argc * sizeof(typval_T)));
     if (argvars == NULL)
-	return NULL;
+	return FAIL;
 
     for (i = 0; i < argc; i++)
     {
@@ -1325,22 +1326,72 @@
 	++sandbox;
     }
 
-    rettv.v_type = VAR_UNKNOWN;		/* clear_tv() uses this */
-    if (call_func(func, (int)STRLEN(func), &rettv, argc, argvars,
+    rettv->v_type = VAR_UNKNOWN;		/* clear_tv() uses this */
+    ret = call_func(func, (int)STRLEN(func), rettv, argc, argvars,
 		    curwin->w_cursor.lnum, curwin->w_cursor.lnum,
-		    &doesrange, TRUE, NULL) == OK)
-	retval = vim_strsave(get_tv_string(&rettv));
-
-    clear_tv(&rettv);
-    vim_free(argvars);
-
+		    &doesrange, TRUE, NULL);
     if (safe)
     {
 	--sandbox;
 	restore_funccal(save_funccalp);
     }
+    vim_free(argvars);
+
+    if (ret == FAIL)
+	clear_tv(rettv);
+
+    return ret;
+}
+
+/*
+ * Call some vimL function and return the result as a string
+ * Uses argv[argc] for the function arguments.
+ */
+    void *
+call_func_retstr(func, argc, argv, safe)
+    char_u      *func;
+    int		argc;
+    char_u      **argv;
+    int		safe;		/* use the sandbox */
+{
+    typval_T	rettv;
+    char_u	*retval = NULL;
+
+    if (call_vim_function(func, argc, argv, safe, &rettv) == FAIL)
+	return NULL;
+
+    retval = vim_strsave(get_tv_string(&rettv));
+
+    clear_tv(&rettv);
+
     return retval;
 }
+
+/*
+ * Call some vimL function and return the result as a list
+ * Uses argv[argc] for the function arguments.
+ */
+    void *
+call_func_retlist(func, argc, argv, safe)
+    char_u      *func;
+    int		argc;
+    char_u      **argv;
+    int		safe;		/* use the sandbox */
+{
+    typval_T	rettv;
+
+    if (call_vim_function(func, argc, argv, safe, &rettv) == FAIL)
+	return NULL;
+
+    if (rettv.v_type != VAR_LIST)
+    {
+	clear_tv(&rettv);
+	return NULL;
+    }
+
+    return rettv.vval.v_list;
+}
+
 #endif
 
 /*
@@ -1640,7 +1691,7 @@
     {
 	/* "[var, var]": find the matching ']'. */
 	p = arg;
-	while (1)
+	for (;;)
 	{
 	    p = skipwhite(p + 1);	/* skip whites after '[', ';' or ',' */
 	    s = skip_var_one(p);
@@ -11315,7 +11366,7 @@
     {
 	regmatch.rm_ic = p_ic;
 
-	while (1)
+	for (;;)
 	{
 	    if (l != NULL)
 	    {
@@ -11472,7 +11523,7 @@
 	    if (li != NULL)
 	    {
 		n = get_tv_number_chk(&li->li_tv, &error);
-		while (1)
+		for (;;)
 		{
 		    li = li->li_next;
 		    if (li == NULL)
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 1b99caf..9ce1fdd 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -3562,7 +3562,7 @@
     if (curbuf->b_p_iminsert == B_IMODE_LMAP)
 	State |= LANGMAP;
 
-    while (1)
+    for (;;)
     {
 	msg_scroll = TRUE;
 	need_wait_return = FALSE;
diff --git a/src/misc1.c b/src/misc1.c
index fcc8726..9154b96 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -5158,7 +5158,7 @@
     linenr_T	lnum = *lnump;
     int		retval = FALSE;
 
-    while (1)
+    for (;;)
     {
 	if (cin_ispreproc(line))
 	{
diff --git a/src/search.c b/src/search.c
index 20745d9..034d9c4 100644
--- a/src/search.c
+++ b/src/search.c
@@ -3745,7 +3745,7 @@
 {
     int		c;
 
-    while (1)
+    for (;;)
     {
 	c = line[col];
 	if (c == NUL)
@@ -3886,7 +3886,7 @@
 	 * Also do this when there is a Visual area, a' may leave the cursor
 	 * in between two strings. */
 	col_start = 0;
-	while (1)
+	for (;;)
 	{
 	    /* Find open quote character. */
 	    col_start = find_next_quote(line, col_start, quotechar, NULL);