diff options
author | Bram Moolenaar <Bram@vim.org> | 2006-03-16 21:43:34 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2006-03-16 21:43:34 +0000 |
commit | 2eb25daffd66cc323c039b624af8f4630f2fbf8f (patch) | |
tree | 8aed8c70bbad657d17b3447893892454831f34ee | |
parent | efd2bf158afeb2337dcb5a62c6198d6d2fb7cd5f (diff) |
updated for version 7.0226
-rw-r--r-- | src/edit.c | 39 | ||||
-rw-r--r-- | src/ops.c | 3 | ||||
-rw-r--r-- | src/option.h | 3 |
3 files changed, 25 insertions, 20 deletions
diff --git a/src/edit.c b/src/edit.c index b24c514fce..e8396d1398 100644 --- 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; @@ -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 index 794e83b972..b4782abb21 100644 --- 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' */ |