updated for version 7.0177
diff --git a/src/edit.c b/src/edit.c
index c21c7e3..23dd57e 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -2657,7 +2657,7 @@
 		}
 		for (temp = 0; p[temp]; ++temp)
 		    AppendCharToRedobuff(K_BS);
-		AppendToRedobuffLit(ptr);
+		AppendToRedobuffLit(ptr, -1);
 	    }
 
 #ifdef FEAT_CINDENT
@@ -4240,7 +4240,7 @@
 		return;
 	    p[len - 1] = NUL;
 	    ins_str(p);
-	    AppendToRedobuffLit(p);
+	    AppendToRedobuffLit(p, -1);
 	    ctrlv = FALSE;
 	}
     }
@@ -4756,7 +4756,7 @@
 	else
 	    i = 0;
 	if (buf[i] != NUL)
-	    AppendToRedobuffLit(buf + i);
+	    AppendToRedobuffLit(buf + i, -1);
     }
     else
     {
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 1d8348d..006733c 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -921,7 +921,7 @@
 
     if (bangredo)	    /* put cmd in redo buffer for ! command */
     {
-	AppendToRedobuffLit(prevcmd);
+	AppendToRedobuffLit(prevcmd, -1);
 	AppendToRedobuff((char_u *)"\n");
 	bangredo = FALSE;
     }
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 3e001a2..a49dfce 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -2826,11 +2826,7 @@
 		if (k == len && found && *np != NUL)
 		{
 		    if (gap == &ucmds)
-		    {
-			if (xp != NULL)
-			    xp->xp_context = EXPAND_UNSUCCESSFUL;
 			return NULL;
-		    }
 		    amb_local = TRUE;
 		}
 
@@ -3091,6 +3087,8 @@
 		    NULL
 # endif
 		    );
+	    if (p == NULL)
+		ea.cmdidx = CMD_SIZE;	/* ambiguous user command */
 	}
 #endif
     }
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 508c563..335f2a4 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -2765,9 +2765,17 @@
     regname = may_get_selection(regname);
 #endif
 
-    /* Need to save and restore ccline. */
+    /* Need to save and restore ccline.  And go into the sandbox to avoid
+     * nasty things like going to another buffer when evaluating an
+     * expression. */
     save_cmdline(&save_ccline);
+#ifdef HAVE_SANDBOX
+    ++sandbox;
+#endif
     i = get_spec_reg(regname, &arg, &allocated, TRUE);
+#ifdef HAVE_SANDBOX
+    --sandbox;
+#endif
     restore_cmdline(&save_ccline);
 
     if (i)
diff --git a/src/getchar.c b/src/getchar.c
index 69cebae..c1c9bca 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -529,16 +529,18 @@
  * K_SPECIAL and CSI are escaped as well.
  */
     void
-AppendToRedobuffLit(s)
-    char_u	*s;
+AppendToRedobuffLit(str, len)
+    char_u	*str;
+    int		len;	    /* length of "str" or -1 for up to the NUL */
 {
+    char_u	*s = str;
     int		c;
     char_u	*start;
 
     if (block_redo)
 	return;
 
-    while (*s != NUL)
+    while (len < 0 ? *s != NUL : s - str < len)
     {
 	/* Put a string of normal characters in the redo buffer (that's
 	 * faster). */
@@ -547,7 +549,7 @@
 #ifndef EBCDIC
 		&& *s < DEL	/* EBCDIC: all chars above space are normal */
 #endif
-		)
+		&& (len < 0 || s - str < len))
 	    ++s;
 
 	/* Don't put '0' or '^' as last character, just in case a CTRL-D is
@@ -557,29 +559,29 @@
 	if (s > start)
 	    add_buff(&redobuff, start, (long)(s - start));
 
-	if (*s != NUL)
-	{
-	    /* Handle a special or multibyte character. */
-#ifdef FEAT_MBYTE
-	    if (has_mbyte)
-		/* Handle composing chars separately. */
-		c = mb_cptr2char_adv(&s);
-	    else
-#endif
-		c = *s++;
-	    if (c < ' ' || c == DEL || (*s == NUL && (c == '0' || c == '^')))
-		add_char_buff(&redobuff, Ctrl_V);
+	if (*s == NUL || (len >= 0 && s - str >= len))
+	    break;
 
-	    /* CTRL-V '0' must be inserted as CTRL-V 048 (EBCDIC: xf0) */
-	    if (*s == NUL && c == '0')
-#ifdef EBCDIC
-		add_buff(&redobuff, (char_u *)"xf0", 3L);
-#else
-		add_buff(&redobuff, (char_u *)"048", 3L);
+	/* Handle a special or multibyte character. */
+#ifdef FEAT_MBYTE
+	if (has_mbyte)
+	    /* Handle composing chars separately. */
+	    c = mb_cptr2char_adv(&s);
+	else
 #endif
-	    else
-		add_char_buff(&redobuff, c);
-	}
+	    c = *s++;
+	if (c < ' ' || c == DEL || (*s == NUL && (c == '0' || c == '^')))
+	    add_char_buff(&redobuff, Ctrl_V);
+
+	/* CTRL-V '0' must be inserted as CTRL-V 048 (EBCDIC: xf0) */
+	if (*s == NUL && c == '0')
+#ifdef EBCDIC
+	    add_buff(&redobuff, (char_u *)"xf0", 3L);
+#else
+	    add_buff(&redobuff, (char_u *)"048", 3L);
+#endif
+	else
+	    add_char_buff(&redobuff, c);
     }
 }
 
diff --git a/src/keymap.h b/src/keymap.h
index 88855f1..0aa4474 100644
--- a/src/keymap.h
+++ b/src/keymap.h
@@ -247,6 +247,7 @@
 
     , KE_DROP		/* DnD data is available */
     , KE_CURSORHOLD	/* CursorHold event */
+    , KE_NOP		/* doesn't do something */
 };
 
 /*
@@ -422,6 +423,7 @@
 #define K_X2RELEASE     TERMCAP2KEY(KS_EXTRA, KE_X2RELEASE)
 
 #define K_IGNORE	TERMCAP2KEY(KS_EXTRA, KE_IGNORE)
+#define K_NOP		TERMCAP2KEY(KS_EXTRA, KE_NOP)
 
 #define K_SNIFF		TERMCAP2KEY(KS_EXTRA, KE_SNIFF)
 
diff --git a/src/main.c b/src/main.c
index 89bad4c..551e980 100644
--- a/src/main.c
+++ b/src/main.c
@@ -871,7 +871,7 @@
     /* If ":startinsert" command used, stuff a dummy command to be able to
      * call normal_cmd(), which will then start Insert mode. */
     if (restart_edit != 0)
-	stuffcharReadbuff(K_IGNORE);
+	stuffcharReadbuff(K_NOP);
 
 #ifdef FEAT_NETBEANS_INTG
     if (usingNetbeans)
diff --git a/src/misc2.c b/src/misc2.c
index e8845e2..c3f2b37 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -177,7 +177,7 @@
 #ifdef FEAT_VIRTUALEDIT
 	int width = W_WIDTH(curwin) - win_col_off(curwin);
 
-	if ((addspaces || finetune)
+	if (finetune
 		&& curwin->w_p_wrap
 # ifdef FEAT_VERTSPLIT
 		&& curwin->w_width != 0
@@ -188,10 +188,13 @@
 	    if (csize > 0)
 		csize--;
 
-	    if (wcol / width > (colnr_T)csize / width)
+	    if (wcol / width > (colnr_T)csize / width
+		    && ((State & INSERT) == 0 || (int)wcol > csize + 1))
 	    {
 		/* In case of line wrapping don't move the cursor beyond the
-		 * right screen edge. */
+		 * right screen edge.  In Insert mode allow going just beyond
+		 * the last character (like what happens when typing and
+		 * reaching the right window edge). */
 		wcol = (csize / width + 1) * width - 1;
 	    }
 	}
@@ -501,7 +504,7 @@
     {
 	/* Allow cursor past end-of-line in Insert mode, restarting Insert
 	 * mode or when in Visual mode and 'selection' isn't "old" */
-	if (State & INSERT || restart_edit
+	if ((State & INSERT) || restart_edit
 #ifdef FEAT_VISUAL
 		|| (VIsual_active && *p_sel != 'o')
 #endif
diff --git a/src/normal.c b/src/normal.c
index 80f0864..b0262b2 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -57,6 +57,7 @@
  * v_*(): functions called to handle Visual mode commands.
  */
 static void	nv_ignore __ARGS((cmdarg_T *cap));
+static void	nv_nop __ARGS((cmdarg_T *cap));
 static void	nv_error __ARGS((cmdarg_T *cap));
 static void	nv_help __ARGS((cmdarg_T *cap));
 static void	nv_addsub __ARGS((cmdarg_T *cap));
@@ -378,6 +379,7 @@
     {K_X2RELEASE, nv_mouse,	0,			0},
 #endif
     {K_IGNORE,	nv_ignore,	0,			0},
+    {K_NOP,	nv_nop,		0,			0},
     {K_INS,	nv_edit,	0,			0},
     {K_KINS,	nv_edit,	0,			0},
     {K_BS,	nv_ctrlh,	0,			0},
@@ -1415,7 +1417,7 @@
 		 * pattern to really repeat the same command.
 		 */
 		if (vim_strchr(p_cpo, CPO_REDO) == NULL)
-		    AppendToRedobuffLit(cap->searchbuf);
+		    AppendToRedobuffLit(cap->searchbuf, -1);
 		AppendToRedobuff(NL_STR);
 	    }
 	    else if (cap->cmdchar == ':')
@@ -1427,7 +1429,7 @@
 		    ResetRedobuff();
 		else
 		{
-		    AppendToRedobuffLit(repeat_cmdline);
+		    AppendToRedobuffLit(repeat_cmdline, -1);
 		    AppendToRedobuff(NL_STR);
 		    vim_free(repeat_cmdline);
 		    repeat_cmdline = NULL;
@@ -3928,7 +3930,6 @@
  * Used for CTRL-Q and CTRL-S to avoid problems with terminals that use
  * xon/xoff
  */
-/*ARGSUSED */
     static void
 nv_ignore(cap)
     cmdarg_T	*cap;
@@ -3937,6 +3938,17 @@
 }
 
 /*
+ * Command character that doesn't do anything, but unlike nv_ignore() does
+ * start edit().  Used for "startinsert" executed while starting up.
+ */
+/*ARGSUSED */
+    static void
+nv_nop(cap)
+    cmdarg_T	*cap;
+{
+}
+
+/*
  * Command character doesn't exist.
  */
     static void
@@ -6320,10 +6332,8 @@
 {
     cap->oap->motion_type = MCHAR;
     cap->oap->use_reg_one = TRUE;
-    if (cap->cmdchar == ')')
-	cap->oap->inclusive = FALSE;
-    else
-	cap->oap->inclusive = TRUE;
+    /* The motion used to be inclusive for "(", but that is not what Vi does. */
+    cap->oap->inclusive = FALSE;
     curwin->w_set_curswant = TRUE;
 
     if (findsent(cap->arg, cap->count1) == FAIL)
diff --git a/src/proto/getchar.pro b/src/proto/getchar.pro
index 2709989..e38f380 100644
--- a/src/proto/getchar.pro
+++ b/src/proto/getchar.pro
@@ -9,7 +9,7 @@
 void saveRedobuff __ARGS((void));
 void restoreRedobuff __ARGS((void));
 void AppendToRedobuff __ARGS((char_u *s));
-void AppendToRedobuffLit __ARGS((char_u *s));
+void AppendToRedobuffLit __ARGS((char_u *str, int len));
 void AppendCharToRedobuff __ARGS((int c));
 void AppendNumberToRedobuff __ARGS((long n));
 void stuffReadbuff __ARGS((char_u *s));
diff --git a/src/search.c b/src/search.c
index 5311141..5e370b8 100644
--- a/src/search.c
+++ b/src/search.c
@@ -2394,7 +2394,7 @@
 
 /*
  * findsent(dir, count) - Find the start of the next sentence in direction
- * 'dir' Sentences are supposed to end in ".", "!" or "?" followed by white
+ * "dir" Sentences are supposed to end in ".", "!" or "?" followed by white
  * space or a line break. Also stop at an empty line.
  * Return OK if the next sentence was found.
  */
diff --git a/src/spell.c b/src/spell.c
index 303ed58..d12a4bc 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -8594,7 +8594,8 @@
 	    /* For redo we use a change-word command. */
 	    ResetRedobuff();
 	    AppendToRedobuff((char_u *)"ciw");
-	    AppendToRedobuff(stp->st_word);
+	    AppendToRedobuffLit(p + c,
+		       STRLEN(stp->st_word) + sug.su_badlen - stp->st_orglen);
 	    AppendCharToRedobuff(ESC);
 	}
     }
diff --git a/src/term.c b/src/term.c
index a52e3fa..cc3c036 100644
--- a/src/term.c
+++ b/src/term.c
@@ -3256,6 +3256,8 @@
  * echoed.
  * Only do this after termcap mode has been started, otherwise the codes for
  * the cursor keys may be wrong.
+ * Only do this when 'esckeys' is on, otherwise the response causes trouble in
+ * Insert mode.
  * On Unix only do it when both output and input are a tty (avoid writing
  * request to terminal while reading from a file).
  * The result is caught in check_termcode().
@@ -3266,6 +3268,7 @@
     if (crv_status == CRV_GET
 	    && cur_tmode == TMODE_RAW
 	    && termcap_active
+	    && p_ek
 #ifdef UNIX
 	    && isatty(1)
 	    && isatty(read_cmd_fd)
diff --git a/src/testdir/test60.in b/src/testdir/test60.in
index 4435343..9899a94 100644
--- a/src/testdir/test60.in
+++ b/src/testdir/test60.in
@@ -47,6 +47,40 @@
     " Non-existing autocmd event
     let test_cases += [['##MySpecialCmd', 0]]
 
+    " Existing and working option (long form)
+    let test_cases += [['&textwidth', 1]]
+    " Existing and working option (short form)
+    let test_cases += [['&tw', 1]]
+    " Negative form of existing and working option (long form)
+    let test_cases += [['&nojoinspaces', 0]]
+    " Negative form of existing and working option (short form)
+    let test_cases += [['&nojs', 0]]
+    " Non-existing option
+    let test_cases += [['&myxyzoption', 0]]
+
+    " Existing and working option (long form)
+    let test_cases += [['+incsearch', 1]]
+    " Existing and working option (short form)
+    let test_cases += [['+is', 1]]
+    " Existing option that is hidden.
+    let test_cases += [['+autoprint', 0]]
+
+    " Existing environment variable
+    let $EDITOR_NAME = 'Vim Editor'
+    let test_cases += [['$EDITOR_NAME', 1]]
+    " Non-existing environment variable
+    let test_cases += [['$NON_ENV_VAR', 0]]
+
+    " Valid internal function
+    let test_cases += [['*bufnr', 1]]
+    " Non-existing internal function
+    let test_cases += [['*myxyzfunc', 0]]
+
+    " Valid user defined function
+    let test_cases += [['*TestExists', 1]]
+    " Non-existing user defined function
+    let test_cases += [['*MyxyzFunc', 0]]
+
     redir! > test.out
 
     for [test_case, result] in test_cases
@@ -54,6 +88,189 @@
         call RunTest(test_case, result)
     endfor
 
+    " Valid internal command (full match)
+    echo ':edit: 2'
+    if exists(':edit') == 2
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Valid internal command (partial match)
+    echo ':q: 1'
+    if exists(':q') == 1
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Non-existing internal command
+    echo ':invalidcmd: 0'
+    if !exists(':invalidcmd')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " User defined command (full match)
+    command! MyCmd :echo 'My command'
+    echo ':MyCmd: 2'
+    if exists(':MyCmd') == 2
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " User defined command (partial match)
+    command! MyOtherCmd :echo 'Another command'
+    echo ':My: 3'
+    if exists(':My') == 3
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Command modifier
+    echo ':rightbelow: 2'
+    if exists(':rightbelow') == 2
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Non-existing user defined command (full match)
+    delcommand MyCmd
+
+    echo ':MyCmd: 0'
+    if !exists(':MyCmd')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Non-existing user defined command (partial match)
+    delcommand MyOtherCmd
+
+    echo ':My: 0'
+    if !exists(':My')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Valid local variable
+    let local_var = 1
+    echo 'local_var: 1'
+    if exists('local_var')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Non-existing local variable
+    unlet local_var
+    echo 'local_var: 0'
+    if !exists('local_var')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Valid local list
+    let local_list = ["blue", "orange"]
+    echo 'local_list: 1'
+    if exists('local_list')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Non-existing local list
+    unlet local_list
+    echo 'local_list: 0'
+    if !exists('local_list')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Valid local dictionary
+    let local_dict = {"xcord":100, "ycord":2}
+    echo 'local_dict: 1'
+    if exists('local_dict')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Non-existing local dictionary
+    unlet local_dict
+    echo 'local_dict: 0'
+    if !exists('local_dict')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Existing global variable
+    let g:global_var = 1
+    echo 'g:global_var: 1'
+    if exists('g:global_var')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Non-existing global variable
+    unlet g:global_var
+    echo 'g:global_var: 0'
+    if !exists('g:global_var')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Existing local curly-brace variable
+    let curly_local_var = 1
+    let str = "local"
+    echo 'curly_{str}_var: 1'
+    if exists('curly_{str}_var')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Non-existing local curly-brace variable
+    unlet curly_local_var
+    echo 'curly_{str}_var: 0'
+    if !exists('curly_{str}_var')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Existing global curly-brace variable
+    let g:curly_global_var = 1
+    let str = "global"
+    echo 'g:curly_{str}_var: 1'
+    if exists('g:curly_{str}_var')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Non-existing global curly-brace variable
+    unlet g:curly_global_var
+    echo 'g:curly_{str}_var: 0'
+    if !exists('g:curly_{str}_var')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Script-local tests
+    source test60.vim
+
     redir END
 endfunction
 :call TestExists()
diff --git a/src/testdir/test60.ok b/src/testdir/test60.ok
index 0d1e3dc..fe6c4b7 100644
--- a/src/testdir/test60.ok
+++ b/src/testdir/test60.ok
@@ -29,3 +29,83 @@
 OK
 ##MySpecialCmd: 0
 OK
+&textwidth: 1
+OK
+&tw: 1
+OK
+&nojoinspaces: 0
+OK
+&nojs: 0
+OK
+&myxyzoption: 0
+OK
++incsearch: 1
+OK
++is: 1
+OK
++autoprint: 0
+OK
+$EDITOR_NAME: 1
+OK
+$NON_ENV_VAR: 0
+OK
+*bufnr: 1
+OK
+*myxyzfunc: 0
+OK
+*TestExists: 1
+OK
+*MyxyzFunc: 0
+OK
+:edit: 2
+OK
+:q: 1
+OK
+:invalidcmd: 0
+OK
+:MyCmd: 2
+OK
+:My: 3
+OK
+:rightbelow: 2
+OK
+:MyCmd: 0
+OK
+:My: 0
+OK
+local_var: 1
+OK
+local_var: 0
+OK
+local_list: 1
+OK
+local_list: 0
+OK
+local_dict: 1
+OK
+local_dict: 0
+OK
+g:global_var: 1
+OK
+g:global_var: 0
+OK
+curly_{str}_var: 1
+OK
+curly_{str}_var: 0
+OK
+g:curly_{str}_var: 1
+OK
+g:curly_{str}_var: 0
+OK
+s:script_var: 1
+OK
+s:script_var: 0
+OK
+s:curly_{str}_var: 1
+OK
+s:curly_{str}_var: 0
+OK
+*s:my_script_func: 1
+OK
+*s:my_script_func: 0
+OK
diff --git a/src/ui.c b/src/ui.c
index c48af4e..ba5911f 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -469,9 +469,9 @@
 #ifdef FEAT_X11
 	if (cbd == &clip_star)
 	{
-	    /* May have to show a different kind of highlighting for the selected
-	     * area.  There is no specific redraw command for this, just redraw
-	     * all windows on the current buffer. */
+	    /* May have to show a different kind of highlighting for the
+	     * selected area.  There is no specific redraw command for this,
+	     * just redraw all windows on the current buffer. */
 	    if (cbd->owned
 		    && get_real_state() == VISUAL
 		    && clip_isautosel()
@@ -2130,6 +2130,10 @@
 	{
 	    if (XCheckTypedEvent(dpy, SelectionNotify, &event))
 		break;
+	    if (XCheckTypedEvent(dpy, SelectionRequest, &event))
+		/* We may get a SelectionRequest here and if we don't handle
+		 * it we hang.  KDE klipper does this, for example. */
+		XtDispatchEvent(&event);
 
 	    /* Do we need this?  Probably not. */
 	    XSync(dpy, False);
diff --git a/src/version.h b/src/version.h
index 1402a48..3e0e393 100644
--- a/src/version.h
+++ b/src/version.h
@@ -36,5 +36,5 @@
 #define VIM_VERSION_NODOT	"vim70aa"
 #define VIM_VERSION_SHORT	"7.0aa"
 #define VIM_VERSION_MEDIUM	"7.0aa ALPHA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2005 Dec 23)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Dec 23, compiled "
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2005 Dec 28)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Dec 28, compiled "