mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-11 13:01:28 +02:00
24894: enable colouring of highlighted text in editor
This commit is contained in:
parent
f5ed24f47e
commit
497a34d249
5 changed files with 242 additions and 62 deletions
|
@ -1,5 +1,9 @@
|
||||||
2008-04-29 Peter Stephenson <pws@csr.com>
|
2008-04-29 Peter Stephenson <pws@csr.com>
|
||||||
|
|
||||||
|
* 24894: Doc/Zsh/zle.yo, Src/init.c, Src/zsh.h,
|
||||||
|
Src/Zle/zle_refresh.c: enable colouring of highlighted text
|
||||||
|
in editor.
|
||||||
|
|
||||||
* 24893: Src/Zle/zle_refresh.c: duplicate statusline to avoid
|
* 24893: Src/Zle/zle_refresh.c: duplicate statusline to avoid
|
||||||
crashes when it's passed from a constant string.
|
crashes when it's passed from a constant string.
|
||||||
|
|
||||||
|
|
|
@ -2097,6 +2097,25 @@ No highlighting is applied to the given context. It is not useful for
|
||||||
this to appear with other types of highlighting; it is used to override
|
this to appear with other types of highlighting; it is used to override
|
||||||
a default.
|
a default.
|
||||||
)
|
)
|
||||||
|
item(tt(fg=)var(colour))(
|
||||||
|
The foreground colour should be set to var(colour), a decimal integer. Not
|
||||||
|
all terminals support this, and of those that do not all provide facilities
|
||||||
|
to test the support, hence the user should decide based on the terminal
|
||||||
|
type. Most terminals with colour support accept the numbers 0 to 7, and
|
||||||
|
may generate additional colours if the tt(bold) attributes is also present.
|
||||||
|
On recent terminals and on systems with an up-to-date terminal database the
|
||||||
|
number of colours supported may be tested by with the command `tt(echotc
|
||||||
|
Co)'; if this succeeds, it indicates a limit on the number of colours which
|
||||||
|
will be enforced by the line editor. The number of colours is in case
|
||||||
|
limited to 256 (i.e. the range 0 to 255).
|
||||||
|
|
||||||
|
Colour is also known as color.
|
||||||
|
)
|
||||||
|
item(tt(bg=)var(colour))(
|
||||||
|
The background colour should be set to var(colour), a decimal integer.
|
||||||
|
This works similarly to the foreground colour, except the background is
|
||||||
|
not usually affected by the bold attribute.
|
||||||
|
)
|
||||||
item(tt(bold))(
|
item(tt(bold))(
|
||||||
The characters in the given context are shown in a bold font.
|
The characters in the given context are shown in a bold font.
|
||||||
)
|
)
|
||||||
|
|
|
@ -207,7 +207,7 @@ int predisplaylen, postdisplaylen;
|
||||||
* displayed on screen.
|
* displayed on screen.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int special_atr_on, special_atr_off;
|
static int special_atr_on;
|
||||||
|
|
||||||
/* Flags for the region_highlight structure */
|
/* Flags for the region_highlight structure */
|
||||||
enum {
|
enum {
|
||||||
|
@ -357,6 +357,27 @@ match_highlight(const char *teststr, int *on_var)
|
||||||
const struct highlight *hl;
|
const struct highlight *hl;
|
||||||
|
|
||||||
found = 0;
|
found = 0;
|
||||||
|
if (strpfx("fg=", teststr) || strpfx("bg=", teststr)) {
|
||||||
|
int is_fg = (teststr[0] == 'f');
|
||||||
|
int colour = (int)zstrtol(teststr+3, (char **)&teststr, 10);
|
||||||
|
int shft, on;
|
||||||
|
if (*teststr == ',')
|
||||||
|
teststr++;
|
||||||
|
else if (*teststr)
|
||||||
|
break;
|
||||||
|
found = 1;
|
||||||
|
/* skip out of range colours but keep scanning attributes */
|
||||||
|
if (colour >= 256)
|
||||||
|
continue;
|
||||||
|
if (is_fg) {
|
||||||
|
shft = TXT_ATTR_FG_COL_SHIFT;
|
||||||
|
on = TXTFGCOLOUR;
|
||||||
|
} else {
|
||||||
|
shft = TXT_ATTR_BG_COL_SHIFT;
|
||||||
|
on = TXTBGCOLOUR;
|
||||||
|
}
|
||||||
|
*on_var |= on | (colour << shft);
|
||||||
|
} else {
|
||||||
for (hl = highlights; hl->name; hl++) {
|
for (hl = highlights; hl->name; hl++) {
|
||||||
if (strpfx(hl->name, teststr)) {
|
if (strpfx(hl->name, teststr)) {
|
||||||
const char *val = teststr + strlen(hl->name);
|
const char *val = teststr + strlen(hl->name);
|
||||||
|
@ -374,6 +395,7 @@ match_highlight(const char *teststr, int *on_var)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -431,7 +453,6 @@ void zle_set_highlight(void)
|
||||||
region_highlights->atr = TXTSTANDOUT;
|
region_highlights->atr = TXTSTANDOUT;
|
||||||
if (!isearch_atr_on_set)
|
if (!isearch_atr_on_set)
|
||||||
region_highlights[1].atr = TXTUNDERLINE;
|
region_highlights[1].atr = TXTUNDERLINE;
|
||||||
special_atr_off = special_atr_on << TXT_ATTR_OFF_ON_SHIFT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -610,19 +631,23 @@ zwcputc(const REFRESH_ELEMENT *c, int *curatrp)
|
||||||
|
|
||||||
if (lastatr & ~c->atr) {
|
if (lastatr & ~c->atr) {
|
||||||
/* Stuff on we don't want, turn it off */
|
/* Stuff on we don't want, turn it off */
|
||||||
settextattributes((lastatr & ~c->atr) << TXT_ATTR_OFF_ON_SHIFT);
|
settextattributes(TXT_ATTR_OFF_FROM_ON(lastatr & ~c->atr));
|
||||||
lastatr = 0;
|
lastatr = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't output "on" attributes in a string of characters with
|
* Don't output "on" attributes in a string of characters with
|
||||||
* the same attributes.
|
* the same attributes. Be careful in case a different colour
|
||||||
|
* needs setting.
|
||||||
*/
|
*/
|
||||||
if ((c->atr & TXT_ATTR_ON_MASK) &&
|
if ((c->atr & TXT_ATTR_ON_MASK) &&
|
||||||
(!curatrp ||
|
(!curatrp ||
|
||||||
((*curatrp & TXT_ATTR_ON_MASK) != (c->atr & TXT_ATTR_ON_MASK)))) {
|
((*curatrp & TXT_ATTR_ON_VALUES_MASK) !=
|
||||||
|
(c->atr & TXT_ATTR_ON_VALUES_MASK)))) {
|
||||||
|
/* Record just the control flags we might need to turn off... */
|
||||||
lastatr = c->atr & TXT_ATTR_ON_MASK;
|
lastatr = c->atr & TXT_ATTR_ON_MASK;
|
||||||
settextattributes(lastatr);
|
/* ...but set including the values for colour attributes */
|
||||||
|
settextattributes(c->atr & TXT_ATTR_ON_VALUES_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MULTIBYTE_SUPPORT
|
#ifdef MULTIBYTE_SUPPORT
|
||||||
|
@ -656,9 +681,11 @@ zwcputc(const REFRESH_ELEMENT *c, int *curatrp)
|
||||||
if (curatrp) {
|
if (curatrp) {
|
||||||
/*
|
/*
|
||||||
* Remember the current attributes: those that are turned
|
* Remember the current attributes: those that are turned
|
||||||
* on, less those that are turned off again.
|
* on, less those that are turned off again. Include
|
||||||
|
* colour attributes here in case the colour changes to
|
||||||
|
* another non-default one.
|
||||||
*/
|
*/
|
||||||
*curatrp = (c->atr & TXT_ATTR_ON_MASK) &
|
*curatrp = (c->atr & TXT_ATTR_ON_VALUES_MASK) &
|
||||||
~((c->atr & TXT_ATTR_OFF_MASK) >> TXT_ATTR_OFF_ON_SHIFT);
|
~((c->atr & TXT_ATTR_OFF_MASK) >> TXT_ATTR_OFF_ON_SHIFT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -915,6 +942,54 @@ snextline(Rparams rpms)
|
||||||
rpms->sen = rpms->s + winw;
|
rpms->sen = rpms->s + winw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* HERE: these need to be made configurable, somehow.
|
||||||
|
* Ideally we need to make the complist stuff use the
|
||||||
|
* same system, but that may be too much tied to the GNU ls
|
||||||
|
* interface to make that possible.
|
||||||
|
*/
|
||||||
|
/* Start of escape sequence for foreground colour */
|
||||||
|
#define TC_COL_FG_START "\033[3"
|
||||||
|
/* Start of escape sequence for background colour */
|
||||||
|
#define TC_COL_BG_START "\033[4"
|
||||||
|
/* End of either escape sequence */
|
||||||
|
#define TC_COL_END "m"
|
||||||
|
/* Numeric code (to be turned into ASCII) to reset default colour */
|
||||||
|
#define TC_COL_DEFAULT 9
|
||||||
|
|
||||||
|
static void
|
||||||
|
setcolourattribute(int colour, char *start, int tc, int def,
|
||||||
|
int use_termcap)
|
||||||
|
{
|
||||||
|
char out[16], *ptr;
|
||||||
|
/*
|
||||||
|
* If we're not restoring the default, and either have a
|
||||||
|
* colour value that is too large for ANSI, or have been told
|
||||||
|
* to use the termcap sequence (which at the time of writing
|
||||||
|
* we never are), try to use the termcap sequence.
|
||||||
|
*/
|
||||||
|
if (!def && (colour > 7 || use_termcap)) {
|
||||||
|
/*
|
||||||
|
* We can if it's available, and either we couldn't get
|
||||||
|
* the maximum number of colours, or the colour is in range.
|
||||||
|
*/
|
||||||
|
if (tccan(tc) && (tccolours < 0 || colour < tccolours))
|
||||||
|
tcoutarg(tc, colour);
|
||||||
|
/* for 0 to 7 assume standard ANSI works, otherwise it won't. */
|
||||||
|
if (colour > 7)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(out, start);
|
||||||
|
if (def)
|
||||||
|
colour = TC_COL_DEFAULT;
|
||||||
|
|
||||||
|
ptr = out + strlen(start);
|
||||||
|
*ptr++ = colour + '0';
|
||||||
|
strcpy(ptr, TC_COL_END);
|
||||||
|
tputs(out, 1, putshout);
|
||||||
|
}
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
static void
|
static void
|
||||||
settextattributes(int atr)
|
settextattributes(int atr)
|
||||||
|
@ -931,6 +1006,18 @@ settextattributes(int atr)
|
||||||
tsetcap(TCSTANDOUTBEG, 0);
|
tsetcap(TCSTANDOUTBEG, 0);
|
||||||
if (txtchangeisset(atr, TXTUNDERLINE))
|
if (txtchangeisset(atr, TXTUNDERLINE))
|
||||||
tsetcap(TCUNDERLINEBEG, 0);
|
tsetcap(TCUNDERLINEBEG, 0);
|
||||||
|
if (txtchangeisset(atr, TXTFGCOLOUR|TXTNOFGCOLOUR)) {
|
||||||
|
setcolourattribute(txtchangeget(atr, TXT_ATTR_FG_COL),
|
||||||
|
TC_COL_FG_START, TCFGCOLOUR,
|
||||||
|
txtchangeisset(atr, TXTNOFGCOLOUR),
|
||||||
|
txtchangeisset(atr, TXT_ATTR_FG_TERMCAP));
|
||||||
|
}
|
||||||
|
if (txtchangeisset(atr, TXTBGCOLOUR|TXTNOBGCOLOUR)) {
|
||||||
|
setcolourattribute(txtchangeget(atr, TXT_ATTR_BG_COL),
|
||||||
|
TC_COL_BG_START, TCBGCOLOUR,
|
||||||
|
txtchangeisset(atr, TXTNOBGCOLOUR),
|
||||||
|
txtchangeisset(atr, TXT_ATTR_BG_TERMCAP));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MULTIBYTE_SUPPORT
|
#ifdef MULTIBYTE_SUPPORT
|
||||||
|
@ -1209,6 +1296,7 @@ zrefresh(void)
|
||||||
rpms.sen = *nbuf + winw;
|
rpms.sen = *nbuf + winw;
|
||||||
for (t = tmpline, tmppos = 0; tmppos < tmpll; t++, tmppos++) {
|
for (t = tmpline, tmppos = 0; tmppos < tmpll; t++, tmppos++) {
|
||||||
int base_atr_on = 0, base_atr_off = 0, ireg;
|
int base_atr_on = 0, base_atr_off = 0, ireg;
|
||||||
|
int all_atr_on, all_atr_off;
|
||||||
struct region_highlight *rhp;
|
struct region_highlight *rhp;
|
||||||
/*
|
/*
|
||||||
* Calculate attribute based on region.
|
* Calculate attribute based on region.
|
||||||
|
@ -1223,12 +1311,27 @@ zrefresh(void)
|
||||||
offset = predisplaylen; /* increment over it */
|
offset = predisplaylen; /* increment over it */
|
||||||
if (rhp->start + offset <= tmppos &&
|
if (rhp->start + offset <= tmppos &&
|
||||||
tmppos < rhp->end + offset) {
|
tmppos < rhp->end + offset) {
|
||||||
|
if (base_atr_on & (TXTFGCOLOUR|TXTBGCOLOUR)) {
|
||||||
|
/* keep colour already set */
|
||||||
|
base_atr_on |= rhp->atr & ~TXT_ATTR_COLOUR_ON_MASK;
|
||||||
|
} else {
|
||||||
|
/* no colour set yet */
|
||||||
base_atr_on |= rhp->atr;
|
base_atr_on |= rhp->atr;
|
||||||
|
}
|
||||||
if (tmppos == rhp->end + offset - 1 ||
|
if (tmppos == rhp->end + offset - 1 ||
|
||||||
tmppos == tmpll - 1)
|
tmppos == tmpll - 1)
|
||||||
base_atr_off |= rhp->atr << TXT_ATTR_OFF_ON_SHIFT;
|
base_atr_off |= TXT_ATTR_OFF_FROM_ON(rhp->atr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (special_atr_on & (TXTFGCOLOUR|TXTBGCOLOUR)) {
|
||||||
|
/* keep colours from special attributes */
|
||||||
|
all_atr_on = special_atr_on |
|
||||||
|
(base_atr_on & ~TXT_ATTR_COLOUR_ON_MASK);
|
||||||
|
} else {
|
||||||
|
/* keep colours from standard attributes */
|
||||||
|
all_atr_on = special_atr_on | base_atr_on;
|
||||||
|
}
|
||||||
|
all_atr_off = TXT_ATTR_OFF_FROM_ON(all_atr_on);
|
||||||
|
|
||||||
if (t == scs) /* if cursor is here, remember it */
|
if (t == scs) /* if cursor is here, remember it */
|
||||||
rpms.nvcs = rpms.s - nbuf[rpms.nvln = rpms.ln];
|
rpms.nvcs = rpms.s - nbuf[rpms.nvln = rpms.ln];
|
||||||
|
@ -1264,11 +1367,11 @@ zrefresh(void)
|
||||||
rpms.s->chr = ZWC(' ');
|
rpms.s->chr = ZWC(' ');
|
||||||
if (!started)
|
if (!started)
|
||||||
started = 1;
|
started = 1;
|
||||||
rpms.s->atr = special_atr_on | base_atr_on;
|
rpms.s->atr = all_atr_on;
|
||||||
rpms.s++;
|
rpms.s++;
|
||||||
} while (rpms.s < rpms.sen);
|
} while (rpms.s < rpms.sen);
|
||||||
if (started)
|
if (started)
|
||||||
rpms.s[-1].atr |= special_atr_off | base_atr_off;
|
rpms.s[-1].atr |= all_atr_off;
|
||||||
if (nextline(&rpms, 1))
|
if (nextline(&rpms, 1))
|
||||||
break;
|
break;
|
||||||
if (t == scs) {
|
if (t == scs) {
|
||||||
|
@ -1292,8 +1395,7 @@ zrefresh(void)
|
||||||
* occurrence.
|
* occurrence.
|
||||||
*/
|
*/
|
||||||
rpms.s->chr = ZWC('?');
|
rpms.s->chr = ZWC('?');
|
||||||
rpms.s->atr = special_atr_on | special_atr_off |
|
rpms.s->atr = all_atr_on | all_atr_off;
|
||||||
base_atr_on | base_atr_off;
|
|
||||||
rpms.s++;
|
rpms.s++;
|
||||||
} else {
|
} else {
|
||||||
/* We can fit it without reaching the end of the line. */
|
/* We can fit it without reaching the end of the line. */
|
||||||
|
@ -1334,18 +1436,17 @@ zrefresh(void)
|
||||||
#endif
|
#endif
|
||||||
) { /* other control character */
|
) { /* other control character */
|
||||||
rpms.s->chr = ZWC('^');
|
rpms.s->chr = ZWC('^');
|
||||||
rpms.s->atr = special_atr_on | base_atr_on;
|
rpms.s->atr = all_atr_on;
|
||||||
rpms.s++;
|
rpms.s++;
|
||||||
if (rpms.s == rpms.sen) {
|
if (rpms.s == rpms.sen) {
|
||||||
/* text wrapped */
|
/* text wrapped */
|
||||||
rpms.s[-1].atr |= special_atr_off | base_atr_off;
|
rpms.s[-1].atr |= all_atr_off;
|
||||||
if (nextline(&rpms, 1))
|
if (nextline(&rpms, 1))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
rpms.s->chr = (((unsigned int)*t & ~0x80u) > 31) ?
|
rpms.s->chr = (((unsigned int)*t & ~0x80u) > 31) ?
|
||||||
ZWC('?') : (*t | ZWC('@'));
|
ZWC('?') : (*t | ZWC('@'));
|
||||||
rpms.s->atr = special_atr_on | special_atr_off |
|
rpms.s->atr = all_atr_on | all_atr_off;
|
||||||
base_atr_on | base_atr_off;
|
|
||||||
rpms.s++;
|
rpms.s++;
|
||||||
}
|
}
|
||||||
#ifdef MULTIBYTE_SUPPORT
|
#ifdef MULTIBYTE_SUPPORT
|
||||||
|
@ -1370,12 +1471,12 @@ zrefresh(void)
|
||||||
rpms.s->chr = wc;
|
rpms.s->chr = wc;
|
||||||
if (!started)
|
if (!started)
|
||||||
started = 1;
|
started = 1;
|
||||||
rpms.s->atr = special_atr_on | base_atr_on;
|
rpms.s->atr = all_atr_on;
|
||||||
rpms.s++;
|
rpms.s++;
|
||||||
if (rpms.s == rpms.sen) {
|
if (rpms.s == rpms.sen) {
|
||||||
/* text wrapped */
|
/* text wrapped */
|
||||||
if (started) {
|
if (started) {
|
||||||
rpms.s[-1].atr |= special_atr_off | base_atr_off;
|
rpms.s[-1].atr |= all_atr_off;
|
||||||
started = 0;
|
started = 0;
|
||||||
}
|
}
|
||||||
if (nextline(&rpms, 1))
|
if (nextline(&rpms, 1))
|
||||||
|
@ -1385,7 +1486,7 @@ zrefresh(void)
|
||||||
dispptr++;
|
dispptr++;
|
||||||
}
|
}
|
||||||
if (started)
|
if (started)
|
||||||
rpms.s[-1].atr |= special_atr_off | base_atr_off;
|
rpms.s[-1].atr |= all_atr_off;
|
||||||
if (*dispptr) /* nextline said stop processing */
|
if (*dispptr) /* nextline said stop processing */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1417,11 +1518,14 @@ zrefresh(void)
|
||||||
more_end = 1;
|
more_end = 1;
|
||||||
|
|
||||||
if (statusline) {
|
if (statusline) {
|
||||||
int outll, outsz;
|
int outll, outsz, all_atr_on, all_atr_off;
|
||||||
char *statusdup = ztrdup(statusline);
|
char *statusdup = ztrdup(statusline);
|
||||||
ZLE_STRING_T outputline =
|
ZLE_STRING_T outputline =
|
||||||
stringaszleline(statusdup, 0, &outll, &outsz, NULL);
|
stringaszleline(statusdup, 0, &outll, &outsz, NULL);
|
||||||
|
|
||||||
|
all_atr_on = special_atr_on;
|
||||||
|
all_atr_off = TXT_ATTR_OFF_FROM_ON(all_atr_on);
|
||||||
|
|
||||||
rpms.tosln = rpms.ln + 1;
|
rpms.tosln = rpms.ln + 1;
|
||||||
nbuf[rpms.ln][winw + 1] = zr_zr; /* text not wrapped */
|
nbuf[rpms.ln][winw + 1] = zr_zr; /* text not wrapped */
|
||||||
snextline(&rpms);
|
snextline(&rpms);
|
||||||
|
@ -1440,7 +1544,7 @@ zrefresh(void)
|
||||||
}
|
}
|
||||||
if (width > rpms.sen - rpms.s) {
|
if (width > rpms.sen - rpms.s) {
|
||||||
rpms.s->chr = ZWC('?');
|
rpms.s->chr = ZWC('?');
|
||||||
rpms.s->atr = special_atr_on | special_atr_off;
|
rpms.s->atr = all_atr_on | all_atr_off;
|
||||||
rpms.s++;
|
rpms.s++;
|
||||||
} else {
|
} else {
|
||||||
rpms.s->chr = *u;
|
rpms.s->chr = *u;
|
||||||
|
@ -1457,7 +1561,7 @@ zrefresh(void)
|
||||||
#endif
|
#endif
|
||||||
if (ZC_icntrl(*u)) { /* simplified processing in the status line */
|
if (ZC_icntrl(*u)) { /* simplified processing in the status line */
|
||||||
rpms.s->chr = ZWC('^');
|
rpms.s->chr = ZWC('^');
|
||||||
rpms.s->atr = special_atr_on;
|
rpms.s->atr = all_atr_on;
|
||||||
rpms.s++;
|
rpms.s++;
|
||||||
if (rpms.s == rpms.sen) {
|
if (rpms.s == rpms.sen) {
|
||||||
nbuf[rpms.ln][winw + 1] = zr_nl;/* text wrapped */
|
nbuf[rpms.ln][winw + 1] = zr_nl;/* text wrapped */
|
||||||
|
@ -1465,7 +1569,7 @@ zrefresh(void)
|
||||||
}
|
}
|
||||||
rpms.s->chr = (((unsigned int)*u & ~0x80u) > 31)
|
rpms.s->chr = (((unsigned int)*u & ~0x80u) > 31)
|
||||||
? ZWC('?') : (*u | ZWC('@'));
|
? ZWC('?') : (*u | ZWC('@'));
|
||||||
rpms.s->atr = special_atr_on | special_atr_off;
|
rpms.s->atr = all_atr_on | all_atr_off;
|
||||||
rpms.s++;
|
rpms.s++;
|
||||||
} else {
|
} else {
|
||||||
rpms.s->chr = *u;
|
rpms.s->chr = *u;
|
||||||
|
@ -2037,7 +2141,7 @@ refreshline(int ln)
|
||||||
*/
|
*/
|
||||||
int now_off = ol->atr & ~nl->atr & TXT_ATTR_ON_MASK;
|
int now_off = ol->atr & ~nl->atr & TXT_ATTR_ON_MASK;
|
||||||
if (now_off)
|
if (now_off)
|
||||||
settextattributes(now_off << TXT_ATTR_OFF_ON_SHIFT);
|
settextattributes(TXT_ATTR_OFF_FROM_ON(now_off));
|
||||||
|
|
||||||
zputc(nl);
|
zputc(nl);
|
||||||
nl++, ol++;
|
nl++, ol++;
|
||||||
|
@ -2336,6 +2440,7 @@ singlerefresh(ZLE_STRING_T tmpline, int tmpll, int tmpcs)
|
||||||
|
|
||||||
for (t0 = 0; t0 < tmpll; t0++) {
|
for (t0 = 0; t0 < tmpll; t0++) {
|
||||||
int base_atr_on = 0, base_atr_off = 0, ireg;
|
int base_atr_on = 0, base_atr_off = 0, ireg;
|
||||||
|
int all_atr_on, all_atr_off;
|
||||||
struct region_highlight *rhp;
|
struct region_highlight *rhp;
|
||||||
/*
|
/*
|
||||||
* Calculate attribute based on region.
|
* Calculate attribute based on region.
|
||||||
|
@ -2350,12 +2455,27 @@ singlerefresh(ZLE_STRING_T tmpline, int tmpll, int tmpcs)
|
||||||
offset = predisplaylen; /* increment over it */
|
offset = predisplaylen; /* increment over it */
|
||||||
if (rhp->start + offset <= t0 &&
|
if (rhp->start + offset <= t0 &&
|
||||||
t0 < rhp->end + offset) {
|
t0 < rhp->end + offset) {
|
||||||
|
if (base_atr_on & (TXTFGCOLOUR|TXTBGCOLOUR)) {
|
||||||
|
/* keep colour already set */
|
||||||
|
base_atr_on |= rhp->atr & ~TXT_ATTR_COLOUR_ON_MASK;
|
||||||
|
} else {
|
||||||
|
/* no colour set yet */
|
||||||
base_atr_on |= rhp->atr;
|
base_atr_on |= rhp->atr;
|
||||||
|
}
|
||||||
if (t0 == rhp->end + offset - 1 ||
|
if (t0 == rhp->end + offset - 1 ||
|
||||||
t0 == tmpll - 1)
|
t0 == tmpll - 1)
|
||||||
base_atr_off |= rhp->atr << TXT_ATTR_OFF_ON_SHIFT;
|
base_atr_off |= TXT_ATTR_OFF_FROM_ON(rhp->atr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (special_atr_on & (TXTFGCOLOUR|TXTBGCOLOUR)) {
|
||||||
|
/* keep colours from special attributes */
|
||||||
|
all_atr_on = special_atr_on |
|
||||||
|
(base_atr_on & ~TXT_ATTR_COLOUR_ON_MASK);
|
||||||
|
} else {
|
||||||
|
/* keep colours from standard attributes */
|
||||||
|
all_atr_on = special_atr_on | base_atr_on;
|
||||||
|
}
|
||||||
|
all_atr_off = TXT_ATTR_OFF_FROM_ON(all_atr_on);
|
||||||
|
|
||||||
if (tmpline[t0] == ZWC('\t')) {
|
if (tmpline[t0] == ZWC('\t')) {
|
||||||
REFRESH_ELEMENT sp = zr_sp;
|
REFRESH_ELEMENT sp = zr_sp;
|
||||||
|
@ -2365,11 +2485,10 @@ singlerefresh(ZLE_STRING_T tmpline, int tmpll, int tmpcs)
|
||||||
vp[-1].atr |= base_atr_off;
|
vp[-1].atr |= base_atr_off;
|
||||||
} else if (tmpline[t0] == ZWC('\n')) {
|
} else if (tmpline[t0] == ZWC('\n')) {
|
||||||
vp->chr = ZWC('\\');
|
vp->chr = ZWC('\\');
|
||||||
vp->atr = special_atr_on | base_atr_on;
|
vp->atr = all_atr_on;
|
||||||
vp++;
|
vp++;
|
||||||
vp->chr = ZWC('n');
|
vp->chr = ZWC('n');
|
||||||
vp->atr = special_atr_on | special_atr_off |
|
vp->atr = all_atr_on | all_atr_off;
|
||||||
base_atr_on | base_atr_off;
|
|
||||||
vp++;
|
vp++;
|
||||||
#ifdef MULTIBYTE_SUPPORT
|
#ifdef MULTIBYTE_SUPPORT
|
||||||
} else if (iswprint(tmpline[t0]) &&
|
} else if (iswprint(tmpline[t0]) &&
|
||||||
|
@ -2406,12 +2525,11 @@ singlerefresh(ZLE_STRING_T tmpline, int tmpll, int tmpcs)
|
||||||
ZLE_INT_T t = tmpline[++t0];
|
ZLE_INT_T t = tmpline[++t0];
|
||||||
|
|
||||||
vp->chr = ZWC('^');
|
vp->chr = ZWC('^');
|
||||||
vp->atr = special_atr_on | base_atr_on;
|
vp->atr = all_atr_on;
|
||||||
vp++;
|
vp++;
|
||||||
vp->chr = (((unsigned int)t & ~0x80u) > 31) ?
|
vp->chr = (((unsigned int)t & ~0x80u) > 31) ?
|
||||||
ZWC('?') : (t | ZWC('@'));
|
ZWC('?') : (t | ZWC('@'));
|
||||||
vp->atr = special_atr_on | special_atr_off | base_atr_on |
|
vp->atr = all_atr_on | all_atr_off;
|
||||||
base_atr_off;
|
|
||||||
vp++;
|
vp++;
|
||||||
}
|
}
|
||||||
#ifdef MULTIBYTE_SUPPORT
|
#ifdef MULTIBYTE_SUPPORT
|
||||||
|
@ -2431,13 +2549,13 @@ singlerefresh(ZLE_STRING_T tmpline, int tmpll, int tmpcs)
|
||||||
vp->chr = wc;
|
vp->chr = wc;
|
||||||
if (!started)
|
if (!started)
|
||||||
started = 1;
|
started = 1;
|
||||||
vp->atr = special_atr_on | base_atr_on;
|
vp->atr = all_atr_on;
|
||||||
vp++;
|
vp++;
|
||||||
}
|
}
|
||||||
dispptr++;
|
dispptr++;
|
||||||
}
|
}
|
||||||
if (started)
|
if (started)
|
||||||
vp[-1].atr |= special_atr_off | base_atr_off;
|
vp[-1].atr |= all_atr_off;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -79,6 +79,11 @@ int tclines, tccolumns;
|
||||||
/**/
|
/**/
|
||||||
mod_export int hasam, hasxn;
|
mod_export int hasam, hasxn;
|
||||||
|
|
||||||
|
/* Value of the Co (max_colors) entry: may not be set */
|
||||||
|
|
||||||
|
/**/
|
||||||
|
mod_export int tccolours;
|
||||||
|
|
||||||
/* Pointer to read-key function from zle */
|
/* Pointer to read-key function from zle */
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
|
@ -531,7 +536,7 @@ static char *tccapnams[TC_COUNT] = {
|
||||||
"cl", "le", "LE", "nd", "RI", "up", "UP", "do",
|
"cl", "le", "LE", "nd", "RI", "up", "UP", "do",
|
||||||
"DO", "dc", "DC", "ic", "IC", "cd", "ce", "al", "dl", "ta",
|
"DO", "dc", "DC", "ic", "IC", "cd", "ce", "al", "dl", "ta",
|
||||||
"md", "so", "us", "me", "se", "ue", "ch",
|
"md", "so", "us", "me", "se", "ue", "ch",
|
||||||
"ku", "kd", "kl", "kr", "sc", "rc", "bc"
|
"ku", "kd", "kl", "kr", "sc", "rc", "bc", "AF", "AB"
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Initialise termcap */
|
/* Initialise termcap */
|
||||||
|
@ -590,6 +595,7 @@ init_term(void)
|
||||||
|
|
||||||
tclines = tgetnum("li");
|
tclines = tgetnum("li");
|
||||||
tccolumns = tgetnum("co");
|
tccolumns = tgetnum("co");
|
||||||
|
tccolours = tgetnum("Co");
|
||||||
|
|
||||||
/* if there's no termcap entry for cursor up, use single line mode: *
|
/* if there's no termcap entry for cursor up, use single line mode: *
|
||||||
* this is flagged by termflags which is examined in zle_refresh.c *
|
* this is flagged by termflags which is examined in zle_refresh.c *
|
||||||
|
|
59
Src/zsh.h
59
Src/zsh.h
|
@ -1949,7 +1949,9 @@ struct ttyinfo {
|
||||||
#define TCSAVECURSOR 29
|
#define TCSAVECURSOR 29
|
||||||
#define TCRESTRCURSOR 30
|
#define TCRESTRCURSOR 30
|
||||||
#define TCBACKSPACE 31
|
#define TCBACKSPACE 31
|
||||||
#define TC_COUNT 32
|
#define TCFGCOLOUR 32
|
||||||
|
#define TCBGCOLOUR 33
|
||||||
|
#define TC_COUNT 34
|
||||||
|
|
||||||
#define tccan(X) (tclen[X])
|
#define tccan(X) (tclen[X])
|
||||||
|
|
||||||
|
@ -1957,32 +1959,63 @@ struct ttyinfo {
|
||||||
* Text attributes for displaying in ZLE
|
* Text attributes for displaying in ZLE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define TXTBOLDFACE 0x01
|
#define TXTBOLDFACE 0x0001
|
||||||
#define TXTSTANDOUT 0x02
|
#define TXTSTANDOUT 0x0002
|
||||||
#define TXTUNDERLINE 0x04
|
#define TXTUNDERLINE 0x0004
|
||||||
#define TXTDIRTY 0x80
|
#define TXTFGCOLOUR 0x0008
|
||||||
|
#define TXTBGCOLOUR 0x0010
|
||||||
|
#define TXTDIRTY 0x0020
|
||||||
|
|
||||||
#define TXT_ATTR_ON_MASK 0x07
|
#define TXT_ATTR_ON_MASK 0x001F
|
||||||
|
|
||||||
#define txtisset(X) (txtattrmask & (X))
|
#define txtisset(X) (txtattrmask & (X))
|
||||||
#define txtset(X) (txtattrmask |= (X))
|
#define txtset(X) (txtattrmask |= (X))
|
||||||
#define txtunset(X) (txtattrmask &= ~(X))
|
#define txtunset(X) (txtattrmask &= ~(X))
|
||||||
|
|
||||||
#define TXTNOBOLDFACE 0x10
|
#define TXTNOBOLDFACE 0x0040
|
||||||
#define TXTNOSTANDOUT 0x20
|
#define TXTNOSTANDOUT 0x0080
|
||||||
#define TXTNOUNDERLINE 0x40
|
#define TXTNOUNDERLINE 0x0100
|
||||||
|
#define TXTNOFGCOLOUR 0x0200
|
||||||
|
#define TXTNOBGCOLOUR 0x0400
|
||||||
|
|
||||||
#define TXT_ATTR_OFF_MASK 0x70
|
#define TXT_ATTR_OFF_MASK 0x07C0
|
||||||
/* Bits to shift off right to get on */
|
/* Bits to shift off right to get on */
|
||||||
#define TXT_ATTR_OFF_ON_SHIFT (4)
|
#define TXT_ATTR_OFF_ON_SHIFT 6
|
||||||
|
#define TXT_ATTR_OFF_FROM_ON(attr) \
|
||||||
|
(((attr) & TXT_ATTR_ON_MASK) << TXT_ATTR_OFF_ON_SHIFT)
|
||||||
/*
|
/*
|
||||||
* Indicates to zle_refresh.c that the character entry is an
|
* Indicates to zle_refresh.c that the character entry is an
|
||||||
* index into the list of multiword symbols.
|
* index into the list of multiword symbols.
|
||||||
*/
|
*/
|
||||||
#define TXT_MULTIWORD_MASK 0x100
|
#define TXT_MULTIWORD_MASK 0x0800
|
||||||
|
|
||||||
|
/* Mask for colour to use in foreground */
|
||||||
|
#define TXT_ATTR_FG_COL_MASK 0x000FF000
|
||||||
|
/* Bits to shift the foreground colour */
|
||||||
|
#define TXT_ATTR_FG_COL_SHIFT (12)
|
||||||
|
/* Mask for colour to use in background */
|
||||||
|
#define TXT_ATTR_BG_COL_MASK 0x0FF00000
|
||||||
|
/* Bits to shift the background colour */
|
||||||
|
#define TXT_ATTR_BG_COL_SHIFT (20)
|
||||||
|
|
||||||
|
/* Flag to use termcap AF sequence to set colour, if available */
|
||||||
|
#define TXT_ATTR_FG_TERMCAP 0x10000000
|
||||||
|
/* Flag to use termcap AB sequence to set colour, if available */
|
||||||
|
#define TXT_ATTR_BG_TERMCAP 0x20000000
|
||||||
|
|
||||||
|
/* Things to turn on, including values for the colour elements */
|
||||||
|
#define TXT_ATTR_ON_VALUES_MASK \
|
||||||
|
(TXT_ATTR_ON_MASK|TXT_ATTR_FG_COL_MASK|TXT_ATTR_BG_COL_MASK|\
|
||||||
|
TXT_ATTR_FG_TERMCAP|TXT_ATTR_BG_TERMCAP)
|
||||||
|
|
||||||
|
/* Mask out everything to do with activating colours */
|
||||||
|
#define TXT_ATTR_COLOUR_ON_MASK \
|
||||||
|
(TXTFGCOLOUR|TXTBGCOLOUR| \
|
||||||
|
TXT_ATTR_FG_COL_MASK|TXT_ATTR_BG_COL_MASK| \
|
||||||
|
TXT_ATTR_FG_TERMCAP|TXT_ATTR_BG_TERMCAP)
|
||||||
|
|
||||||
#define txtchangeisset(T,X) ((T) & (X))
|
#define txtchangeisset(T,X) ((T) & (X))
|
||||||
|
#define txtchangeget(T,A) (((T) & A ## _MASK) >> A ## _SHIFT)
|
||||||
#define txtchangeset(X, Y) (txtchange |= (X), txtchange &= ~(Y))
|
#define txtchangeset(X, Y) (txtchange |= (X), txtchange &= ~(Y))
|
||||||
|
|
||||||
/****************************************/
|
/****************************************/
|
||||||
|
|
Loading…
Reference in a new issue