]> granicus.if.org Git - vim/commitdiff
updated for version 7.0226
authorBram Moolenaar <Bram@vim.org>
Thu, 16 Mar 2006 21:43:34 +0000 (21:43 +0000)
committerBram Moolenaar <Bram@vim.org>
Thu, 16 Mar 2006 21:43:34 +0000 (21:43 +0000)
src/edit.c
src/ops.c
src/option.h

index b24c514fce13e485cd5f74f76e94ca4c9fa2ebf6..e8396d1398403312eeadc421948ab252bfc9c3d3 100644 (file)
@@ -6044,7 +6044,7 @@ beginline(flags)
  * oneright oneleft cursor_down cursor_up
  *
  * Move one char {right,left,down,up}.
- * Doesn't move onto the NUL past the end of the line.
+ * Doesn't move onto the NUL past the end of the line, unless it is allowed.
  * Return OK when successful, FAIL when we hit a line of file boundary.
  */
 
@@ -6052,9 +6052,7 @@ beginline(flags)
 oneright()
 {
     char_u     *ptr;
-#ifdef FEAT_MBYTE
     int                l;
-#endif
 
 #ifdef FEAT_VIRTUALEDIT
     if (virtual_active())
@@ -6064,11 +6062,11 @@ oneright()
        /* Adjust for multi-wide char (excluding TAB) */
        ptr = ml_get_cursor();
        coladvance(getviscol() + ((*ptr != TAB && vim_isprintc(
-#ifdef FEAT_MBYTE
+# ifdef FEAT_MBYTE
                            (*mb_ptr2char)(ptr)
-#else
+# else
                            *ptr
-#endif
+# endif
                            ))
                    ? ptr2cells(ptr) : 1));
        curwin->w_set_curswant = TRUE;
@@ -6079,22 +6077,25 @@ oneright()
 #endif
 
     ptr = ml_get_cursor();
+    if (*ptr == NUL)
+       return FAIL;        /* already at the very end */
+
 #ifdef FEAT_MBYTE
-    if (has_mbyte && (l = (*mb_ptr2len)(ptr)) > 1)
-    {
-       /* The character under the cursor is a multi-byte character, move
-        * several bytes right, but don't end up on the NUL. */
-       if (ptr[l] == NUL)
-           return FAIL;
-       curwin->w_cursor.col += l;
-    }
+    if (has_mbyte)
+       l = (*mb_ptr2len)(ptr);
     else
 #endif
-    {
-       if (*ptr++ == NUL || *ptr == NUL)
-           return FAIL;
-       ++curwin->w_cursor.col;
-    }
+       l = 1;
+
+    /* move "l" bytes right, but don't end up on the NUL, unless 'virtualedit'
+     * contains "onemore". */
+    if (ptr[l] == NUL
+#ifdef FEAT_VIRTUALEDIT
+           && (ve_flags & VE_ONEMORE) == 0
+#endif
+           )
+       return FAIL;
+    curwin->w_cursor.col += l;
 
     curwin->w_set_curswant = TRUE;
     return OK;
index 82a7595580f30b904f02fca8ea3afd55d706be5b..fce995fd08f8d24a7ec223bb2f35ae010762ef73 100644 (file)
--- a/src/ops.c
+++ b/src/ops.c
@@ -3733,6 +3733,9 @@ end:
     /* If the cursor is past the end of the line put it at the end. */
     if (gchar_cursor() == NUL
            && curwin->w_cursor.col > 0
+#ifdef FEAT_VIRTUALEDIT
+           && (ve_flags & VE_ONEMORE) == 0
+#endif
            && !(restart_edit || (State & INSERT)))
     {
        /* Put the cursor on the last character in the line. */
index 794e83b97287b7eb2ddfb8699ea3dddd4cf19b44..b4782abb21db359df642e742b60fba61c74c41f9 100644 (file)
@@ -813,11 +813,12 @@ EXTERN int        p_vb;           /* 'visualbell' */
 EXTERN char_u  *p_ve;          /* 'virtualedit' */
 EXTERN unsigned ve_flags;
 # ifdef IN_OPTION_C
-static char *(p_ve_values[]) = {"block", "insert", "all", NULL};
+static char *(p_ve_values[]) = {"block", "insert", "all", "onemore", NULL};
 # endif
 # define VE_BLOCK      5       /* includes "all" */
 # define VE_INSERT     6       /* includes "all" */
 # define VE_ALL                4
+# define VE_ONEMORE    8
 #endif
 EXTERN long    p_verbose;      /* 'verbose' */
 EXTERN char_u  *p_vfile;       /* 'verbosefile' */