49646: allow colors in WATCHFMT with %F/%K

This commit is contained in:
Oliver Kiddle 2021-12-13 21:06:57 +01:00
parent 7791a6876c
commit 91b7baf259
4 changed files with 49 additions and 4 deletions

View File

@ -1,5 +1,8 @@
2021-12-13 Oliver Kiddle <opk@zsh.org>
* 49646: Doc/Zsh/mod_watch.yo, Src/Modules/watch.c, Src/prompt.c:
allow colors in WATCHFMT with %F/%K
* 49645: Completion/Unix/Type/_path_commands: when completing for
the path_dirs option, add a / suffix and follow symlinks

View File

@ -65,6 +65,12 @@ The `tt(%m)' and `tt(%M)' escapes will work only if there is a host name
field in the utmp on your machine. Otherwise they are
treated as ordinary strings.
)
item(tt(%F{)var(color)tt(}) LPAR()tt(%f)RPAR())(
Start (stop) using a different foreground color.
)
item(tt(%K{)var(color)tt(}) LPAR()tt(%k)RPAR())(
Start (stop) using a different background color.
)
item(tt(%S) LPAR()tt(%s)RPAR())(
Start (stop) standout mode.
)

View File

@ -246,6 +246,7 @@ watchlog2(int inout, WATCH_STRUCT_UTMP *u, char *fmt, int prnt, int fini)
struct tm *tm;
char *fm2;
int len;
zattr atr;
# ifdef WATCH_UTMP_UT_HOST
char *p;
int i;
@ -347,6 +348,40 @@ watchlog2(int inout, WATCH_STRUCT_UTMP *u, char *fmt, int prnt, int fini)
case '%':
putchar('%');
break;
case 'F':
if (*fmt == '{') {
fmt++;
atr = match_colour((const char**)&fmt, 1, 0);
if (*fmt == '}')
fmt++;
if (!(atr & (TXT_ERROR | TXTNOFGCOLOUR))) {
txtunset(TXT_ATTR_FG_COL_MASK);
txtset(atr & TXT_ATTR_FG_ON_MASK);
set_colour_attribute(atr, COL_SEQ_FG, TSC_RAW);
}
}
break;
case 'f':
txtunset(TXT_ATTR_FG_ON_MASK);
set_colour_attribute(TXTNOFGCOLOUR, COL_SEQ_FG, TSC_RAW);
break;
case 'K':
if (*fmt == '{') {
fmt++;
atr = match_colour((const char**)&fmt, 0, 0);
if (*fmt == '}')
fmt++;
if (!(atr & (TXT_ERROR | TXTNOBGCOLOUR))) {
txtunset(TXT_ATTR_BG_COL_MASK);
txtset(atr & TXT_ATTR_BG_ON_MASK);
set_colour_attribute(atr, COL_SEQ_BG, TSC_RAW);
}
}
break;
case 'k':
txtunset(TXT_ATTR_BG_ON_MASK);
set_colour_attribute(TXTNOBGCOLOUR, COL_SEQ_BG, TSC_RAW);
break;
case 'S':
txtset(TXTSTANDOUT);
tsetcap(TCSTANDOUTBEG, TSC_RAW);

View File

@ -1045,9 +1045,9 @@ tsetcap(int cap, int flags)
if (txtisset(TXTUNDERLINE))
tsetcap(TCUNDERLINEBEG, flags);
if (txtisset(TXTFGCOLOUR))
set_colour_attribute(txtattrmask, COL_SEQ_FG, TSC_PROMPT);
set_colour_attribute(txtattrmask, COL_SEQ_FG, flags);
if (txtisset(TXTBGCOLOUR))
set_colour_attribute(txtattrmask, COL_SEQ_BG, TSC_PROMPT);
set_colour_attribute(txtattrmask, COL_SEQ_BG, flags);
}
}
}
@ -2062,7 +2062,8 @@ set_colour_attribute(zattr atr, int fg_bg, int flags)
*bv->bp++ = Outpar;
}
} else {
tputs(tgoto(tcstr[tc], colour, colour), 1, putshout);
tputs(tgoto(tcstr[tc], colour, colour), 1,
(flags & TSC_RAW) ? putraw : putshout);
}
/* That worked. */
return;
@ -2121,7 +2122,7 @@ set_colour_attribute(zattr atr, int fg_bg, int flags)
*bv->bp++ = Outpar;
}
} else
tputs(colseq_buf, 1, putshout);
tputs(colseq_buf, 1, (flags & TSC_RAW) ? putraw : putshout);
if (do_free)
free_colour_buffer();