0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

updated for version 7.1-040

This commit is contained in:
Bram Moolenaar
2007-07-26 20:58:42 +00:00
parent f621048b53
commit 6ee10162b2
14 changed files with 833 additions and 119 deletions

View File

@@ -100,27 +100,7 @@ static int screen_attr = 0;
static int screen_cur_row, screen_cur_col; /* last known cursor position */
#ifdef FEAT_SEARCH_EXTRA
/*
* Struct used for highlighting 'hlsearch' matches for the last use search
* pattern or a ":match" item.
* For 'hlsearch' there is one pattern for all windows. For ":match" there is
* a different pattern for each window.
*/
typedef struct
{
regmmatch_T rm; /* points to the regexp program; contains last found
match (may continue in next line) */
buf_T *buf; /* the buffer to search for a match */
linenr_T lnum; /* the line to search for a match */
int attr; /* attributes to be used for a match */
int attr_cur; /* attributes currently active in win_line() */
linenr_T first_lnum; /* first lnum to search for multi-line pat */
colnr_T startcol; /* in win_line() points to char where HL starts */
colnr_T endcol; /* in win_line() points to char where HL ends */
} match_T;
static match_T search_hl; /* used for 'hlsearch' highlight matching */
static match_T match_hl[3]; /* used for ":match" highlight matching */
#endif
#ifdef FEAT_FOLDING
@@ -155,6 +135,7 @@ static void draw_vsep_win __ARGS((win_T *wp, int row));
static void redraw_custum_statusline __ARGS((win_T *wp));
#endif
#ifdef FEAT_SEARCH_EXTRA
#define SEARCH_HL_PRIORITY 0
static void start_search_hl __ARGS((void));
static void end_search_hl __ARGS((void));
static void prepare_search_hl __ARGS((win_T *wp, linenr_T lnum));
@@ -787,6 +768,7 @@ win_update(wp)
w_topline got smaller a bit */
#endif
#ifdef FEAT_SEARCH_EXTRA
matchitem_T *cur; /* points to the match list */
int top_to_mod = FALSE; /* redraw above mod_top */
#endif
@@ -848,18 +830,20 @@ win_update(wp)
#endif
#ifdef FEAT_SEARCH_EXTRA
/* Setup for ":match" and 'hlsearch' highlighting. Disable any previous
/* Setup for match and 'hlsearch' highlighting. Disable any previous
* match */
for (i = 0; i < 3; ++i)
cur = wp->w_match_head;
while (cur != NULL)
{
match_hl[i].rm = wp->w_match[i];
if (wp->w_match_id[i] == 0)
match_hl[i].attr = 0;
cur->hl.rm = cur->match;
if (cur->hlg_id == 0)
cur->hl.attr = 0;
else
match_hl[i].attr = syn_id2attr(wp->w_match_id[i]);
match_hl[i].buf = buf;
match_hl[i].lnum = 0;
match_hl[i].first_lnum = 0;
cur->hl.attr = syn_id2attr(cur->hlg_id);
cur->hl.buf = buf;
cur->hl.lnum = 0;
cur->hl.first_lnum = 0;
cur = cur->next;
}
search_hl.buf = buf;
search_hl.lnum = 0;
@@ -923,19 +907,25 @@ win_update(wp)
* change in one line may make the Search highlighting in a
* previous line invalid. Simple solution: redraw all visible
* lines above the change.
* Same for a ":match" pattern.
* Same for a match pattern.
*/
if (search_hl.rm.regprog != NULL
&& re_multiline(search_hl.rm.regprog))
top_to_mod = TRUE;
else
for (i = 0; i < 3; ++i)
if (match_hl[i].rm.regprog != NULL
&& re_multiline(match_hl[i].rm.regprog))
{
cur = wp->w_match_head;
while (cur != NULL)
{
if (cur->match.regprog != NULL
&& re_multiline(cur->match.regprog))
{
top_to_mod = TRUE;
break;
}
cur = cur->next;
}
}
#endif
}
#ifdef FEAT_FOLDING
@@ -2626,10 +2616,13 @@ win_line(wp, lnum, startrow, endrow, nochange)
int line_attr = 0; /* atrribute for the whole line */
#endif
#ifdef FEAT_SEARCH_EXTRA
match_T *shl; /* points to search_hl or match_hl */
#endif
#if defined(FEAT_SEARCH_EXTRA) || defined(FEAT_MBYTE)
int i;
matchitem_T *cur; /* points to the match list */
match_T *shl; /* points to search_hl or a match */
int shl_flag; /* flag to indicate whether search_hl
has been processed or not */
int prevcol_hl_flag; /* flag to indicate whether prevcol
equals startcol of search_hl or one
of the matches */
#endif
#ifdef FEAT_ARABIC
int prev_c = 0; /* previous Arabic character */
@@ -3074,12 +3067,20 @@ win_line(wp, lnum, startrow, endrow, nochange)
#ifdef FEAT_SEARCH_EXTRA
/*
* Handle highlighting the last used search pattern and ":match".
* Do this for both search_hl and match_hl[3].
* Handle highlighting the last used search pattern and matches.
* Do this for both search_hl and the match list.
*/
for (i = 3; i >= 0; --i)
cur = wp->w_match_head;
shl_flag = FALSE;
while (cur != NULL || shl_flag == FALSE)
{
shl = (i == 3) ? &search_hl : &match_hl[i];
if (shl_flag == FALSE)
{
shl = &search_hl;
shl_flag = TRUE;
}
else
shl = &cur->hl;
shl->startcol = MAXCOL;
shl->endcol = MAXCOL;
shl->attr_cur = 0;
@@ -3122,6 +3123,8 @@ win_line(wp, lnum, startrow, endrow, nochange)
area_highlighting = TRUE;
}
}
if (shl != &search_hl && cur != NULL)
cur = cur->next;
}
#endif
@@ -3388,13 +3391,24 @@ win_line(wp, lnum, startrow, endrow, nochange)
* After end, check for start/end of next match.
* When another match, have to check for start again.
* Watch out for matching an empty string!
* Do this first for search_hl, then for match_hl, so that
* ":match" overrules 'hlsearch'.
* Do this for 'search_hl' and the match list (ordered by
* priority).
*/
v = (long)(ptr - line);
for (i = 3; i >= 0; --i)
cur = wp->w_match_head;
shl_flag = FALSE;
while (cur != NULL || shl_flag == FALSE)
{
shl = (i == 3) ? &search_hl : &match_hl[i];
if (shl_flag == FALSE
&& ((cur != NULL
&& cur->priority > SEARCH_HL_PRIORITY)
|| cur == NULL))
{
shl = &search_hl;
shl_flag = TRUE;
}
else
shl = &cur->hl;
while (shl->rm.regprog != NULL)
{
if (shl->startcol != MAXCOL
@@ -3442,17 +3456,32 @@ win_line(wp, lnum, startrow, endrow, nochange)
}
break;
}
if (shl != &search_hl && cur != NULL)
cur = cur->next;
}
/* ":match" highlighting overrules 'hlsearch' */
for (i = 0; i <= 3; ++i)
if (i == 3)
search_attr = search_hl.attr_cur;
else if (match_hl[i].attr_cur != 0)
/* Use attributes from match with highest priority among
* 'search_hl' and the match list. */
search_attr = search_hl.attr_cur;
cur = wp->w_match_head;
shl_flag = FALSE;
while (cur != NULL || shl_flag == FALSE)
{
if (shl_flag == FALSE
&& ((cur != NULL
&& cur->priority > SEARCH_HL_PRIORITY)
|| cur == NULL))
{
search_attr = match_hl[i].attr_cur;
break;
shl = &search_hl;
shl_flag = TRUE;
}
else
shl = &cur->hl;
if (shl->attr_cur != 0)
search_attr = shl->attr_cur;
if (shl != &search_hl && cur != NULL)
cur = cur->next;
}
}
#endif
@@ -3613,6 +3642,8 @@ win_line(wp, lnum, startrow, endrow, nochange)
* Draw it as a space with a composing char. */
if (utf_iscomposing(mb_c))
{
int i;
for (i = Screen_mco - 1; i > 0; --i)
u8cc[i] = u8cc[i - 1];
u8cc[0] = mb_c;
@@ -4256,14 +4287,29 @@ win_line(wp, lnum, startrow, endrow, nochange)
* highlight match at end of line. If it's beyond the last
* char on the screen, just overwrite that one (tricky!) Not
* needed when a '$' was displayed for 'list'. */
#ifdef FEAT_SEARCH_EXTRA
prevcol_hl_flag = FALSE;
if (prevcol == (long)search_hl.startcol)
prevcol_hl_flag = TRUE;
else
{
cur = wp->w_match_head;
while (cur != NULL)
{
if (prevcol == (long)cur->hl.startcol)
{
prevcol_hl_flag = TRUE;
break;
}
cur = cur->next;
}
}
#endif
if (lcs_eol == lcs_eol_one
&& ((area_attr != 0 && vcol == fromcol && c == NUL)
#ifdef FEAT_SEARCH_EXTRA
/* highlight 'hlsearch' match at end of line */
|| ((prevcol == (long)search_hl.startcol
|| prevcol == (long)match_hl[0].startcol
|| prevcol == (long)match_hl[1].startcol
|| prevcol == (long)match_hl[2].startcol)
|| (prevcol_hl_flag == TRUE
# if defined(LINE_ATTR)
&& did_line_attr <= 1
# endif
@@ -4304,15 +4350,27 @@ win_line(wp, lnum, startrow, endrow, nochange)
#ifdef FEAT_SEARCH_EXTRA
if (area_attr == 0)
{
for (i = 0; i <= 3; ++i)
/* Use attributes from match with highest priority among
* 'search_hl' and the match list. */
char_attr = search_hl.attr;
cur = wp->w_match_head;
shl_flag = FALSE;
while (cur != NULL || shl_flag == FALSE)
{
if (i == 3)
char_attr = search_hl.attr;
else if ((ptr - line) - 1 == (long)match_hl[i].startcol)
if (shl_flag == FALSE
&& ((cur != NULL
&& cur->priority > SEARCH_HL_PRIORITY)
|| cur == NULL))
{
char_attr = match_hl[i].attr;
break;
shl = &search_hl;
shl_flag = TRUE;
}
else
shl = &cur->hl;
if ((ptr - line) - 1 == (long)shl->startcol)
char_attr = shl->attr;
if (shl != &search_hl && cur != NULL)
cur = cur->next;
}
}
#endif
@@ -4462,6 +4520,8 @@ win_line(wp, lnum, startrow, endrow, nochange)
{
if (mb_utf8)
{
int i;
ScreenLinesUC[off] = mb_c;
if ((c & 0xff) == 0)
ScreenLines[off] = 0x80; /* avoid storing zero */
@@ -6320,7 +6380,7 @@ screen_puts_len(text, len, row, col, attr)
#ifdef FEAT_SEARCH_EXTRA
/*
* Prepare for 'searchhl' highlighting.
* Prepare for 'hlsearch' highlighting.
*/
static void
start_search_hl()
@@ -6333,7 +6393,7 @@ start_search_hl()
}
/*
* Clean up for 'searchhl' highlighting.
* Clean up for 'hlsearch' highlighting.
*/
static void
end_search_hl()
@@ -6353,18 +6413,28 @@ prepare_search_hl(wp, lnum)
win_T *wp;
linenr_T lnum;
{
match_T *shl; /* points to search_hl or match_hl */
matchitem_T *cur; /* points to the match list */
match_T *shl; /* points to search_hl or a match */
int shl_flag; /* flag to indicate whether search_hl
has been processed or not */
int n;
int i;
/*
* When using a multi-line pattern, start searching at the top
* of the window or just after a closed fold.
* Do this both for search_hl and match_hl[3].
* Do this both for search_hl and the match list.
*/
for (i = 3; i >= 0; --i)
cur = wp->w_match_head;
shl_flag = FALSE;
while (cur != NULL || shl_flag == FALSE)
{
shl = (i == 3) ? &search_hl : &match_hl[i];
if (shl_flag == FALSE)
{
shl = &search_hl;
shl_flag = TRUE;
}
else
shl = &cur->hl;
if (shl->rm.regprog != NULL
&& shl->lnum == 0
&& re_multiline(shl->rm.regprog))
@@ -6399,11 +6469,13 @@ prepare_search_hl(wp, lnum)
}
}
}
if (shl != &search_hl && cur != NULL)
cur = cur->next;
}
}
/*
* Search for a next 'searchl' or ":match" match.
* Search for a next 'hlsearch' or match.
* Uses shl->buf.
* Sets shl->lnum and shl->rm contents.
* Note: Assumes a previous match is always before "lnum", unless
@@ -6413,7 +6485,7 @@ prepare_search_hl(wp, lnum)
static void
next_search_hl(win, shl, lnum, mincol)
win_T *win;
match_T *shl; /* points to search_hl or match_hl */
match_T *shl; /* points to search_hl or a match */
linenr_T lnum;
colnr_T mincol; /* minimal column for a match */
{
@@ -6481,7 +6553,7 @@ next_search_hl(win, shl, lnum, mincol)
/* Error while handling regexp: stop using this regexp. */
if (shl == &search_hl)
{
/* don't free the regprog in match_hl[], it's a copy */
/* don't free regprog in the match list, it's a copy */
vim_free(shl->rm.regprog);
no_hlsearch = TRUE;
}