# HG changeset patch # User vimboss # Date 1142545414 0 # Node ID 8c9ef63b1ccc67b385faa6a03eb57a1ae0780036 # Parent aaaca507725538508158af11e35b7d63681bc9aa updated for version 7.0226 diff --git a/src/edit.c b/src/edit.c --- a/src/edit.c +++ b/src/edit.c @@ -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; diff --git a/src/ops.c b/src/ops.c --- 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. */ diff --git a/src/option.h b/src/option.h --- a/src/option.h +++ b/src/option.h @@ -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' */