From 391c36279415d0b8c5dba1ba11b668add04be963 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 29 Sep 2020 20:59:17 +0200 Subject: patch 8.2.1771: synIDattr() cannot get the value of ctermul Problem: synIDattr() cannot get the value of ctermul. Solution: Add the "ul" value for "what". (closes #7037) --- runtime/doc/eval.txt | 4 +++- src/evalfunc.c | 4 +++- src/highlight.c | 7 ++++++- src/testdir/test_highlight.vim | 1 + src/version.c | 2 ++ 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 58c390ebb..6bf205d4e 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -10348,7 +10348,9 @@ synIDattr({synID}, {what} [, {mode}]) *synIDattr()* "bg" background color (as with "fg") "font" font name (only available in the GUI) |highlight-font| - "sp" special color (as with "fg") |highlight-guisp| + "sp" special color for the GUI (as with "fg") + |highlight-guisp| + "ul" underline color for cterm: number as a string "fg#" like "fg", but for the GUI and the GUI is running the name in "#RRGGBB" form "bg#" like "fg#" for "bg" diff --git a/src/evalfunc.c b/src/evalfunc.c index 2af4bc00d..cf1e26533 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -8604,7 +8604,9 @@ f_synIDattr(typval_T *argvars UNUSED, typval_T *rettv) break; case 'u': - if (STRLEN(what) <= 5 || TOLOWER_ASC(what[5]) != 'c') + if (TOLOWER_ASC(what[1]) == 'l') // ul + p = highlight_color(id, what, modec); + else if (STRLEN(what) <= 5 || TOLOWER_ASC(what[5]) != 'c') // underline p = highlight_has_attr(id, HL_UNDERLINE, modec); else diff --git a/src/highlight.c b/src/highlight.c index 0a014473b..56b198883 100644 --- a/src/highlight.c +++ b/src/highlight.c @@ -2684,13 +2684,14 @@ highlight_has_attr( char_u * highlight_color( int id, - char_u *what, // "font", "fg", "bg", "sp", "fg#", "bg#" or "sp#" + char_u *what, // "font", "fg", "bg", "sp", "ul", "fg#", "bg#" or "sp#" int modec) // 'g' for GUI, 'c' for cterm, 't' for term { static char_u name[20]; int n; int fg = FALSE; int sp = FALSE; + int ul = FALSE; int font = FALSE; if (id <= 0 || id > highlight_ga.ga_len) @@ -2703,6 +2704,8 @@ highlight_color( font = TRUE; else if (TOLOWER_ASC(what[0]) == 's' && TOLOWER_ASC(what[1]) == 'p') sp = TRUE; + else if (TOLOWER_ASC(what[0]) == 'u' && TOLOWER_ASC(what[1]) == 'l') + ul = TRUE; else if (!(TOLOWER_ASC(what[0]) == 'b' && TOLOWER_ASC(what[1]) == 'g')) return NULL; if (modec == 'g') @@ -2749,6 +2752,8 @@ highlight_color( { if (fg) n = HL_TABLE()[id - 1].sg_cterm_fg - 1; + else if (ul) + n = HL_TABLE()[id - 1].sg_cterm_ul - 1; else n = HL_TABLE()[id - 1].sg_cterm_bg - 1; if (n < 0) diff --git a/src/testdir/test_highlight.vim b/src/testdir/test_highlight.vim index 05f215ae3..8bd03e2da 100644 --- a/src/testdir/test_highlight.vim +++ b/src/testdir/test_highlight.vim @@ -808,6 +808,7 @@ func Test_highlight_ctermul() call assert_notmatch('ctermul=', HighlightArgs('Normal')) highlight Normal ctermul=3 call assert_match('ctermul=3', HighlightArgs('Normal')) + call assert_equal('3', synIDattr(synIDtrans(hlID('Normal')), 'ul')) highlight Normal ctermul=NONE endfunc diff --git a/src/version.c b/src/version.c index 26e63c2bd..d390212d8 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1771, /**/ 1770, /**/ -- cgit v1.2.1