diff src/edit.c @ 477:f8b75b8f1988

updated for version 7.0128
author vimboss
date Thu, 11 Aug 2005 20:09:58 +0000
parents a5fcf36ef512
children f012c4ed8c38
line wrap: on
line diff
--- a/src/edit.c
+++ b/src/edit.c
@@ -32,14 +32,15 @@
 #define CTRL_X_CMDLINE		11
 #define CTRL_X_FUNCTION		12
 #define CTRL_X_OCCULT		13
-#define CTRL_X_LOCAL_MSG	14	/* only used in "ctrl_x_msgs" */
+#define CTRL_X_SPELL		14
+#define CTRL_X_LOCAL_MSG	15	/* only used in "ctrl_x_msgs" */
 
 #define CTRL_X_MSG(i) ctrl_x_msgs[(i) & ~CTRL_X_WANT_IDENT]
 
 static char *ctrl_x_msgs[] =
 {
     N_(" Keyword completion (^N^P)"), /* ctrl_x_mode == 0, ^P/^N compl. */
-    N_(" ^X mode (^E^Y^L^]^F^I^K^D^U^V^N^P)"),
+    N_(" ^X mode (^]^D^E^F^I^K^L^N^O^P^S^U^V^Y)"),
     NULL,
     N_(" Whole line completion (^L^N^P)"),
     N_(" File name completion (^F^N^P)"),
@@ -52,6 +53,7 @@ static char *ctrl_x_msgs[] =
     N_(" Command-line completion (^V^N^P)"),
     N_(" User defined completion (^U^N^P)"),
     N_(" Occult completion (^O^N^P)"),
+    N_(" Spelling suggestion (^S^N^P)"),
     N_(" Keyword Local completion (^N^P)"),
 };
 
@@ -152,7 +154,7 @@ static int cindent_on __ARGS((void));
 static void ins_reg __ARGS((void));
 static void ins_ctrl_g __ARGS((void));
 static void ins_ctrl_hat __ARGS((void));
-static int  ins_esc __ARGS((long *count, int cmdchar, int c));
+static int  ins_esc __ARGS((long *count, int cmdchar, int nomove));
 #ifdef FEAT_RIGHTLEFT
 static void ins_ctrl_ __ARGS((void));
 #endif
@@ -266,6 +268,7 @@ edit(cmdchar, startln, count)
     int		inserted_space = FALSE;     /* just inserted a space */
     int		replaceState = REPLACE;
     int		did_restart_edit = restart_edit;
+    int		nomove = FALSE;		    /* don't move cursor on return */
 
     /* sleep before redrawing, needed for "CTRL-O :" that results in an
      * error message */
@@ -658,8 +661,9 @@ edit(cmdchar, startln, count)
 	    ins_compl_prep(c);
 #endif
 
-	/* CTRL-\ CTRL-N goes to Normal mode, CTRL-\ CTRL-G goes to mode
-	 * selected with 'insertmode'.  */
+	/* CTRL-\ CTRL-N goes to Normal mode,
+	 * CTRL-\ CTRL-G goes to mode selected with 'insertmode',
+	 * CTRL-\ CTRL-O is like CTRL-O but without moving the cursor.  */
 	if (c == Ctrl_BSL)
 	{
 	    /* may need to redraw when no more chars available now */
@@ -669,8 +673,9 @@ edit(cmdchar, startln, count)
 	    c = safe_vgetc();
 	    --no_mapping;
 	    --allow_keys;
-	    if (c != Ctrl_N && c != Ctrl_G)	/* it's something else */
+	    if (c != Ctrl_N && c != Ctrl_G && c != Ctrl_O)
 	    {
+		/* it's something else */
 		vungetc(c);
 		c = Ctrl_BSL;
 	    }
@@ -678,6 +683,12 @@ edit(cmdchar, startln, count)
 		continue;
 	    else
 	    {
+		if (c == Ctrl_O)
+		{
+		    ins_ctrl_o();
+		    ins_at_eol = FALSE;	/* cursor keeps its column */
+		    nomove = TRUE;
+		}
 		count = 0;
 		goto doESCkey;
 	    }
@@ -787,7 +798,7 @@ doESCkey:
 	    if (ins_at_eol && gchar_cursor() == NUL)
 		o_lnum = curwin->w_cursor.lnum;
 
-	    if (ins_esc(&count, cmdchar, c))
+	    if (ins_esc(&count, cmdchar, nomove))
 	    {
 #ifdef FEAT_AUTOCMD
 		if (cmdchar != 'r' && cmdchar != 'v')
@@ -1117,6 +1128,12 @@ doESCkey:
 	    if (ctrl_x_mode != CTRL_X_FILES)
 		goto normalchar;
 	    goto docomplete;
+
+	case 's':	/* Spelling completion after ^X */
+	case Ctrl_S:
+	    if (ctrl_x_mode != CTRL_X_SPELL)
+		goto normalchar;
+	    goto docomplete;
 #endif
 
 	case Ctrl_L:	/* Whole line completion after ^X */
@@ -1799,7 +1816,8 @@ vim_is_ctrl_x_key(c)
 		    || c == Ctrl_L || c == Ctrl_F || c == Ctrl_RSB
 		    || c == Ctrl_I || c == Ctrl_D || c == Ctrl_P
 		    || c == Ctrl_N || c == Ctrl_T || c == Ctrl_V
-		    || c == Ctrl_Q || c == Ctrl_U || c == Ctrl_O);
+		    || c == Ctrl_Q || c == Ctrl_U || c == Ctrl_O
+		    || c == Ctrl_S || c == 's');
 	case CTRL_X_SCROLL:
 	    return (c == Ctrl_Y || c == Ctrl_E);
 	case CTRL_X_WHOLE_LINE:
@@ -1827,6 +1845,8 @@ vim_is_ctrl_x_key(c)
 #endif
 	case CTRL_X_OCCULT:
 	    return (c == Ctrl_O || c == Ctrl_P || c == Ctrl_N);
+	case CTRL_X_SPELL:
+	    return (c == Ctrl_S || c == Ctrl_P || c == Ctrl_N);
     }
     EMSG(_(e_internal));
     return FALSE;
@@ -2342,6 +2362,10 @@ ins_compl_prep(c)
 	    case Ctrl_O:
 		ctrl_x_mode = CTRL_X_OCCULT;
 		break;
+	    case 's':
+	    case Ctrl_S:
+		ctrl_x_mode = CTRL_X_SPELL;
+		break;
 	    case Ctrl_RSB:
 		ctrl_x_mode = CTRL_X_TAGS;
 		break;
@@ -2855,6 +2879,15 @@ ins_compl_get_exp(ini, dir)
 		ins_compl_add_matches(num_matches, matches, dir);
 	    break;
 
+	case CTRL_X_SPELL:
+#ifdef FEAT_SYN_HL
+	    num_matches = expand_spelling(first_match_pos.lnum,
+				 first_match_pos.col, compl_pattern, &matches);
+	    if (num_matches > 0)
+		ins_compl_add_matches(num_matches, matches, dir);
+#endif
+	    break;
+
 	default:	/* normal ^P/^N and ^X^L */
 	    /*
 	     * If 'infercase' is set, don't use 'smartcase' here
@@ -3496,6 +3529,18 @@ ins_complete(c)
 	    if (compl_pattern == NULL)
 		return FAIL;
 	}
+	else if (ctrl_x_mode == CTRL_X_SPELL)
+	{
+#ifdef FEAT_SYN_HL
+	    compl_col = spell_word_start(startcol);
+	    if (compl_col == startcol)
+		return FAIL;
+	    compl_length = (int)curs_col - compl_col;
+	    compl_pattern = vim_strnsave(line + compl_col, compl_length);
+	    if (compl_pattern == NULL)
+#endif
+		return FAIL;
+	}
 	else
 	{
 	    EMSG2(_(e_intern2), "ins_complete()");
@@ -6272,10 +6317,10 @@ ins_ctrl_hat()
  * insert.
  */
     static int
-ins_esc(count, cmdchar, c)
+ins_esc(count, cmdchar, nomove)
     long	*count;
     int		cmdchar;
-    int		c;	    /* typed character */
+    int		nomove;	    /* don't move cursor */
 {
     int		temp;
     static int	disabled_redraw = FALSE;
@@ -6353,18 +6398,20 @@ ins_esc(count, cmdchar, c)
 
     /*
      * The cursor should end up on the last inserted character.
-     * Don't do it for CTRL-O or CTRL-L.
+     * Don't do it for CTRL-O, unless past the end of the line.
      */
-    if ((curwin->w_cursor.col != 0
+    if (!nomove
+	    && (curwin->w_cursor.col != 0
 #ifdef FEAT_VIRTUALEDIT
 		|| curwin->w_cursor.coladd > 0
 #endif
-	) && ((restart_edit == NUL && c != Ctrl_L)
-		|| (gchar_cursor() == NUL
+	       )
+	    && (restart_edit == NUL
+		   || (gchar_cursor() == NUL
 #ifdef FEAT_VISUAL
-		    && !VIsual_active
-#endif
-		    ))
+		       && !VIsual_active
+#endif
+		      ))
 #ifdef FEAT_RIGHTLEFT
 	    && !revins_on
 #endif