diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2008-05-16 09:37:56 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2008-05-16 09:37:56 +0000 |
commit | 9533b19dad964fc9aa001f69146d356c42769a70 (patch) | |
tree | 53a556e60f52e74aaeed8163480a4e99d8b4e665 | |
parent | 02e0a4755f47f1eb720d5b81b37cc8e3d3a453ac (diff) | |
download | zsh-9533b19dad964fc9aa001f69146d356c42769a70.tar.gz zsh-9533b19dad964fc9aa001f69146d356c42769a70.tar.xz zsh-9533b19dad964fc9aa001f69146d356c42769a70.zip |
25051: add colour sequences to formatting strings in completion
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/Zle/complist.c | 30 | ||||
-rw-r--r-- | Src/Zle/zle_tricky.c | 29 | ||||
-rw-r--r-- | Src/prompt.c | 4 |
4 files changed, 63 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog index 54b6520d1..5243ec8db 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-05-16 Peter Stephenson <pws@csr.com> + + * 25051: Src/prompt.c, Src/complist.c, Src/zle_tricky.c: + add %F, %K, %f, %k handling to formatting strings for completion. + 2008-05-15 Peter Stephenson <pws@csr.com> * 25040: Src/builtin.c, Src/utils.c, Src/Modules/zpty.c: diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c index e513a8475..6e0a89a47 100644 --- a/Src/Zle/complist.c +++ b/Src/Zle/complist.c @@ -1046,6 +1046,8 @@ compprintfmt(char *fmt, int n, int dopr, int doesc, int ml, int *stop) if (doesc && cchar == ZWC('%')) { p += len; if (*p) { + int arg = 0, is_fg; + len = MB_METACHARLENCONV(p, &cchar); #ifdef MULTIBYTE_SUPPORT if (cchar == WEOF) @@ -1053,6 +1055,9 @@ compprintfmt(char *fmt, int n, int dopr, int doesc, int ml, int *stop) #endif p += len; + if (idigit(*p)) + arg = zstrtol(p, &p, 10); + m = 0; switch (cchar) { case ZWC('%'): @@ -1099,7 +1104,32 @@ compprintfmt(char *fmt, int n, int dopr, int doesc, int ml, int *stop) if (dopr) tcout(TCUNDERLINEEND); break; + case ZWC('F'): + case ZWC('K'): + is_fg = (cchar == ZWC('F')); + /* colours must be ASCII */ + if (*p == '{') { + p++; + arg = match_colour((const char **)&p, is_fg, 0); + if (*p == '}') + p++; + } else + arg = match_colour(NULL, is_fg, arg); + if (arg >= 0 && dopr) + set_colour_attribute(arg, is_fg ? COL_SEQ_FG : + COL_SEQ_BG, 0); + break; + case ZWC('f'): + if (dopr) + set_colour_attribute(TXTNOFGCOLOUR, COL_SEQ_FG, 0); + break; + case ZWC('k'): + if (dopr) + set_colour_attribute(TXTNOBGCOLOUR, COL_SEQ_BG, 0); + break; case ZWC('{'): + if (arg) + cc += arg; for (; *p && (*p != '%' || p[1] != '}'); p++) if (dopr) putc(*p == Meta ? *++p ^ 32 : *p, shout); diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c index a6083764b..4786f30de 100644 --- a/Src/Zle/zle_tricky.c +++ b/Src/Zle/zle_tricky.c @@ -2272,7 +2272,10 @@ printfmt(char *fmt, int n, int dopr, int doesc) for (; *p; ) { /* Handle the `%' stuff (%% == %, %n == <number of matches>). */ if (doesc && *p == '%') { - if (*++p) { + int arg = 0, is_fg; + if (idigit(*++p)) + arg = zstrtol(p, &p, 10); + if (*p) { m = 0; switch (*p) { case '%': @@ -2316,11 +2319,33 @@ printfmt(char *fmt, int n, int dopr, int doesc) if (dopr) tcout(TCUNDERLINEEND); break; + case 'F': + case 'K': + is_fg = (*p == 'F'); + if (p[1] == '{') { + p += 2; + arg = match_colour((const char **)&p, is_fg, 0); + if (*p != '}') + p--; + } else + arg = match_colour(NULL, is_fg, arg); + if (arg >= 0) + set_colour_attribute(arg, is_fg ? COL_SEQ_FG : + COL_SEQ_BG, 0); + break; + case 'f': + set_colour_attribute(TXTNOFGCOLOUR, COL_SEQ_FG, 0); + break; + case 'k': + set_colour_attribute(TXTNOBGCOLOUR, COL_SEQ_BG, 0); + break; case '{': + if (arg) + cc += arg; for (p++; *p && (*p != '%' || p[1] != '}'); p++) { if (*p == Meta) { p++; - if (dopr) + if (dopr) putc(*p ^ 32, shout); } else if (dopr) diff --git a/Src/prompt.c b/Src/prompt.c index 004080577..034a4fa29 100644 --- a/Src/prompt.c +++ b/Src/prompt.c @@ -471,7 +471,6 @@ putpromptchar(int doprint, int endchar, unsigned int *txtchangep) break; } /* else FALLTHROUGH */ - break; case 'f': txtchangeset(txtchangep, TXTNOFGCOLOUR, TXT_ATTR_FG_ON_MASK); txtunset(TXT_ATTR_FG_ON_MASK); @@ -493,7 +492,6 @@ putpromptchar(int doprint, int endchar, unsigned int *txtchangep) break; } /* else FALLTHROUGH */ - break; case 'k': txtchangeset(txtchangep, TXTNOBGCOLOUR, TXT_ATTR_BG_ON_MASK); txtunset(TXT_ATTR_BG_ON_MASK); @@ -1472,7 +1470,7 @@ match_named_colour(const char **teststrp) */ /**/ -static int +mod_export int match_colour(const char **teststrp, int is_fg, int colour) { int shft, on, named = 0, tc; |