summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2006-03-16 21:43:34 +0000
committerBram Moolenaar <Bram@vim.org>2006-03-16 21:43:34 +0000
commit2eb25daffd66cc323c039b624af8f4630f2fbf8f (patch)
tree8aed8c70bbad657d17b3447893892454831f34ee
parentefd2bf158afeb2337dcb5a62c6198d6d2fb7cd5f (diff)
updated for version 7.0226
-rw-r--r--src/edit.c39
-rw-r--r--src/ops.c3
-rw-r--r--src/option.h3
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;
diff --git a/src/ops.c b/src/ops.c
index 82a7595580..fce995fd08 100644
--- 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
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' */