From 91a10708b25b78d36549de0177e2330670fe163d Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sat, 26 Apr 2008 22:52:50 +0000 Subject: 24822: highlighting of isearch matches unposted: not in NEWS that COMBINING_CHARS is not on by default --- Src/Zle/zle_refresh.c | 55 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 12 deletions(-) (limited to 'Src/Zle/zle_refresh.c') diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c index 66cae9f97..cc0dbe4c0 100644 --- a/Src/Zle/zle_refresh.c +++ b/Src/Zle/zle_refresh.c @@ -241,9 +241,16 @@ struct region_highlight { * via the parameter region_highlight. */ struct region_highlight *region_highlights; +/* + * Count of special uses of region highlighting, which account + * for the first few elements of region_highlights. + * 0: region between point and mark + * 1: isearch region + */ +#define N_SPECIAL_HIGHLIGHTS (2) /* * Number of elements in region_highlights. - * This includes the region between point and mark, element 0. + * This includes the special elements above. */ int n_region_highlights; @@ -380,12 +387,14 @@ void zle_set_highlight(void) char **atrs = getaparam("zle_highlight"); int special_atr_on_set = 0; int region_atr_on_set = 0; + int isearch_atr_on_set = 0; + struct region_highlight *rhp; special_atr_on = 0; if (!region_highlights) { region_highlights = (struct region_highlight *) - zshcalloc(sizeof(struct region_highlight)); - n_region_highlights = 1; + zshcalloc(N_SPECIAL_HIGHLIGHTS*sizeof(struct region_highlight)); + n_region_highlights = N_SPECIAL_HIGHLIGHTS; } else { region_highlights->atr = 0; } @@ -394,14 +403,23 @@ void zle_set_highlight(void) for (; *atrs; atrs++) { if (!strcmp(*atrs, "none")) { /* reset attributes for consistency... usually unnecessary */ - special_atr_on = region_highlights->atr = 0; - special_atr_on_set = region_atr_on_set = 1; + special_atr_on = 0; + special_atr_on_set = region_atr_on_set = + isearch_atr_on_set = 1; + for (rhp = region_highlights; + rhp < region_highlights + N_SPECIAL_HIGHLIGHTS; + rhp++) { + rhp->atr = 0; + } } else if (strpfx("special:", *atrs)) { match_highlight(*atrs + 8, &special_atr_on); special_atr_on_set = 1; } else if (strpfx("region:", *atrs)) { match_highlight(*atrs + 7, ®ion_highlights->atr); region_atr_on_set = 1; + } else if (strpfx("isearch:", *atrs)) { + match_highlight(*atrs + 8, &(region_highlights[1].atr)); + isearch_atr_on_set = 1; } } } @@ -411,6 +429,8 @@ void zle_set_highlight(void) special_atr_on = TXTSTANDOUT; if (!region_atr_on_set) region_highlights->atr = TXTSTANDOUT; + if (!isearch_atr_on_set) + region_highlights[1].atr = TXTUNDERLINE; special_atr_off = special_atr_on << TXT_ATTR_OFF_ON_SHIFT; } @@ -432,15 +452,17 @@ get_region_highlight(UNUSED(Param pm)) /* region_highlights may not have been set yet */ if (!arrsize) - arrsize = 1; + arrsize = N_SPECIAL_HIGHLIGHTS; arrp = retarr = (char **)zhalloc(arrsize*sizeof(char *)); /* ignore NULL termination */ arrsize--; if (arrsize) { struct region_highlight *rhp; - /* ignore point/mark at start */ - for (rhp = region_highlights+1; arrsize--; rhp++, arrp++) { + /* ignore special highlighting */ + for (rhp = region_highlights + N_SPECIAL_HIGHLIGHTS; + arrsize--; + rhp++, arrp++) { char digbuf1[DIGBUFSIZE], digbuf2[DIGBUFSIZE]; int atrlen = 0, alloclen, done1; const struct highlight *hp; @@ -503,9 +525,9 @@ set_region_highlight(UNUSED(Param pm), char **aval) struct region_highlight *rhp; len = aval ? arrlen(aval) : 0; - if (n_region_highlights != len + 1) { - /* no null termination, but include point/mark region at start */ - n_region_highlights = len + 1; + if (n_region_highlights != len + N_SPECIAL_HIGHLIGHTS) { + /* no null termination, but include special highlighting at start */ + n_region_highlights = len + N_SPECIAL_HIGHLIGHTS; region_highlights = (struct region_highlight *) zrealloc(region_highlights, sizeof(struct region_highlight) * n_region_highlights); @@ -514,7 +536,9 @@ set_region_highlight(UNUSED(Param pm), char **aval) if (!aval) return; - for (rhp = region_highlights + 1; *aval; rhp++, aval++) { + for (rhp = region_highlights + N_SPECIAL_HIGHLIGHTS; + *aval; + rhp++, aval++) { char *strp, *oldstrp; oldstrp = *aval; @@ -1050,6 +1074,13 @@ zrefresh(void) } else { region_highlights->start = region_highlights->end = -1; } + /* check for isearch string to highlight */ + if (isearch_active) { + region_highlights[1].start = isearch_startpos; + region_highlights[1].end = isearch_endpos; + } else { + region_highlights[1].start = region_highlights[1].end = -1; + } if (clearlist && listshown > 0) { if (tccan(TCCLEAREOD)) { -- cgit 1.4.1