diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | Doc/Zsh/mod_watch.yo | 6 | ||||
-rw-r--r-- | Src/Modules/watch.c | 35 | ||||
-rw-r--r-- | Src/prompt.c | 9 |
4 files changed, 49 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index cb5d4564e..2fd7926ab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/Doc/Zsh/mod_watch.yo b/Doc/Zsh/mod_watch.yo index 4eea89e23..d97a41d13 100644 --- a/Doc/Zsh/mod_watch.yo +++ b/Doc/Zsh/mod_watch.yo @@ -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. ) diff --git a/Src/Modules/watch.c b/Src/Modules/watch.c index 95d591a67..d45c3cf3d 100644 --- a/Src/Modules/watch.c +++ b/Src/Modules/watch.c @@ -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); diff --git a/Src/prompt.c b/Src/prompt.c index 6943eabc3..d6b378539 100644 --- a/Src/prompt.c +++ b/Src/prompt.c @@ -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(); |