diff src/edit.c @ 836:5a7843c57316 v7.0e02

updated for version 7.0e02
author vimboss
date Tue, 18 Apr 2006 21:55:01 +0000
parents 8bebcabccc2c
children 2c885fab04e3
line wrap: on
line diff
--- a/src/edit.c
+++ b/src/edit.c
@@ -709,15 +709,20 @@ edit(cmdchar, startln, count)
 	{
 	    /* BS: Delete one character from "compl_leader". */
 	    if ((c == K_BS || c == Ctrl_H)
-			&& curwin->w_cursor.col > compl_col && ins_compl_bs())
+			&& curwin->w_cursor.col > compl_col
+			&& (c = ins_compl_bs()) == NUL)
 		continue;
 
 	    /* When no match was selected or it was edited. */
 	    if (!compl_used_match)
 	    {
 		/* CTRL-L: Add one character from the current match to
-		 * "compl_leader". */
-		if (c == Ctrl_L)
+		 * "compl_leader".  Except when at the original match and
+		 * there is nothing to add, CTRL-L works like CTRL-P then. */
+		if (c == Ctrl_L
+			&& (ctrl_x_mode != CTRL_X_WHOLE_LINE
+			    || STRLEN(compl_shown_match->cp_str)
+					  > curwin->w_cursor.col - compl_col))
 		{
 		    ins_compl_addfrommatch();
 		    continue;
@@ -2943,7 +2948,8 @@ ins_compl_active()
 /*
  * Delete one character before the cursor and show the subset of the matches
  * that match the word that is now before the cursor.
- * Returns TRUE if the work is done and another char to be got from the user.
+ * Returns the character to be used, NUL if the work is done and another char
+ * to be got from the user.
  */
     static int
 ins_compl_bs()
@@ -2951,6 +2957,14 @@ ins_compl_bs()
     char_u	*line;
     char_u	*p;
 
+    line = ml_get_curline();
+    p = line + curwin->w_cursor.col;
+    mb_ptr_back(line, p);
+
+    /* Stop completion when the whole word was deleted. */
+    if ((int)(p - line) - (int)compl_col <= 0)
+	return K_BS;
+
     if (curwin->w_cursor.col <= compl_col + compl_length)
     {
 	/* Deleted more than what was used to find matches, need to look for
@@ -2962,10 +2976,6 @@ ins_compl_bs()
 	compl_cont_mode = 0;
     }
 
-    line = ml_get_curline();
-    p = line + curwin->w_cursor.col;
-    mb_ptr_back(line, p);
-
     vim_free(compl_leader);
     compl_leader = vim_strnsave(line + compl_col, (int)(p - line) - compl_col);
     if (compl_leader != NULL)
@@ -3006,9 +3016,9 @@ ins_compl_bs()
 	compl_used_match = FALSE;
 	compl_enter_selects = FALSE;
 
-	return TRUE;
-    }
-    return FALSE;
+	return NUL;
+    }
+    return K_BS;
 }
 
 /*
@@ -3255,26 +3265,34 @@ ins_compl_prep(c)
 	    /* Get here when we have finished typing a sequence of ^N and
 	     * ^P or other completion characters in CTRL-X mode.  Free up
 	     * memory that was used, and make sure we can redo the insert. */
-	    if (compl_curr_match != NULL)
+	    if (compl_curr_match != NULL || compl_leader != NULL || c == Ctrl_E)
 	    {
 		char_u	*p;
 
 		/*
-		 * If any of the original typed text has been changed,
-		 * eg when ignorecase is set, we must add back-spaces to
-		 * the redo buffer.  We add as few as necessary to delete
-		 * just the part of the original text that has changed.
+		 * If any of the original typed text has been changed, eg when
+		 * ignorecase is set, we must add back-spaces to the redo
+		 * buffer.  We add as few as necessary to delete just the part
+		 * of the original text that has changed.
+		 * When using the longest match, edited the match or used
+		 * CTRL-E then don't use the current match.
 		 */
-		ptr = compl_curr_match->cp_str;
+		if (compl_curr_match != NULL && compl_used_match && c != Ctrl_E)
+		    ptr = compl_curr_match->cp_str;
+		else if (compl_leader != NULL)
+		    ptr = compl_leader;
+		else
+		    ptr = compl_orig_text;
 		p = compl_orig_text;
-		while (*p && *p == *ptr)
-		{
-		    ++p;
-		    ++ptr;
-		}
-		for (temp = 0; p[temp]; ++temp)
+		for (temp = 0; p[temp] != NUL && p[temp] == ptr[temp]; ++temp)
+		    ;
+#ifdef FEAT_MBYTE
+		if (temp > 0)
+		    temp -= (*mb_head_off)(compl_orig_text, p + temp);
+#endif
+		for (p += temp; *p != NUL; mb_ptr_adv(p))
 		    AppendCharToRedobuff(K_BS);
-		AppendToRedobuffLit(ptr, -1);
+		AppendToRedobuffLit(ptr + temp, -1);
 	    }
 
 #ifdef FEAT_CINDENT
@@ -3981,6 +3999,7 @@ ins_compl_next(allow_get_expansion, coun
     int	    todo = count;
     compl_T *found_compl = NULL;
     int	    found_end = FALSE;
+    int	    advance;
 
     if (compl_leader != NULL
 			&& (compl_shown_match->cp_flags & ORIGINAL_TEXT) == 0)
@@ -3999,6 +4018,10 @@ ins_compl_next(allow_get_expansion, coun
 	/* Delete old text to be replaced */
 	ins_compl_delete();
 
+    /* When finding the longest common text we stick at the original text,
+     * don't let CTRL-N or CTRL-P move to the first match. */
+    advance = count != 1 || !allow_get_expansion || !compl_get_longest;
+
     /* Repeat this for when <PageUp> or <PageDown> is typed.  But don't wrap
      * around. */
     while (--todo >= 0)
@@ -4023,15 +4046,19 @@ ins_compl_next(allow_get_expansion, coun
 	}
 	else
 	{
-	    if (compl_shows_dir == BACKWARD)
-		--compl_pending;
-	    else
-		++compl_pending;
+	    if (advance)
+	    {
+		if (compl_shows_dir == BACKWARD)
+		    --compl_pending;
+		else
+		    ++compl_pending;
+	    }
 	    if (!allow_get_expansion)
 		return -1;
 
 	    num_matches = ins_compl_get_exp(&compl_startpos);
-	    if (compl_pending != 0 && compl_direction == compl_shows_dir)
+	    if (compl_pending != 0 && compl_direction == compl_shows_dir
+								   && advance)
 		compl_shown_match = compl_curr_match;
 	    found_end = FALSE;
 	}