Mercurial > vim
diff src/screen.c @ 221:7fd4b5df33be
updated for version 7.0062
author | vimboss |
---|---|
date | Sun, 20 Mar 2005 22:37:15 +0000 |
parents | da182deebec7 |
children | ef254e0f2365 |
line wrap: on
line diff
--- a/src/screen.c +++ b/src/screen.c @@ -2501,6 +2501,11 @@ win_line(wp, lnum, startrow, endrow) int syntax_attr = 0; /* attributes desired by syntax */ int has_syntax = FALSE; /* this buffer has syntax highl. */ int save_did_emsg; + int has_spell = FALSE; /* this buffer has spell checking */ + int spell_attr = 0; /* attributes desired by spelling */ + int word_end = 0; /* last byte with same spell_attr */ + int iswordc; /* prev. char was a word character */ + int prev_iswordc = FALSE; /* prev. char was a word character */ #endif int extra_check; /* has syntax or linebreak */ #ifdef FEAT_MBYTE @@ -2597,6 +2602,13 @@ win_line(wp, lnum, startrow, endrow) extra_check = TRUE; } } + + if (wp->w_p_spell && *wp->w_buffer->b_p_spl != NUL) + { + /* Prepare for spell checking. */ + has_spell = TRUE; + extra_check = TRUE; + } #endif /* @@ -3231,6 +3243,11 @@ win_line(wp, lnum, startrow, endrow) else char_attr = search_attr; +#ifdef FEAT_SYN_HL + if (spell_attr != 0) + char_attr = hl_combine_attr(char_attr, spell_attr); +#endif + #ifdef FEAT_DIFF if (diff_hlf != (enum hlf_value)0 && n_extra == 0) { @@ -3539,16 +3556,20 @@ win_line(wp, lnum, startrow, endrow) if (extra_check) { #ifdef FEAT_SYN_HL + int can_spell = TRUE; + /* Get syntax attribute, unless still at the start of the line * (double-wide char that doesn't fit). */ - if (has_syntax && (v = (long)(ptr - line)) > 0) + v = (long)(ptr - line); + if (has_syntax && v > 0) { /* Get the syntax attribute for the character. If there * is an error, disable syntax highlighting. */ save_did_emsg = did_emsg; did_emsg = FALSE; - syntax_attr = get_syntax_attr((colnr_T)v - 1); + syntax_attr = get_syntax_attr((colnr_T)v - 1, + has_spell ? &can_spell : NULL); if (did_emsg) syntax_clear(wp->w_buffer); @@ -3563,10 +3584,51 @@ win_line(wp, lnum, startrow, endrow) if (area_attr == 0 && search_attr == 0) char_attr = syntax_attr; } + + /* Check spelling at the start of a word. + * Only do this when there is no syntax highlighting, there is + * on @Spell cluster or the current syntax item contains the + * @Spell cluster. */ + if (has_spell && v >= word_end) + { + if (!has_syntax || can_spell) + { + char_u *prev_ptr = ptr - ( +# ifdef FEAT_MBYTE + has_mbyte ? mb_l : +# endif + 1); + + spell_attr = 0; + iswordc = vim_iswordc_buf(prev_ptr, wp->w_buffer); + if (iswordc && !prev_iswordc) + { + word_end = v + spell_check(wp, prev_ptr, + &spell_attr); + /* In Insert mode only highlight a word that + * doesn't touch the cursor. */ + if (spell_attr != 0 + && (State & INSERT) != 0 + && wp->w_cursor.lnum == lnum + && wp->w_cursor.col >= + (colnr_T)(prev_ptr - line) + && wp->w_cursor.col < (colnr_T)word_end) + { + spell_attr = 0; + spell_redraw_lnum = lnum; + } + } + prev_iswordc = iswordc; + } + else + spell_attr = 0; + } + if (spell_attr != 0) + char_attr = hl_combine_attr(char_attr, spell_attr); #endif #ifdef FEAT_LINEBREAK /* - * Found last space before word: check for line break + * Found last space before word: check for line break. */ if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr) && !wp->w_p_list)