diff src/screen.c @ 386:607d3cd9364f

updated for version 7.0100
author vimboss
date Sat, 02 Jul 2005 23:19:16 +0000
parents 6b49757d378c
children 169f2a51b527
line wrap: on
line diff
--- a/src/screen.c
+++ b/src/screen.c
@@ -2512,6 +2512,8 @@ win_line(wp, lnum, startrow, endrow)
     static linenr_T  checked_lnum = 0;	/* line number for "checked_col" */
     static int	checked_col = 0;	/* column in "checked_lnum" up to which
 					 * there are no spell errors */
+    static int	cap_col = -1;		/* column to check for Cap word */
+    static linenr_T capcol_lnum = 0;	/* line number where "cap_col" used */
     int		cur_checked_col = 0;	/* checked column for current line */
 #endif
     int		extra_check;		/* has syntax or linebreak */
@@ -2634,6 +2636,15 @@ win_line(wp, lnum, startrow, endrow)
 	if (lnum == checked_lnum)
 	    cur_checked_col = checked_col;
 	checked_lnum = 0;
+
+	/* When there was a sentence end in the previous line may require a
+	 * word starting with capital in this line.  In line 1 always check
+	 * the first word. */
+	if (lnum != capcol_lnum)
+	    cap_col = -1;
+	if (lnum == 1)
+	    cap_col = 0;
+	capcol_lnum = 0;
     }
 #endif
 
@@ -2802,6 +2813,10 @@ win_line(wp, lnum, startrow, endrow)
 #ifdef FEAT_SYN_HL
     if (has_spell)
     {
+	/* For checking first word with a capital skip white space. */
+	if (cap_col == 0)
+	    cap_col = skipwhite(line) - line;
+
 	/* To be able to spell-check over line boundaries copy the end of the
 	 * current line into nextline[].  Above the start of the next line was
 	 * copied to nextline[SPWORDLEN]. */
@@ -3673,7 +3688,8 @@ win_line(wp, lnum, startrow, endrow)
 			    p = nextline + (prev_ptr - line) - nextlinecol;
 			else
 			    p = prev_ptr;
-			len = spell_check(wp, p, &spell_attr);
+			cap_col -= (prev_ptr - line);
+			len = spell_check(wp, p, &spell_attr, &cap_col);
 			word_end = v + len;
 
 			/* In Insert mode only highlight a word that
@@ -3697,6 +3713,22 @@ win_line(wp, lnum, startrow, endrow)
 			    checked_lnum = lnum + 1;
 			    checked_col = (p - nextline) + len - nextline_idx;
 			}
+
+			if (cap_col > 0)
+			{
+			    if (p != prev_ptr
+				   && (p - nextline) + cap_col >= nextline_idx)
+			    {
+				/* Remember that the word in the next line
+				 * must start with a capital. */
+				capcol_lnum = lnum + 1;
+				cap_col = (p - nextline) + cap_col
+							       - nextline_idx;
+			    }
+			    else
+				/* Compute the actual column. */
+				cap_col += (prev_ptr - line);
+			}
 		    }
 		}
 		if (spell_attr != 0)
@@ -4367,6 +4399,15 @@ win_line(wp, lnum, startrow, endrow)
 
     }	/* for every character in the line */
 
+#ifdef FEAT_SYN_HL
+    /* After an empty line check first word for capital. */
+    if (*skipwhite(line) == NUL)
+    {
+	capcol_lnum = lnum + 1;
+	cap_col = 0;
+    }
+#endif
+
     return row;
 }