Merge pull request #6700 from bfredl/winhl

window specific ui highlighting: part 2
This commit is contained in:
Björn Linse 2017-06-14 20:32:16 +02:00 committed by GitHub
commit 7918845215
11 changed files with 548 additions and 359 deletions

View File

@ -6778,9 +6778,16 @@ A jump table for the options with a short description can be found at |Q_op|.
Window-local highlights. Comma-delimited list of |group-name| pairs Window-local highlights. Comma-delimited list of |group-name| pairs
"{hl-builtin}:{hl-group},..." where each {hl-builtin} is a group (from "{hl-builtin}:{hl-group},..." where each {hl-builtin} is a group (from
|highlight-groups|) to be overridden by {hl-group} in the window where |highlight-groups|) to be overridden by {hl-group} in the window where
this option was set. this option was set. Only builting ui highlights are supported, not
Currently |hl-Normal| and |hl-NormalNC| can be overridden. syntax highlighting. For that purpose, use |:ownsyntax|.
Useful for changing the background color. Example: >
Most highlights occuring within the frame of a window are supported.
Highlights of vertical separators are determined by the window to the
left of the separator. The highlight of a tabpage in |tabline| is
determined by the last focused window in the tabpage. Highlights of
the popupmenu are determined by the current window. Highlights in the
message area are not overridable. Example for overriding the
backgrond color: >
set winhighlight=Normal:MyNormal,NormalNC:MyNormalNC set winhighlight=Normal:MyNormal,NormalNC:MyNormalNC
< <
*'winfixheight'* *'wfh'* *'nowinfixheight'* *'nowfh'* *'winfixheight'* *'wfh'* *'nowinfixheight'* *'nowfh'*

View File

@ -18,6 +18,8 @@ typedef struct {
// for garray_T // for garray_T
#include "nvim/garray.h" #include "nvim/garray.h"
// for HLF_COUNT
#include "nvim/highlight_defs.h"
// for pos_T, lpos_T and linenr_T // for pos_T, lpos_T and linenr_T
#include "nvim/pos.h" #include "nvim/pos.h"
// for the number window-local and buffer-local options // for the number window-local and buffer-local options
@ -936,9 +938,13 @@ struct window_S {
synblock_T *w_s; /* for :ownsyntax */ synblock_T *w_s; /* for :ownsyntax */
int w_hl_id; ///< 'winhighlight' id int w_hl_id_normal; ///< 'winhighlight' normal id
int w_hl_id_inactive; ///< 'winhighlight' id for inactive window int w_hl_attr_normal; ///< 'winhighlight' normal final attrs
int w_hl_attr; ///< 'winhighlight' final attrs
int w_hl_ids[HLF_COUNT]; ///< 'winhighlight' id
int w_hl_attrs[HLF_COUNT]; ///< 'winhighlight' final attrs
int w_hl_needs_update; ///< attrs need to be recalculated
win_T *w_prev; /* link to previous window */ win_T *w_prev; /* link to previous window */
win_T *w_next; /* link to next window */ win_T *w_next; /* link to next window */
@ -1169,4 +1175,9 @@ struct window_S {
qf_info_T *w_llist_ref; qf_info_T *w_llist_ref;
}; };
static inline int win_hl_attr(win_T *wp, int hlf)
{
return wp->w_hl_attrs[hlf];
}
#endif // NVIM_BUFFER_DEFS_H #endif // NVIM_BUFFER_DEFS_H

View File

@ -439,124 +439,6 @@ EXTERN int did_check_timestamps INIT(= FALSE); /* did check timestamps
recently */ recently */
EXTERN int no_check_timestamps INIT(= 0); /* Don't check timestamps */ EXTERN int no_check_timestamps INIT(= 0); /* Don't check timestamps */
/*
* Values for index in highlight_attr[].
* When making changes, also update hlf_names below!
*/
typedef enum {
HLF_8 = 0 /* Meta & special keys listed with ":map", text that is
displayed different from what it is */
, HLF_EOB // after the last line in the buffer
, HLF_TERM // terminal cursor focused
, HLF_TERMNC // terminal cursor unfocused
, HLF_AT // @ characters at end of screen, characters that
// don't really exist in the text
, HLF_D // directories in CTRL-D listing
, HLF_E // error messages
, HLF_I // incremental search
, HLF_L // last search string
, HLF_M // "--More--" message
, HLF_CM // Mode (e.g., "-- INSERT --")
, HLF_N // line number for ":number" and ":#" commands
, HLF_CLN // current line number
, HLF_R // return to continue message and yes/no questions
, HLF_S // status lines
, HLF_SNC // status lines of not-current windows
, HLF_C // column to separate vertically split windows
, HLF_T // Titles for output from ":set all", ":autocmd" etc.
, HLF_V // Visual mode
, HLF_VNC // Visual mode, autoselecting and not clipboard owner
, HLF_W // warning messages
, HLF_WM // Wildmenu highlight
, HLF_FL // Folded line
, HLF_FC // Fold column
, HLF_ADD // Added diff line
, HLF_CHD // Changed diff line
, HLF_DED // Deleted diff line
, HLF_TXD // Text Changed in diff line
, HLF_SC // Sign column
, HLF_CONCEAL // Concealed text
, HLF_SPB // SpellBad
, HLF_SPC // SpellCap
, HLF_SPR // SpellRare
, HLF_SPL // SpellLocal
, HLF_PNI // popup menu normal item
, HLF_PSI // popup menu selected item
, HLF_PSB // popup menu scrollbar
, HLF_PST // popup menu scrollbar thumb
, HLF_TP // tabpage line
, HLF_TPS // tabpage line selected
, HLF_TPF // tabpage line filler
, HLF_CUC // 'cursurcolumn'
, HLF_CUL // 'cursurline'
, HLF_MC // 'colorcolumn'
, HLF_QFL // selected quickfix line
, HLF_0 // Whitespace
, HLF_INACTIVE // NormalNC: Normal text in non-current windows
, HLF_COUNT // MUST be the last one
} hlf_T;
EXTERN const char *hlf_names[] INIT(= {
[HLF_8] = "SpecialKey",
[HLF_EOB] = "EndOfBuffer",
[HLF_TERM] = "TermCursor",
[HLF_TERMNC] = "TermCursorNC",
[HLF_AT] = "NonText",
[HLF_D] = "Directory",
[HLF_E] = "ErrorMsg",
[HLF_I] = "IncSearch",
[HLF_L] = "Search",
[HLF_M] = "MoreMsg",
[HLF_CM] = "ModeMsg",
[HLF_N] = "LineNr",
[HLF_CLN] = "CursorLineNr",
[HLF_R] = "Question",
[HLF_S] = "StatusLine",
[HLF_SNC] = "StatusLineNC",
[HLF_C] = "VertSplit",
[HLF_T] = "Title",
[HLF_V] = "Visual",
[HLF_VNC] = "VisualNOS",
[HLF_W] = "WarningMsg",
[HLF_WM] = "WildMenu",
[HLF_FL] = "Folded",
[HLF_FC] = "FoldColumn",
[HLF_ADD] = "DiffAdd",
[HLF_CHD] = "DiffChange",
[HLF_DED] = "DiffDelete",
[HLF_TXD] = "DiffText",
[HLF_SC] = "SignColumn",
[HLF_CONCEAL] = "Conceal",
[HLF_SPB] = "SpellBad",
[HLF_SPC] = "SpellCap",
[HLF_SPR] = "SpellRare",
[HLF_SPL] = "SpellLocal",
[HLF_PNI] = "Pmenu",
[HLF_PSI] = "PmenuSel",
[HLF_PSB] = "PmenuSbar",
[HLF_PST] = "PmenuThumb",
[HLF_TP] = "TabLine",
[HLF_TPS] = "TabLineSel",
[HLF_TPF] = "TabLineFill",
[HLF_CUC] = "CursorColumn",
[HLF_CUL] = "CursorLine",
[HLF_MC] = "ColorColumn",
[HLF_QFL] = "QuickFixLine",
[HLF_0] = "Whitespace",
[HLF_INACTIVE] = "NormalNC",
});
EXTERN int highlight_attr[HLF_COUNT]; /* Highl. attr for each context. */
EXTERN int highlight_user[9]; /* User[1-9] attributes */
EXTERN int highlight_stlnc[9]; /* On top of user */
EXTERN int cterm_normal_fg_color INIT(= 0);
EXTERN int cterm_normal_fg_bold INIT(= 0);
EXTERN int cterm_normal_bg_color INIT(= 0);
EXTERN RgbValue normal_fg INIT(= -1);
EXTERN RgbValue normal_bg INIT(= -1);
EXTERN RgbValue normal_sp INIT(= -1);
EXTERN int autocmd_busy INIT(= FALSE); /* Is apply_autocmds() busy? */ EXTERN int autocmd_busy INIT(= FALSE); /* Is apply_autocmds() busy? */
EXTERN int autocmd_no_enter INIT(= FALSE); /* *Enter autocmds disabled */ EXTERN int autocmd_no_enter INIT(= FALSE); /* *Enter autocmds disabled */
EXTERN int autocmd_no_leave INIT(= FALSE); /* *Leave autocmds disabled */ EXTERN int autocmd_no_leave INIT(= FALSE); /* *Leave autocmds disabled */

126
src/nvim/highlight_defs.h Normal file
View File

@ -0,0 +1,126 @@
#ifndef NVIM_HIGHLIGHT_DEFS_H
#define NVIM_HIGHLIGHT_DEFS_H
#include <inttypes.h>
#include "nvim/macros.h"
typedef int32_t RgbValue;
/// Values for index in highlight_attr[].
/// When making changes, also update hlf_names below!
typedef enum {
HLF_8 = 0 // Meta & special keys listed with ":map", text that is
// displayed different from what it is
, HLF_EOB // after the last line in the buffer
, HLF_TERM // terminal cursor focused
, HLF_TERMNC // terminal cursor unfocused
, HLF_AT // @ characters at end of screen, characters that
// don't really exist in the text
, HLF_D // directories in CTRL-D listing
, HLF_E // error messages
, HLF_I // incremental search
, HLF_L // last search string
, HLF_M // "--More--" message
, HLF_CM // Mode (e.g., "-- INSERT --")
, HLF_N // line number for ":number" and ":#" commands
, HLF_CLN // current line number
, HLF_R // return to continue message and yes/no questions
, HLF_S // status lines
, HLF_SNC // status lines of not-current windows
, HLF_C // column to separate vertically split windows
, HLF_T // Titles for output from ":set all", ":autocmd" etc.
, HLF_V // Visual mode
, HLF_VNC // Visual mode, autoselecting and not clipboard owner
, HLF_W // warning messages
, HLF_WM // Wildmenu highlight
, HLF_FL // Folded line
, HLF_FC // Fold column
, HLF_ADD // Added diff line
, HLF_CHD // Changed diff line
, HLF_DED // Deleted diff line
, HLF_TXD // Text Changed in diff line
, HLF_SC // Sign column
, HLF_CONCEAL // Concealed text
, HLF_SPB // SpellBad
, HLF_SPC // SpellCap
, HLF_SPR // SpellRare
, HLF_SPL // SpellLocal
, HLF_PNI // popup menu normal item
, HLF_PSI // popup menu selected item
, HLF_PSB // popup menu scrollbar
, HLF_PST // popup menu scrollbar thumb
, HLF_TP // tabpage line
, HLF_TPS // tabpage line selected
, HLF_TPF // tabpage line filler
, HLF_CUC // 'cursurcolumn'
, HLF_CUL // 'cursurline'
, HLF_MC // 'colorcolumn'
, HLF_QFL // selected quickfix line
, HLF_0 // Whitespace
, HLF_INACTIVE // NormalNC: Normal text in non-current windows
, HLF_COUNT // MUST be the last one
} hlf_T;
EXTERN const char *hlf_names[] INIT(= {
[HLF_8] = "SpecialKey",
[HLF_EOB] = "EndOfBuffer",
[HLF_TERM] = "TermCursor",
[HLF_TERMNC] = "TermCursorNC",
[HLF_AT] = "NonText",
[HLF_D] = "Directory",
[HLF_E] = "ErrorMsg",
[HLF_I] = "IncSearch",
[HLF_L] = "Search",
[HLF_M] = "MoreMsg",
[HLF_CM] = "ModeMsg",
[HLF_N] = "LineNr",
[HLF_CLN] = "CursorLineNr",
[HLF_R] = "Question",
[HLF_S] = "StatusLine",
[HLF_SNC] = "StatusLineNC",
[HLF_C] = "VertSplit",
[HLF_T] = "Title",
[HLF_V] = "Visual",
[HLF_VNC] = "VisualNC",
[HLF_W] = "WarningMsg",
[HLF_WM] = "WildMenu",
[HLF_FL] = "Folded",
[HLF_FC] = "FoldColumn",
[HLF_ADD] = "DiffAdd",
[HLF_CHD] = "DiffChange",
[HLF_DED] = "DiffDelete",
[HLF_TXD] = "DiffText",
[HLF_SC] = "SignColumn",
[HLF_CONCEAL] = "Conceal",
[HLF_SPB] = "SpellBad",
[HLF_SPC] = "SpellCap",
[HLF_SPR] = "SpellRare",
[HLF_SPL] = "SpellLocal",
[HLF_PNI] = "Pmenu",
[HLF_PSI] = "PmenuSel",
[HLF_PSB] = "PmenuSbar",
[HLF_PST] = "PmenuThumb",
[HLF_TP] = "TabLine",
[HLF_TPS] = "TabLineSel",
[HLF_TPF] = "TabLineFill",
[HLF_CUC] = "CursorColumn",
[HLF_CUL] = "CursorLine",
[HLF_MC] = "ColorColumn",
[HLF_QFL] = "QuickFixLine",
[HLF_0] = "Whitespace",
[HLF_INACTIVE] = "NormalNC"
});
EXTERN int highlight_attr[HLF_COUNT]; // Highl. attr for each context.
EXTERN int highlight_user[9]; // User[1-9] attributes
EXTERN int highlight_stlnc[9]; // On top of user
EXTERN int cterm_normal_fg_color INIT(= 0);
EXTERN int cterm_normal_fg_bold INIT(= 0);
EXTERN int cterm_normal_bg_color INIT(= 0);
EXTERN RgbValue normal_fg INIT(= -1);
EXTERN RgbValue normal_bg INIT(= -1);
EXTERN RgbValue normal_sp INIT(= -1);
#endif // NVIM_HIGHLIGHT_DEFS_H

View File

@ -3579,7 +3579,9 @@ static char_u *compile_cap_prog(synblock_T *synblock)
/// Handle setting `winhighlight' in window "wp" /// Handle setting `winhighlight' in window "wp"
static bool parse_winhl_opt(win_T *wp) static bool parse_winhl_opt(win_T *wp)
{ {
int w_hl_id = 0, w_hl_id_inactive = 0; int w_hl_id_normal = 0;
int w_hl_ids[HLF_COUNT] = { 0 };
int hlf;
const char *p = (const char *)wp->w_p_winhl; const char *p = (const char *)wp->w_p_winhl;
while (*p) { while (*p) {
@ -3593,18 +3595,25 @@ static bool parse_winhl_opt(win_T *wp)
int hl_id = syn_check_group((char_u *)hi, (int)(commap-hi)); int hl_id = syn_check_group((char_u *)hi, (int)(commap-hi));
if (strncmp("Normal", p, nlen) == 0) { if (strncmp("Normal", p, nlen) == 0) {
w_hl_id = hl_id; w_hl_id_normal = hl_id;
} else if (strncmp("NormalNC", p, nlen) == 0) {
w_hl_id_inactive = hl_id;
} else { } else {
for (hlf = 0; hlf < (int)HLF_COUNT; hlf++) {
if (strncmp(hlf_names[hlf], p, nlen) == 0) {
w_hl_ids[hlf] = hl_id;
break;
}
}
if (hlf == HLF_COUNT) {
return false; return false;
} }
}
p = *commap ? commap+1 : ""; p = *commap ? commap+1 : "";
} }
wp->w_hl_id = w_hl_id; wp->w_hl_id_normal = w_hl_id_normal;
wp->w_hl_id_inactive = w_hl_id_inactive; memcpy(wp->w_hl_ids, w_hl_ids, sizeof(w_hl_ids));
wp->w_hl_needs_update = true;
return true; return true;
} }

View File

@ -307,10 +307,10 @@ void pum_redraw(void)
{ {
int row = pum_row; int row = pum_row;
int col; int col;
int attr_norm = highlight_attr[HLF_PNI]; int attr_norm = win_hl_attr(curwin, HLF_PNI);
int attr_select = highlight_attr[HLF_PSI]; int attr_select = win_hl_attr(curwin, HLF_PSI);
int attr_scroll = highlight_attr[HLF_PSB]; int attr_scroll = win_hl_attr(curwin, HLF_PSB);
int attr_thumb = highlight_attr[HLF_PST]; int attr_thumb = win_hl_attr(curwin, HLF_PST);
int attr; int attr;
int i; int i;
int idx; int idx;

View File

@ -155,7 +155,6 @@ static schar_T *current_ScreenLine;
StlClickDefinition *tab_page_click_defs = NULL; StlClickDefinition *tab_page_click_defs = NULL;
long tab_page_click_defs_size = 0; long tab_page_click_defs_size = 0;
# define SCREEN_LINE(r, o, e, c, rl) screen_line((r), (o), (e), (c), (rl))
#ifdef INCLUDE_GENERATED_DECLARATIONS #ifdef INCLUDE_GENERATED_DECLARATIONS
# include "screen.c.generated.h" # include "screen.c.generated.h"
#endif #endif
@ -380,15 +379,24 @@ void update_screen(int type)
)) ))
curwin->w_redr_type = type; curwin->w_redr_type = type;
/* Redraw the tab pages line if needed. */ // Redraw the tab pages line if needed.
if (redraw_tabline || type >= NOT_VALID) if (redraw_tabline || type >= NOT_VALID) {
update_window_hl(curwin, type >= NOT_VALID);
FOR_ALL_TABS(tp) {
if (tp != curtab) {
update_window_hl(tp->tp_curwin, type >= NOT_VALID);
}
}
draw_tabline(); draw_tabline();
}
/* /*
* Correct stored syntax highlighting info for changes in each displayed * Correct stored syntax highlighting info for changes in each displayed
* buffer. Each buffer must only be done once. * buffer. Each buffer must only be done once.
*/ */
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
update_window_hl(wp, type >= NOT_VALID);
if (wp->w_buffer->b_mod_set) { if (wp->w_buffer->b_mod_set) {
win_T *wwp; win_T *wwp;
@ -1488,11 +1496,11 @@ static void win_update(win_T *wp)
// Last line isn't finished: Display "@@@" in the last screen line. // Last line isn't finished: Display "@@@" in the last screen line.
screen_puts_len((char_u *)"@@", 2, scr_row, wp->w_wincol, screen_puts_len((char_u *)"@@", 2, scr_row, wp->w_wincol,
hl_attr(HLF_AT)); win_hl_attr(wp, HLF_AT));
screen_fill(scr_row, scr_row + 1, screen_fill(scr_row, scr_row + 1,
(int)wp->w_wincol + 2, (int)W_ENDCOL(wp), (int)wp->w_wincol + 2, (int)W_ENDCOL(wp),
'@', ' ', hl_attr(HLF_AT)); '@', ' ', win_hl_attr(wp, HLF_AT));
set_empty_rows(wp, srow); set_empty_rows(wp, srow);
wp->w_botline = lnum; wp->w_botline = lnum;
} else if (dy_flags & DY_LASTLINE) { // 'display' has "lastline" } else if (dy_flags & DY_LASTLINE) { // 'display' has "lastline"
@ -1500,7 +1508,7 @@ static void win_update(win_T *wp)
screen_fill(wp->w_winrow + wp->w_height - 1, screen_fill(wp->w_winrow + wp->w_height - 1,
wp->w_winrow + wp->w_height, wp->w_winrow + wp->w_height,
W_ENDCOL(wp) - 3, W_ENDCOL(wp), W_ENDCOL(wp) - 3, W_ENDCOL(wp),
'@', '@', hl_attr(HLF_AT)); '@', '@', win_hl_attr(wp, HLF_AT));
set_empty_rows(wp, srow); set_empty_rows(wp, srow);
wp->w_botline = lnum; wp->w_botline = lnum;
} else { } else {
@ -1584,10 +1592,7 @@ static void win_draw_end(win_T *wp, int c1, int c2, int row, int endrow, hlf_T h
# define FDC_OFF n # define FDC_OFF n
int fdc = compute_foldcolumn(wp, 0); int fdc = compute_foldcolumn(wp, 0);
int attr = hl_attr(hl); int attr = win_hl_attr(wp, hl);
if (wp->w_hl_attr != 0) {
attr = hl_combine_attr(wp->w_hl_attr, attr);
}
if (wp->w_p_rl) { if (wp->w_p_rl) {
// No check for cmdline window: should never be right-left. // No check for cmdline window: should never be right-left.
@ -1599,7 +1604,7 @@ static void win_draw_end(win_T *wp, int c1, int c2, int row, int endrow, hlf_T h
n = wp->w_width; n = wp->w_width;
screen_fill(wp->w_winrow + row, wp->w_winrow + endrow, screen_fill(wp->w_winrow + row, wp->w_winrow + endrow,
W_ENDCOL(wp) - n, W_ENDCOL(wp), W_ENDCOL(wp) - n, W_ENDCOL(wp),
' ', ' ', hl_attr(HLF_FC)); ' ', ' ', win_hl_attr(wp, HLF_FC));
} }
if (signcolumn_on(wp)) { if (signcolumn_on(wp)) {
@ -1611,7 +1616,7 @@ static void win_draw_end(win_T *wp, int c1, int c2, int row, int endrow, hlf_T h
} }
screen_fill(wp->w_winrow + row, wp->w_winrow + endrow, screen_fill(wp->w_winrow + row, wp->w_winrow + endrow,
W_ENDCOL(wp) - nn, W_ENDCOL(wp) - n, W_ENDCOL(wp) - nn, W_ENDCOL(wp) - n,
' ', ' ', hl_attr(HLF_SC)); ' ', ' ', win_hl_attr(wp, HLF_SC));
n = nn; n = nn;
} }
@ -1629,7 +1634,7 @@ static void win_draw_end(win_T *wp, int c1, int c2, int row, int endrow, hlf_T h
n = wp->w_width; n = wp->w_width;
screen_fill(wp->w_winrow + row, wp->w_winrow + endrow, screen_fill(wp->w_winrow + row, wp->w_winrow + endrow,
wp->w_wincol, wp->w_wincol + n, wp->w_wincol, wp->w_wincol + n,
cmdwin_type, ' ', hl_attr(HLF_AT)); cmdwin_type, ' ', win_hl_attr(wp, HLF_AT));
} }
if (fdc > 0) { if (fdc > 0) {
int nn = n + fdc; int nn = n + fdc;
@ -1639,7 +1644,7 @@ static void win_draw_end(win_T *wp, int c1, int c2, int row, int endrow, hlf_T h
nn = wp->w_width; nn = wp->w_width;
screen_fill(wp->w_winrow + row, wp->w_winrow + endrow, screen_fill(wp->w_winrow + row, wp->w_winrow + endrow,
wp->w_wincol + n, wp->w_wincol + nn, wp->w_wincol + n, wp->w_wincol + nn,
' ', ' ', hl_attr(HLF_FC)); ' ', ' ', win_hl_attr(wp, HLF_FC));
n = nn; n = nn;
} }
@ -1652,7 +1657,7 @@ static void win_draw_end(win_T *wp, int c1, int c2, int row, int endrow, hlf_T h
} }
screen_fill(wp->w_winrow + row, wp->w_winrow + endrow, screen_fill(wp->w_winrow + row, wp->w_winrow + endrow,
wp->w_wincol + n, wp->w_wincol + nn, wp->w_wincol + n, wp->w_wincol + nn,
' ', ' ', hl_attr(HLF_SC)); ' ', ' ', win_hl_attr(wp, HLF_SC));
n = nn; n = nn;
} }
@ -1720,10 +1725,9 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
*/ */
if (cmdwin_type != 0 && wp == curwin) { if (cmdwin_type != 0 && wp == curwin) {
ScreenLines[off] = cmdwin_type; ScreenLines[off] = cmdwin_type;
ScreenAttrs[off] = hl_attr(HLF_AT); ScreenAttrs[off] = win_hl_attr(wp, HLF_AT);
if (enc_utf8)
ScreenLinesUC[off] = 0; ScreenLinesUC[off] = 0;
++col; col++;
} }
// 2. Add the 'foldcolumn' // 2. Add the 'foldcolumn'
@ -1735,12 +1739,14 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
int i; int i;
copy_text_attr(off + wp->w_width - fdc - col, buf, fdc, copy_text_attr(off + wp->w_width - fdc - col, buf, fdc,
hl_attr(HLF_FC)); win_hl_attr(wp, HLF_FC));
/* reverse the fold column */ // reverse the fold column
for (i = 0; i < fdc; ++i) for (i = 0; i < fdc; i++) {
ScreenLines[off + wp->w_width - i - 1 - col] = buf[i]; ScreenLines[off + wp->w_width - i - 1 - col] = buf[i];
} else }
copy_text_attr(off + col, buf, fdc, hl_attr(HLF_FC)); } else {
copy_text_attr(off + col, buf, fdc, win_hl_attr(wp, HLF_FC));
}
col += fdc; col += fdc;
} }
@ -1753,7 +1759,7 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
/* Set all attributes of the 'number' or 'relativenumber' column and the /* Set all attributes of the 'number' or 'relativenumber' column and the
* text */ * text */
RL_MEMSET(col, hl_attr(HLF_FL), wp->w_width - col); RL_MEMSET(col, win_hl_attr(wp, HLF_FL), wp->w_width - col);
// If signs are being displayed, add two spaces. // If signs are being displayed, add two spaces.
if (signcolumn_on(wp)) { if (signcolumn_on(wp)) {
@ -1762,7 +1768,8 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
if (len > 2) { if (len > 2) {
len = 2; len = 2;
} }
copy_text_attr(off + col, (char_u *)" ", len, hl_attr(HLF_FL)); copy_text_attr(off + col, (char_u *)" ", len,
win_hl_attr(wp, HLF_FL));
col += len; col += len;
} }
} }
@ -1794,13 +1801,14 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
} }
} }
sprintf((char *)buf, fmt, w, num); snprintf((char *)buf, FOLD_TEXT_LEN, fmt, w, num);
if (wp->w_p_rl) if (wp->w_p_rl) {
/* the line number isn't reversed */ // the line number isn't reversed
copy_text_attr(off + wp->w_width - len - col, buf, len, copy_text_attr(off + wp->w_width - len - col, buf, len,
hl_attr(HLF_FL)); win_hl_attr(wp, HLF_FL));
else } else {
copy_text_attr(off + col, buf, len, hl_attr(HLF_FL)); copy_text_attr(off + col, buf, len, win_hl_attr(wp, HLF_FL));
}
col += len; col += len;
} }
} }
@ -1958,12 +1966,12 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
len = wp->w_old_cursor_lcol; len = wp->w_old_cursor_lcol;
else else
len = wp->w_width - txtcol; len = wp->w_width - txtcol;
RL_MEMSET(wp->w_old_cursor_fcol + txtcol, hl_attr(HLF_V), RL_MEMSET(wp->w_old_cursor_fcol + txtcol, win_hl_attr(wp, HLF_V),
len - (int)wp->w_old_cursor_fcol); len - (int)wp->w_old_cursor_fcol);
} }
} else { } else {
/* Set all attributes of the text */ // Set all attributes of the text
RL_MEMSET(txtcol, hl_attr(HLF_V), wp->w_width - txtcol); RL_MEMSET(txtcol, win_hl_attr(wp, HLF_V), wp->w_width - txtcol);
} }
} }
} }
@ -1983,7 +1991,7 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
} }
if (txtcol >= 0 && txtcol < wp->w_width) { if (txtcol >= 0 && txtcol < wp->w_width) {
ScreenAttrs[off + txtcol] = ScreenAttrs[off + txtcol] =
hl_combine_attr(ScreenAttrs[off + txtcol], hl_attr(HLF_MC)); hl_combine_attr(ScreenAttrs[off + txtcol], win_hl_attr(wp, HLF_MC));
} }
txtcol = old_txtcol; txtcol = old_txtcol;
j = wp->w_p_cc_cols[++i]; j = wp->w_p_cc_cols[++i];
@ -1999,11 +2007,11 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
txtcol -= wp->w_leftcol; txtcol -= wp->w_leftcol;
if (txtcol >= 0 && txtcol < wp->w_width) if (txtcol >= 0 && txtcol < wp->w_width)
ScreenAttrs[off + txtcol] = hl_combine_attr( ScreenAttrs[off + txtcol] = hl_combine_attr(
ScreenAttrs[off + txtcol], hl_attr(HLF_CUC)); ScreenAttrs[off + txtcol], win_hl_attr(wp, HLF_CUC));
} }
SCREEN_LINE(row + wp->w_winrow, wp->w_wincol, wp->w_width, screen_line(row + wp->w_winrow, wp->w_wincol, wp->w_width,
wp->w_width, FALSE); wp->w_width, false, wp);
/* /*
* Update w_cline_height and w_cline_folded if the cursor line was * Update w_cline_height and w_cline_folded if the cursor line was
@ -2218,7 +2226,7 @@ win_line (
int syntax_flags = 0; int syntax_flags = 0;
int syntax_seqnr = 0; int syntax_seqnr = 0;
int prev_syntax_id = 0; int prev_syntax_id = 0;
int conceal_attr = hl_attr(HLF_CONCEAL); int conceal_attr = win_hl_attr(wp, HLF_CONCEAL);
int is_concealing = false; int is_concealing = false;
int boguscols = 0; ///< nonexistent columns added to int boguscols = 0; ///< nonexistent columns added to
///< force wrapping ///< force wrapping
@ -2366,8 +2374,8 @@ win_line (
/* if inverting in this line set area_highlighting */ /* if inverting in this line set area_highlighting */
if (fromcol >= 0) { if (fromcol >= 0) {
area_highlighting = TRUE; area_highlighting = true;
attr = hl_attr(HLF_V); attr = win_hl_attr(wp, HLF_V);
} }
} }
/* /*
@ -2391,8 +2399,8 @@ win_line (
/* do at least one character; happens when past end of line */ /* do at least one character; happens when past end of line */
if (fromcol == tocol) if (fromcol == tocol)
tocol = fromcol + 1; tocol = fromcol + 1;
area_highlighting = TRUE; area_highlighting = true;
attr = hl_attr(HLF_I); attr = win_hl_attr(wp, HLF_I);
} }
filler_lines = diff_check(wp, lnum); filler_lines = diff_check(wp, lnum);
@ -2420,11 +2428,11 @@ win_line (
// Highlight the current line in the quickfix window. // Highlight the current line in the quickfix window.
if (bt_quickfix(wp->w_buffer) && qf_current_entry(wp) == lnum) { if (bt_quickfix(wp->w_buffer) && qf_current_entry(wp) == lnum) {
line_attr = hl_attr(HLF_QFL); line_attr = win_hl_attr(wp, HLF_QFL);
} }
if (wp->w_hl_attr != 0) { if (wp->w_hl_attr_normal != 0) {
line_attr = hl_combine_attr(wp->w_hl_attr, line_attr); line_attr = hl_combine_attr(wp->w_hl_attr_normal, line_attr);
} }
if (line_attr != 0) { if (line_attr != 0) {
@ -2652,9 +2660,9 @@ win_line (
&& !(wp == curwin && VIsual_active)) { && !(wp == curwin && VIsual_active)) {
if (line_attr != 0 && !(State & INSERT) && bt_quickfix(wp->w_buffer) if (line_attr != 0 && !(State & INSERT) && bt_quickfix(wp->w_buffer)
&& qf_current_entry(wp) == lnum) { && qf_current_entry(wp) == lnum) {
line_attr = hl_combine_attr(hl_attr(HLF_CUL), line_attr); line_attr = hl_combine_attr(win_hl_attr(wp, HLF_CUL), line_attr);
} else { } else {
line_attr = hl_attr(HLF_CUL); line_attr = win_hl_attr(wp, HLF_CUL);
} }
area_highlighting = true; area_highlighting = true;
} }
@ -2687,7 +2695,7 @@ win_line (
/* Draw the cmdline character. */ /* Draw the cmdline character. */
n_extra = 1; n_extra = 1;
c_extra = cmdwin_type; c_extra = cmdwin_type;
char_attr = hl_attr(HLF_AT); char_attr = win_hl_attr(wp, HLF_AT);
} }
} }
@ -2702,7 +2710,7 @@ win_line (
p_extra = extra; p_extra = extra;
p_extra[n_extra] = NUL; p_extra[n_extra] = NUL;
c_extra = NUL; c_extra = NUL;
char_attr = hl_attr(HLF_FC); char_attr = win_hl_attr(wp, HLF_FC);
} }
} }
@ -2715,7 +2723,7 @@ win_line (
int text_sign; int text_sign;
/* Draw two cells with the sign value or blank. */ /* Draw two cells with the sign value or blank. */
c_extra = ' '; c_extra = ' ';
char_attr = hl_attr(HLF_SC); char_attr = win_hl_attr(wp, HLF_SC);
n_extra = 2; n_extra = 2;
if (row == startrow + filler_lines && filler_todo <= 0) { if (row == startrow + filler_lines && filler_todo <= 0) {
@ -2772,14 +2780,15 @@ win_line (
} else } else
c_extra = ' '; c_extra = ' ';
n_extra = number_width(wp) + 1; n_extra = number_width(wp) + 1;
char_attr = hl_attr(HLF_N); char_attr = win_hl_attr(wp, HLF_N);
/* When 'cursorline' is set highlight the line number of // When 'cursorline' is set highlight the line number of
* the current line differently. // the current line differently.
* TODO: Can we use CursorLine instead of CursorLineNr // TODO(vim): Can we use CursorLine instead of CursorLineNr
* when CursorLineNr isn't set? */ // when CursorLineNr isn't set?
if ((wp->w_p_cul || wp->w_p_rnu) if ((wp->w_p_cul || wp->w_p_rnu)
&& lnum == wp->w_cursor.lnum) && lnum == wp->w_cursor.lnum) {
char_attr = hl_attr(HLF_CLN); char_attr = win_hl_attr(wp, HLF_CLN);
}
} }
} }
@ -2796,12 +2805,12 @@ win_line (
if (draw_state == WL_BRI - 1 && n_extra == 0) { if (draw_state == WL_BRI - 1 && n_extra == 0) {
draw_state = WL_BRI; draw_state = WL_BRI;
if (wp->w_p_bri && row != startrow && filler_lines == 0) { if (wp->w_p_bri && row != startrow && filler_lines == 0) {
char_attr = 0; // was: hl_attr(HLF_AT); char_attr = wp->w_hl_attr_normal; // was: hl_attr(HLF_AT);
if (diff_hlf != (hlf_T)0) { if (diff_hlf != (hlf_T)0) {
char_attr = hl_attr(diff_hlf); char_attr = win_hl_attr(wp, diff_hlf);
if (wp->w_p_cul && lnum == wp->w_cursor.lnum) { if (wp->w_p_cul && lnum == wp->w_cursor.lnum) {
char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUL)); char_attr = hl_combine_attr(char_attr, win_hl_attr(wp, HLF_CUL));
} }
} }
p_extra = NULL; p_extra = NULL;
@ -2826,15 +2835,15 @@ win_line (
n_extra = col + 1; n_extra = col + 1;
else else
n_extra = wp->w_width - col; n_extra = wp->w_width - col;
char_attr = hl_attr(HLF_DED); char_attr = win_hl_attr(wp, HLF_DED);
} }
if (*p_sbr != NUL && need_showbreak) { if (*p_sbr != NUL && need_showbreak) {
/* Draw 'showbreak' at the start of each broken line. */ /* Draw 'showbreak' at the start of each broken line. */
p_extra = p_sbr; p_extra = p_sbr;
c_extra = NUL; c_extra = NUL;
n_extra = (int)STRLEN(p_sbr); n_extra = (int)STRLEN(p_sbr);
char_attr = hl_attr(HLF_AT); char_attr = win_hl_attr(wp, HLF_AT);
need_showbreak = FALSE; need_showbreak = false;
vcol_sbr = vcol + MB_CHARLEN(p_sbr); vcol_sbr = vcol + MB_CHARLEN(p_sbr);
/* Correct end of highlighted area for 'showbreak', /* Correct end of highlighted area for 'showbreak',
* required when 'linebreak' is also set. */ * required when 'linebreak' is also set. */
@ -2842,7 +2851,7 @@ win_line (
tocol += n_extra; tocol += n_extra;
/* combine 'showbreak' with 'cursorline' */ /* combine 'showbreak' with 'cursorline' */
if (wp->w_p_cul && lnum == wp->w_cursor.lnum) { if (wp->w_p_cul && lnum == wp->w_cursor.lnum) {
char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUL)); char_attr = hl_combine_attr(char_attr, win_hl_attr(wp, HLF_CUL));
} }
} }
} }
@ -2855,12 +2864,9 @@ win_line (
c_extra = saved_c_extra; c_extra = saved_c_extra;
p_extra = saved_p_extra; p_extra = saved_p_extra;
char_attr = saved_char_attr; char_attr = saved_char_attr;
} else } else {
char_attr = 0; char_attr = wp->w_hl_attr_normal;
} }
if (wp->w_hl_attr != 0) {
char_attr = hl_combine_attr(wp->w_hl_attr, char_attr);
} }
} }
@ -2869,13 +2875,14 @@ win_line (
&& lnum == wp->w_cursor.lnum && vcol >= (long)wp->w_virtcol && lnum == wp->w_cursor.lnum && vcol >= (long)wp->w_virtcol
&& filler_todo <= 0 && filler_todo <= 0
) { ) {
SCREEN_LINE(screen_row, wp->w_wincol, col, -wp->w_width, wp->w_p_rl); screen_line(screen_row, wp->w_wincol, col, -wp->w_width, wp->w_p_rl, wp);
/* Pretend we have finished updating the window. Except when // Pretend we have finished updating the window. Except when
* 'cursorcolumn' is set. */ // 'cursorcolumn' is set.
if (wp->w_p_cuc) if (wp->w_p_cuc) {
row = wp->w_cline_row + wp->w_cline_height; row = wp->w_cline_row + wp->w_cline_height;
else } else {
row = wp->w_height; row = wp->w_height;
}
break; break;
} }
@ -3003,14 +3010,16 @@ win_line (
if (diff_hlf != (hlf_T)0) { if (diff_hlf != (hlf_T)0) {
if (diff_hlf == HLF_CHD && ptr - line >= change_start if (diff_hlf == HLF_CHD && ptr - line >= change_start
&& n_extra == 0) && n_extra == 0) {
diff_hlf = HLF_TXD; /* changed text */ diff_hlf = HLF_TXD; // changed text
}
if (diff_hlf == HLF_TXD && ptr - line > change_end if (diff_hlf == HLF_TXD && ptr - line > change_end
&& n_extra == 0) && n_extra == 0) {
diff_hlf = HLF_CHD; /* changed line */ diff_hlf = HLF_CHD; // changed line
line_attr = hl_attr(diff_hlf); }
line_attr = win_hl_attr(wp, diff_hlf);
if (wp->w_p_cul && lnum == wp->w_cursor.lnum) { if (wp->w_p_cul && lnum == wp->w_cursor.lnum) {
line_attr = hl_combine_attr(line_attr, hl_attr(HLF_CUL)); line_attr = hl_combine_attr(line_attr, win_hl_attr(wp, HLF_CUL));
} }
} }
@ -3026,14 +3035,15 @@ win_line (
// (area_attr may be 0 when "noinvcur" is set). // (area_attr may be 0 when "noinvcur" is set).
else if (line_attr != 0 && ((fromcol == -10 && tocol == MAXCOL) else if (line_attr != 0 && ((fromcol == -10 && tocol == MAXCOL)
|| vcol < fromcol || vcol_prev < fromcol_prev || vcol < fromcol || vcol_prev < fromcol_prev
|| vcol >= tocol)) || vcol >= tocol)) {
char_attr = line_attr; char_attr = line_attr;
else { } else {
attr_pri = FALSE; attr_pri = false;
if (has_syntax) if (has_syntax) {
char_attr = syntax_attr; char_attr = syntax_attr;
else } else {
char_attr = 0; char_attr = wp->w_hl_attr_normal;
}
} }
} }
@ -3094,11 +3104,8 @@ win_line (
c = '>'; c = '>';
mb_c = c; mb_c = c;
mb_l = 1; mb_l = 1;
mb_utf8 = FALSE; mb_utf8 = false;
multi_attr = hl_attr(HLF_AT); multi_attr = win_hl_attr(wp, HLF_AT);
if (wp->w_hl_attr != 0) {
multi_attr = hl_combine_attr(wp->w_hl_attr, multi_attr);
}
// put the pointer back to output the double-width // put the pointer back to output the double-width
// character at the start of the next line. // character at the start of the next line.
@ -3166,8 +3173,8 @@ win_line (
c_extra = NUL; c_extra = NUL;
if (area_attr == 0 && search_attr == 0) { if (area_attr == 0 && search_attr == 0) {
n_attr = n_extra + 1; n_attr = n_extra + 1;
extra_attr = hl_attr(HLF_8); extra_attr = win_hl_attr(wp, HLF_8);
saved_attr2 = char_attr; /* save current attr */ saved_attr2 = char_attr; // save current attr
} }
} else if (mb_l == 0) /* at the NUL at end-of-line */ } else if (mb_l == 0) /* at the NUL at end-of-line */
mb_l = 1; mb_l = 1;
@ -3219,8 +3226,8 @@ win_line (
c = *p_extra++; c = *p_extra++;
if (area_attr == 0 && search_attr == 0) { if (area_attr == 0 && search_attr == 0) {
n_attr = n_extra + 1; n_attr = n_extra + 1;
extra_attr = hl_attr(HLF_8); extra_attr = win_hl_attr(wp, HLF_8);
saved_attr2 = char_attr; /* save current attr */ saved_attr2 = char_attr; // save current attr
} }
mb_c = c; mb_c = c;
} }
@ -3237,10 +3244,7 @@ win_line (
mb_c = c; mb_c = c;
mb_utf8 = FALSE; mb_utf8 = FALSE;
mb_l = 1; mb_l = 1;
multi_attr = hl_attr(HLF_AT); multi_attr = win_hl_attr(wp, HLF_AT);
if (wp->w_hl_attr != 0) {
multi_attr = hl_combine_attr(wp->w_hl_attr, multi_attr);
}
// Put pointer back so that the character will be // Put pointer back so that the character will be
// displayed at the start of the next line. // displayed at the start of the next line.
ptr--; ptr--;
@ -3257,8 +3261,8 @@ win_line (
c = ' '; c = ' ';
if (area_attr == 0 && search_attr == 0) { if (area_attr == 0 && search_attr == 0) {
n_attr = n_extra + 1; n_attr = n_extra + 1;
extra_attr = hl_attr(HLF_AT); extra_attr = win_hl_attr(wp, HLF_AT);
saved_attr2 = char_attr; /* save current attr */ saved_attr2 = char_attr; // save current attr
} }
mb_c = c; mb_c = c;
mb_utf8 = FALSE; mb_utf8 = FALSE;
@ -3306,7 +3310,7 @@ win_line (
else else
syntax_flags = get_syntax_info(&syntax_seqnr); syntax_flags = get_syntax_info(&syntax_seqnr);
} else if (!attr_pri) { } else if (!attr_pri) {
char_attr = 0; char_attr = wp->w_hl_attr_normal;
} }
/* Check spelling (unless at the end of the line). /* Check spelling (unless at the end of the line).
@ -3432,7 +3436,7 @@ win_line (
|| (c == ' ' && lcs_space && ptr - line <= trailcol))) { || (c == ' ' && lcs_space && ptr - line <= trailcol))) {
c = (c == ' ') ? lcs_space : lcs_nbsp; c = (c == ' ') ? lcs_space : lcs_nbsp;
n_attr = 1; n_attr = 1;
extra_attr = hl_attr(HLF_0); extra_attr = win_hl_attr(wp, HLF_0);
saved_attr2 = char_attr; // save current attr saved_attr2 = char_attr; // save current attr
mb_c = c; mb_c = c;
if (enc_utf8 && (*mb_char2len)(c) > 1) { if (enc_utf8 && (*mb_char2len)(c) > 1) {
@ -3447,7 +3451,7 @@ win_line (
if (trailcol != MAXCOL && ptr > line + trailcol && c == ' ') { if (trailcol != MAXCOL && ptr > line + trailcol && c == ' ') {
c = lcs_trail; c = lcs_trail;
n_attr = 1; n_attr = 1;
extra_attr = hl_attr(HLF_0); extra_attr = win_hl_attr(wp, HLF_0);
saved_attr2 = char_attr; // save current attr saved_attr2 = char_attr; // save current attr
mb_c = c; mb_c = c;
if (enc_utf8 && (*mb_char2len)(c) > 1) { if (enc_utf8 && (*mb_char2len)(c) > 1) {
@ -3548,7 +3552,7 @@ win_line (
c_extra = lcs_tab2; c_extra = lcs_tab2;
} }
n_attr = tab_len + 1; n_attr = tab_len + 1;
extra_attr = hl_attr(HLF_0); extra_attr = win_hl_attr(wp, HLF_0);
saved_attr2 = char_attr; // save current attr saved_attr2 = char_attr; // save current attr
mb_c = c; mb_c = c;
if (enc_utf8 && (*mb_char2len)(c) > 1) { if (enc_utf8 && (*mb_char2len)(c) > 1) {
@ -3595,7 +3599,7 @@ win_line (
} }
lcs_eol_one = -1; lcs_eol_one = -1;
ptr--; // put it back at the NUL ptr--; // put it back at the NUL
extra_attr = hl_attr(HLF_AT); extra_attr = win_hl_attr(wp, HLF_AT);
n_attr = 1; n_attr = 1;
mb_c = c; mb_c = c;
if (enc_utf8 && (*mb_char2len)(c) > 1) { if (enc_utf8 && (*mb_char2len)(c) > 1) {
@ -3626,7 +3630,7 @@ win_line (
c = *p_extra++; c = *p_extra++;
} }
n_attr = n_extra + 1; n_attr = n_extra + 1;
extra_attr = hl_attr(HLF_8); extra_attr = win_hl_attr(wp, HLF_8);
saved_attr2 = char_attr; // save current attr saved_attr2 = char_attr; // save current attr
mb_utf8 = false; // don't draw as UTF-8 mb_utf8 = false; // don't draw as UTF-8
} else if (VIsual_active } else if (VIsual_active
@ -3658,9 +3662,10 @@ win_line (
if (diff_hlf == HLF_TXD) { if (diff_hlf == HLF_TXD) {
diff_hlf = HLF_CHD; diff_hlf = HLF_CHD;
if (attr == 0 || char_attr != attr) { if (attr == 0 || char_attr != attr) {
char_attr = hl_attr(diff_hlf); char_attr = win_hl_attr(wp, diff_hlf);
if (wp->w_p_cul && lnum == wp->w_cursor.lnum) { if (wp->w_p_cul && lnum == wp->w_cursor.lnum) {
char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUL)); char_attr = hl_combine_attr(char_attr,
win_hl_attr(wp, HLF_CUL));
} }
} }
} }
@ -3762,7 +3767,7 @@ win_line (
c_extra = MB_FILLER_CHAR; c_extra = MB_FILLER_CHAR;
n_extra = 1; n_extra = 1;
n_attr = 2; n_attr = 2;
extra_attr = hl_attr(HLF_AT); extra_attr = win_hl_attr(wp, HLF_AT);
} }
mb_c = c; mb_c = c;
if (enc_utf8 && (*mb_char2len)(c) > 1) { if (enc_utf8 && (*mb_char2len)(c) > 1) {
@ -3773,10 +3778,7 @@ win_line (
mb_utf8 = false; // don't draw as UTF-8 mb_utf8 = false; // don't draw as UTF-8
} }
saved_attr3 = char_attr; // save current attr saved_attr3 = char_attr; // save current attr
char_attr = hl_attr(HLF_AT); // overwriting char_attr char_attr = win_hl_attr(wp, HLF_AT); // overwriting char_attr
if (wp->w_hl_attr != 0) {
char_attr = hl_combine_attr(wp->w_hl_attr, char_attr);
}
n_attr3 = 1; n_attr3 = 1;
} }
@ -3861,8 +3863,8 @@ win_line (
} }
} }
if (wp->w_hl_attr != 0) { if (wp->w_hl_attr_normal != 0) {
char_attr = hl_combine_attr(wp->w_hl_attr, char_attr); char_attr = hl_combine_attr(wp->w_hl_attr_normal, char_attr);
} }
ScreenAttrs[off] = char_attr; ScreenAttrs[off] = char_attr;
if (wp->w_p_rl) { if (wp->w_p_rl) {
@ -3925,13 +3927,8 @@ win_line (
if (rightmost_vcol < color_cols[i]) if (rightmost_vcol < color_cols[i])
rightmost_vcol = color_cols[i]; rightmost_vcol = color_cols[i];
int cuc_attr = hl_attr(HLF_CUC); int cuc_attr = win_hl_attr(wp, HLF_CUC);
int mc_attr = hl_attr(HLF_MC); int mc_attr = win_hl_attr(wp, HLF_MC);
if (wp->w_hl_attr != 0) {
cuc_attr = hl_combine_attr(wp->w_hl_attr, cuc_attr);
mc_attr = hl_combine_attr(wp->w_hl_attr, mc_attr);
}
while (col < wp->w_width) { while (col < wp->w_width) {
ScreenLines[off] = ' '; ScreenLines[off] = ' ';
@ -3947,7 +3944,7 @@ win_line (
} else if (draw_color_col && VCOL_HLC == *color_cols) { } else if (draw_color_col && VCOL_HLC == *color_cols) {
ScreenAttrs[off++] = mc_attr; ScreenAttrs[off++] = mc_attr;
} else { } else {
ScreenAttrs[off++] = wp->w_hl_attr; ScreenAttrs[off++] = wp->w_hl_attr_normal;
} }
if (VCOL_HLC >= rightmost_vcol) if (VCOL_HLC >= rightmost_vcol)
@ -3970,7 +3967,7 @@ win_line (
col++; col++;
} }
} }
SCREEN_LINE(screen_row, wp->w_wincol, col, wp->w_width, wp->w_p_rl); screen_line(screen_row, wp->w_wincol, col, wp->w_width, wp->w_p_rl, wp);
row++; row++;
/* /*
@ -3998,10 +3995,7 @@ win_line (
|| (wp->w_p_list && lcs_eol_one > 0) || (wp->w_p_list && lcs_eol_one > 0)
|| (n_extra && (c_extra != NUL || *p_extra != NUL)))) { || (n_extra && (c_extra != NUL || *p_extra != NUL)))) {
c = lcs_ext; c = lcs_ext;
char_attr = hl_attr(HLF_AT); char_attr = win_hl_attr(wp, HLF_AT);
if (wp->w_hl_attr != 0) {
char_attr = hl_combine_attr(wp->w_hl_attr, char_attr);
}
mb_c = c; mb_c = c;
if (enc_utf8 && (*mb_char2len)(c) > 1) { if (enc_utf8 && (*mb_char2len)(c) > 1) {
mb_utf8 = TRUE; mb_utf8 = TRUE;
@ -4024,10 +4018,10 @@ win_line (
if (wp->w_p_cuc && VCOL_HLC == (long)wp->w_virtcol if (wp->w_p_cuc && VCOL_HLC == (long)wp->w_virtcol
&& lnum != wp->w_cursor.lnum) { && lnum != wp->w_cursor.lnum) {
vcol_save_attr = char_attr; vcol_save_attr = char_attr;
char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUC)); char_attr = hl_combine_attr(char_attr, win_hl_attr(wp, HLF_CUC));
} else if (draw_color_col && VCOL_HLC == *color_cols) { } else if (draw_color_col && VCOL_HLC == *color_cols) {
vcol_save_attr = char_attr; vcol_save_attr = char_attr;
char_attr = hl_combine_attr(char_attr, hl_attr(HLF_MC)); char_attr = hl_combine_attr(char_attr, win_hl_attr(wp, HLF_MC));
} }
} }
@ -4195,8 +4189,8 @@ win_line (
|| (wp->w_p_list && lcs_eol != NUL && p_extra != at_end_str) || (wp->w_p_list && lcs_eol != NUL && p_extra != at_end_str)
|| (n_extra != 0 && (c_extra != NUL || *p_extra != NUL))) || (n_extra != 0 && (c_extra != NUL || *p_extra != NUL)))
) { ) {
SCREEN_LINE(screen_row, wp->w_wincol, col - boguscols, screen_line(screen_row, wp->w_wincol, col - boguscols,
wp->w_width, wp->w_p_rl); wp->w_width, wp->w_p_rl, wp);
boguscols = 0; boguscols = 0;
++row; ++row;
++screen_row; ++screen_row;
@ -4364,7 +4358,8 @@ static int char_needs_redraw(int off_from, int off_to, int cols)
* When TRUE and "clear_width" > 0, clear columns 0 to "endcol" * When TRUE and "clear_width" > 0, clear columns 0 to "endcol"
* When FALSE and "clear_width" > 0, clear columns "endcol" to "clear_width" * When FALSE and "clear_width" > 0, clear columns "endcol" to "clear_width"
*/ */
static void screen_line(int row, int coloff, int endcol, int clear_width, int rlflag) static void screen_line(int row, int coloff, int endcol,
int clear_width, int rlflag, win_T *wp)
{ {
unsigned off_from; unsigned off_from;
unsigned off_to; unsigned off_to;
@ -4526,11 +4521,11 @@ static void screen_line(int row, int coloff, int endcol, int clear_width, int rl
} }
if (clear_width > 0) { if (clear_width > 0) {
/* For a window that's left of another, draw the separator char. */ // For a window that's left of another, draw the separator char.
if (col + coloff < Columns) { if (col + coloff < Columns && wp->w_vsep_width > 0) {
int c; int c;
c = fillchar_vsep(&hl); c = fillchar_vsep(wp, &hl);
if (ScreenLines[off_to] != (schar_T)c if (ScreenLines[off_to] != (schar_T)c
|| (enc_utf8 && (int)ScreenLinesUC[off_to] || (enc_utf8 && (int)ScreenLinesUC[off_to]
!= (c >= 0x80 ? c : 0)) != (c >= 0x80 ? c : 0))
@ -4635,8 +4630,8 @@ static void draw_vsep_win(win_T *wp, int row)
int c; int c;
if (wp->w_vsep_width) { if (wp->w_vsep_width) {
/* draw the vertical separator right of this window */ // draw the vertical separator right of this window
c = fillchar_vsep(&hl); c = fillchar_vsep(wp, &hl);
screen_fill(wp->w_winrow + row, wp->w_winrow + wp->w_height, screen_fill(wp->w_winrow + row, wp->w_winrow + wp->w_height,
W_ENDCOL(wp), W_ENDCOL(wp) + 1, W_ENDCOL(wp), W_ENDCOL(wp) + 1,
c, ' ', hl); c, ' ', hl);
@ -4766,7 +4761,7 @@ win_redr_status_matches (
--first_match; --first_match;
} }
fillchar = fillchar_status(&attr, TRUE); fillchar = fillchar_status(&attr, curwin);
if (first_match == 0) { if (first_match == 0) {
*buf = NUL; *buf = NUL;
@ -4898,7 +4893,7 @@ void win_redr_status(win_T *wp)
/* redraw custom status line */ /* redraw custom status line */
redraw_custom_statusline(wp); redraw_custom_statusline(wp);
} else { } else {
fillchar = fillchar_status(&attr, wp == curwin); fillchar = fillchar_status(&attr, wp);
get_trans_bufname(wp->w_buffer); get_trans_bufname(wp->w_buffer);
p = NameBuff; p = NameBuff;
@ -4970,10 +4965,11 @@ void win_redr_status(win_T *wp)
* May need to draw the character below the vertical separator. * May need to draw the character below the vertical separator.
*/ */
if (wp->w_vsep_width != 0 && wp->w_status_height != 0 && redrawing()) { if (wp->w_vsep_width != 0 && wp->w_status_height != 0 && redrawing()) {
if (stl_connected(wp)) if (stl_connected(wp)) {
fillchar = fillchar_status(&attr, wp == curwin); fillchar = fillchar_status(&attr, wp);
else } else {
fillchar = fillchar_vsep(&attr); fillchar = fillchar_vsep(wp, &attr);
}
screen_putchar(fillchar, wp->w_winrow + wp->w_height, screen_putchar(fillchar, wp->w_winrow + wp->w_height,
W_ENDCOL(wp), attr); W_ENDCOL(wp), attr);
} }
@ -5123,7 +5119,7 @@ win_redr_custom (
use_sandbox = was_set_insecurely((char_u *)"tabline", 0); use_sandbox = was_set_insecurely((char_u *)"tabline", 0);
} else { } else {
row = wp->w_winrow + wp->w_height; row = wp->w_winrow + wp->w_height;
fillchar = fillchar_status(&attr, wp == curwin); fillchar = fillchar_status(&attr, wp);
maxwidth = wp->w_width; maxwidth = wp->w_width;
if (draw_ruler) { if (draw_ruler) {
@ -5508,8 +5504,7 @@ static void start_search_hl(void)
{ {
if (p_hls && !no_hlsearch) { if (p_hls && !no_hlsearch) {
last_pat_prog(&search_hl.rm); last_pat_prog(&search_hl.rm);
search_hl.attr = hl_attr(HLF_L); // Set the time limit to 'redrawtime'.
/* Set the time limit to 'redrawtime'. */
search_hl.tm = profile_setlimit(p_rdt); search_hl.tm = profile_setlimit(p_rdt);
} }
} }
@ -5525,6 +5520,42 @@ static void end_search_hl(void)
} }
} }
static void update_window_hl(win_T *wp, bool invalid)
{
if (!wp->w_hl_needs_update && !invalid) {
return;
}
wp->w_hl_needs_update = false;
// determine window specific background set in 'winhighlight'
if (wp != curwin && wp->w_hl_ids[HLF_INACTIVE] > 0) {
wp->w_hl_attr_normal = syn_id2attr(wp->w_hl_ids[HLF_INACTIVE]);
} else if (wp->w_hl_id_normal > 0) {
wp->w_hl_attr_normal = syn_id2attr(wp->w_hl_id_normal);
} else {
wp->w_hl_attr_normal = 0;
}
if (wp != curwin) {
wp->w_hl_attr_normal = hl_combine_attr(hl_attr(HLF_INACTIVE),
wp->w_hl_attr_normal);
}
for (int hlf = 0; hlf < (int)HLF_COUNT; hlf++) {
int attr;
if (wp->w_hl_ids[hlf] > 0) {
attr = syn_id2attr(wp->w_hl_ids[hlf]);
} else {
attr = hl_attr(hlf);
}
if (wp->w_hl_attr_normal != 0) {
attr = hl_combine_attr(wp->w_hl_attr_normal, attr);
}
wp->w_hl_attrs[hlf] = attr;
}
}
/* /*
* Init for calling prepare_search_hl(). * Init for calling prepare_search_hl().
*/ */
@ -5551,19 +5582,9 @@ static void init_search_hl(win_T *wp)
search_hl.buf = wp->w_buffer; search_hl.buf = wp->w_buffer;
search_hl.lnum = 0; search_hl.lnum = 0;
search_hl.first_lnum = 0; search_hl.first_lnum = 0;
// time limit is set at the toplevel, for all windows search_hl.attr = win_hl_attr(wp, HLF_L);
// determine window specific background set in 'winhighlight' // time limit is set at the toplevel, for all windows
if (wp != curwin && wp->w_hl_id_inactive > 0) {
wp->w_hl_attr = syn_id2attr(wp->w_hl_id_inactive);
} else if (wp->w_hl_id > 0) {
wp->w_hl_attr = syn_id2attr(wp->w_hl_id);
} else {
wp->w_hl_attr = 0;
}
if (wp != curwin) {
wp->w_hl_attr = hl_combine_attr(hl_attr(HLF_INACTIVE), wp->w_hl_attr);
}
} }
/* /*
@ -6775,7 +6796,7 @@ int showmode(void)
if (edit_submode_extra != NULL) { if (edit_submode_extra != NULL) {
MSG_PUTS_ATTR(" ", attr); // Add a space in between. MSG_PUTS_ATTR(" ", attr); // Add a space in between.
if ((int)edit_submode_highl < (int)HLF_COUNT) { if ((int)edit_submode_highl < (int)HLF_COUNT) {
sub_attr = hl_attr(edit_submode_highl); sub_attr = win_hl_attr(curwin, edit_submode_highl);
} else { } else {
sub_attr = attr; sub_attr = attr;
} }
@ -6928,7 +6949,6 @@ static void draw_tabline(void)
int modified; int modified;
int c; int c;
int len; int len;
int attr_sel = hl_attr(HLF_TPS);
int attr_nosel = hl_attr(HLF_TP); int attr_nosel = hl_attr(HLF_TP);
int attr_fill = hl_attr(HLF_TPF); int attr_fill = hl_attr(HLF_TPF);
char_u *p; char_u *p;
@ -6990,16 +7010,6 @@ static void draw_tabline(void)
scol = col; scol = col;
if (tp->tp_topframe == topframe)
attr = attr_sel;
if (use_sep_chars && col > 0)
screen_putchar('|', 0, col++, attr);
if (tp->tp_topframe != topframe)
attr = attr_nosel;
screen_putchar(' ', 0, col++, attr);
if (tp == curtab) { if (tp == curtab) {
cwp = curwin; cwp = curwin;
wp = firstwin; wp = firstwin;
@ -7008,10 +7018,29 @@ static void draw_tabline(void)
wp = tp->tp_firstwin; wp = tp->tp_firstwin;
} }
modified = FALSE;
for (wincount = 0; wp != NULL; wp = wp->w_next, ++wincount) if (tp->tp_topframe == topframe) {
if (bufIsChanged(wp->w_buffer)) attr = win_hl_attr(cwp, HLF_TPS);
modified = TRUE; }
if (use_sep_chars && col > 0) {
screen_putchar('|', 0, col++, attr);
}
if (tp->tp_topframe != topframe) {
attr = win_hl_attr(cwp, HLF_TP);
}
screen_putchar(' ', 0, col++, attr);
modified = false;
for (wincount = 0; wp != NULL; wp = wp->w_next, ++wincount) {
if (bufIsChanged(wp->w_buffer)) {
modified = true;
}
}
if (modified || wincount > 1) { if (modified || wincount > 1) {
if (wincount > 1) { if (wincount > 1) {
vim_snprintf((char *)NameBuff, MAXPATHL, "%d", wincount); vim_snprintf((char *)NameBuff, MAXPATHL, "%d", wincount);
@ -7019,7 +7048,7 @@ static void draw_tabline(void)
if (col + len >= Columns - 3) if (col + len >= Columns - 3)
break; break;
screen_puts_len(NameBuff, len, 0, col, screen_puts_len(NameBuff, len, 0, col,
hl_combine_attr(attr, hl_attr(HLF_T))); hl_combine_attr(attr, win_hl_attr(cwp, HLF_T)));
col += len; col += len;
} }
if (modified) if (modified)
@ -7117,25 +7146,28 @@ void get_trans_bufname(buf_T *buf)
/* /*
* Get the character to use in a status line. Get its attributes in "*attr". * Get the character to use in a status line. Get its attributes in "*attr".
*/ */
static int fillchar_status(int *attr, int is_curwin) static int fillchar_status(int *attr, win_T *wp)
{ {
int fill; int fill;
bool is_curwin = (wp == curwin);
if (is_curwin) { if (is_curwin) {
*attr = hl_attr(HLF_S); *attr = win_hl_attr(wp, HLF_S);
fill = fill_stl; fill = fill_stl;
} else { } else {
*attr = hl_attr(HLF_SNC); *attr = win_hl_attr(wp, HLF_SNC);
fill = fill_stlnc; fill = fill_stlnc;
} }
/* Use fill when there is highlighting, and highlighting of current /* Use fill when there is highlighting, and highlighting of current
* window differs, or the fillchars differ, or this is not the * window differs, or the fillchars differ, or this is not the
* current window */ * current window */
if (*attr != 0 && ((hl_attr(HLF_S) != hl_attr(HLF_SNC) if (*attr != 0 && ((win_hl_attr(wp, HLF_S) != win_hl_attr(wp, HLF_SNC)
|| !is_curwin || firstwin == lastwin) || !is_curwin || firstwin == lastwin)
|| (fill_stl != fill_stlnc))) || (fill_stl != fill_stlnc))) {
return fill; return fill;
if (is_curwin) }
if (is_curwin) {
return '^'; return '^';
}
return '='; return '=';
} }
@ -7143,13 +7175,14 @@ static int fillchar_status(int *attr, int is_curwin)
* Get the character to use in a separator between vertically split windows. * Get the character to use in a separator between vertically split windows.
* Get its attributes in "*attr". * Get its attributes in "*attr".
*/ */
static int fillchar_vsep(int *attr) static int fillchar_vsep(win_T *wp, int *attr)
{ {
*attr = hl_attr(HLF_C); *attr = win_hl_attr(wp, HLF_C);
if (*attr == 0 && fill_vert == ' ') if (*attr == 0 && fill_vert == ' ') {
return '|'; return '|';
else } else {
return fill_vert; return fill_vert;
}
} }
/* /*
@ -7264,7 +7297,7 @@ static void win_redr_ruler(win_T *wp, int always)
if (wp->w_status_height) { if (wp->w_status_height) {
row = wp->w_winrow + wp->w_height; row = wp->w_winrow + wp->w_height;
fillchar = fillchar_status(&attr, wp == curwin); fillchar = fillchar_status(&attr, wp);
off = wp->w_wincol; off = wp->w_wincol;
width = wp->w_width; width = wp->w_width;
} else { } else {

View File

@ -1,10 +1,9 @@
#ifndef NVIM_SYNTAX_DEFS_H #ifndef NVIM_SYNTAX_DEFS_H
#define NVIM_SYNTAX_DEFS_H #define NVIM_SYNTAX_DEFS_H
#include "nvim/highlight_defs.h"
#include "nvim/regexp_defs.h" #include "nvim/regexp_defs.h"
typedef int32_t RgbValue;
# define SST_MIN_ENTRIES 150 /* minimal size for state stack array */ # define SST_MIN_ENTRIES 150 /* minimal size for state stack array */
# define SST_MAX_ENTRIES 1000 /* maximal size for state stack array */ # define SST_MAX_ENTRIES 1000 /* maximal size for state stack array */
# define SST_FIX_STATES 7 /* size of sst_stack[]. */ # define SST_FIX_STATES 7 /* size of sst_stack[]. */

View File

@ -601,8 +601,10 @@ void terminal_get_line_attributes(Terminal *term, win_T *wp, int linenr,
if (term->cursor.visible && term->cursor.row == row if (term->cursor.visible && term->cursor.row == row
&& term->cursor.col == col) { && term->cursor.col == col) {
attr_id = hl_combine_attr(attr_id, is_focused(term) && wp == curwin ? attr_id = hl_combine_attr(attr_id,
hl_attr(HLF_TERM) : hl_attr(HLF_TERMNC)); is_focused(term) && wp == curwin
? win_hl_attr(wp, HLF_TERM)
: win_hl_attr(wp, HLF_TERMNC));
} }
term_attrs[col] = attr_id; term_attrs[col] = attr_id;

View File

@ -3723,8 +3723,8 @@ static void win_enter_ext(win_T *wp, bool undo_sync, int curwin_invalid,
redraw_later(VALID); /* causes status line redraw */ redraw_later(VALID); /* causes status line redraw */
if (hl_attr(HLF_INACTIVE) if (hl_attr(HLF_INACTIVE)
|| (prevwin && prevwin->w_hl_id_inactive) || (prevwin && prevwin->w_hl_ids[HLF_INACTIVE])
|| curwin->w_hl_id_inactive) { || curwin->w_hl_ids[HLF_INACTIVE]) {
redraw_all_later(NOT_VALID); redraw_all_later(NOT_VALID);
} }

View File

@ -5,6 +5,7 @@ local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
local command = helpers.command local command = helpers.command
local eval, exc_exec = helpers.eval, helpers.exc_exec local eval, exc_exec = helpers.eval, helpers.exc_exec
local feed_command, request, eq = helpers.feed_command, helpers.request, helpers.eq local feed_command, request, eq = helpers.feed_command, helpers.request, helpers.eq
local curbufmeths = helpers.curbufmeths
describe('colorscheme compatibility', function() describe('colorscheme compatibility', function()
before_each(function() before_each(function()
@ -670,12 +671,26 @@ describe("'winhighlight' highlight", function()
[8] = {background = Screen.colors.DarkMagenta, bold = true, foreground = Screen.colors.Blue1}, [8] = {background = Screen.colors.DarkMagenta, bold = true, foreground = Screen.colors.Blue1},
[9] = {foreground = Screen.colors.Brown}, [9] = {foreground = Screen.colors.Brown},
[10] = {foreground = Screen.colors.Brown, background = Screen.colors.DarkBlue}, [10] = {foreground = Screen.colors.Brown, background = Screen.colors.DarkBlue},
[11] = {background = Screen.colors.DarkBlue, bold = true, reverse = true},
[12] = {background = Screen.colors.DarkGreen, reverse = true},
[13] = {background = Screen.colors.Magenta4, reverse = true},
[14] = {background = Screen.colors.DarkBlue, reverse = true},
[15] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
[16] = {foreground = Screen.colors.Blue1},
[17] = {background = Screen.colors.LightRed},
[18] = {background = Screen.colors.Gray90},
[19] = {foreground = Screen.colors.LightGrey, background = Screen.colors.DarkGray},
[20] = {background = Screen.colors.LightGrey, underline = true},
[21] = {bold = true},
[22] = {bold = true, foreground = Screen.colors.SeaGreen4},
[23] = {background = Screen.colors.LightMagenta},
[24] = {background = Screen.colors.WebGray},
}) })
command("hi Background1 guibg=DarkBlue") command("hi Background1 guibg=DarkBlue")
command("hi Background2 guibg=DarkGreen") command("hi Background2 guibg=DarkGreen")
end) end)
it('works', function() it('works for background color', function()
insert("aa") insert("aa")
command("split") command("split")
command("set winhl=Normal:Background1") command("set winhl=Normal:Background1")
@ -683,7 +698,7 @@ describe("'winhighlight' highlight", function()
{1:a^a }| {1:a^a }|
{2:~ }| {2:~ }|
{2:~ }| {2:~ }|
{3:[No Name] [+] }| {11:[No Name] [+] }|
aa | aa |
{0:~ }| {0:~ }|
{4:[No Name] [+] }| {4:[No Name] [+] }|
@ -695,7 +710,7 @@ describe("'winhighlight' highlight", function()
{1:^ }| {1:^ }|
{2:~ }| {2:~ }|
{2:~ }| {2:~ }|
{3:[No Name] }| {11:[No Name] }|
aa | aa |
{0:~ }| {0:~ }|
{4:[No Name] [+] }| {4:[No Name] [+] }|
@ -740,7 +755,7 @@ describe("'winhighlight' highlight", function()
{1:a^a }| {1:a^a }|
{2:~ }| {2:~ }|
{2:~ }| {2:~ }|
{3:[No Name] [+] }| {11:[No Name] [+] }|
aa | aa |
{0:~ }| {0:~ }|
{4:[No Name] [+] }| {4:[No Name] [+] }|
@ -764,16 +779,15 @@ describe("'winhighlight' highlight", function()
{1:^aa }| {1:^aa }|
{2:~ }| {2:~ }|
{2:~ }| {2:~ }|
{3:[No Name] [+] }| {11:[No Name] [+] }|
aa | aa |
{0:~ }| {0:~ }|
{4:[No Name] [+] }| {4:[No Name] [+] }|
<f 1 --100%-- col 1 | <f 1 --100%-- col 1 |
]]) ]])
end) end)
it('for inactive window works', function() it('for inactive window background works', function()
command("set winhl=Normal:Background1,NormalNC:Background2") command("set winhl=Normal:Background1,NormalNC:Background2")
-- tests global value is copied across split -- tests global value is copied across split
command("split") command("split")
@ -781,10 +795,10 @@ describe("'winhighlight' highlight", function()
{1:^ }| {1:^ }|
{2:~ }| {2:~ }|
{2:~ }| {2:~ }|
{3:[No Name] }| {11:[No Name] }|
{5: }| {5: }|
{6:~ }| {6:~ }|
{4:[No Name] }| {12:[No Name] }|
| |
]]) ]])
@ -793,10 +807,10 @@ describe("'winhighlight' highlight", function()
{5: }| {5: }|
{6:~ }| {6:~ }|
{6:~ }| {6:~ }|
{4:[No Name] }| {12:[No Name] }|
{1:^ }| {1:^ }|
{2:~ }| {2:~ }|
{3:[No Name] }| {11:[No Name] }|
| |
]]) ]])
@ -805,13 +819,12 @@ describe("'winhighlight' highlight", function()
{1:^ }| {1:^ }|
{2:~ }| {2:~ }|
{2:~ }| {2:~ }|
{3:[No Name] }| {11:[No Name] }|
{5: }| {5: }|
{6:~ }| {6:~ }|
{4:[No Name] }| {12:[No Name] }|
| |
]]) ]])
end) end)
it('works with NormalNC', function() it('works with NormalNC', function()
@ -825,7 +838,7 @@ describe("'winhighlight' highlight", function()
{3:[No Name] }| {3:[No Name] }|
{7: }| {7: }|
{8:~ }| {8:~ }|
{4:[No Name] }| {13:[No Name] }|
| |
]]) ]])
@ -834,7 +847,7 @@ describe("'winhighlight' highlight", function()
{7: }| {7: }|
{8:~ }| {8:~ }|
{8:~ }| {8:~ }|
{4:[No Name] }| {13:[No Name] }|
^ | ^ |
{0:~ }| {0:~ }|
{3:[No Name] }| {3:[No Name] }|
@ -848,10 +861,10 @@ describe("'winhighlight' highlight", function()
{7: }| {7: }|
{8:~ }| {8:~ }|
{8:~ }| {8:~ }|
{4:[No Name] }| {13:[No Name] }|
{1:^ }| {1:^ }|
{2:~ }| {2:~ }|
{3:[No Name] }| {11:[No Name] }|
| |
]]) ]])
@ -863,7 +876,7 @@ describe("'winhighlight' highlight", function()
{3:[No Name] }| {3:[No Name] }|
{1: }| {1: }|
{2:~ }| {2:~ }|
{4:[No Name] }| {14:[No Name] }|
| |
]]) ]])
@ -873,10 +886,10 @@ describe("'winhighlight' highlight", function()
{7: }| {7: }|
{8:~ }| {8:~ }|
{8:~ }| {8:~ }|
{4:[No Name] }| {13:[No Name] }|
{1:^ }| {1:^ }|
{2:~ }| {2:~ }|
{3:[No Name] }| {11:[No Name] }|
| |
]]) ]])
@ -888,13 +901,12 @@ describe("'winhighlight' highlight", function()
{3:[No Name] }| {3:[No Name] }|
{5: }| {5: }|
{6:~ }| {6:~ }|
{4:[No Name] }| {12:[No Name] }|
| |
]]) ]])
end) end)
it('applies also to non-text', function() it('background applies also to non-text', function()
insert('Lorem ipsum dolor sit amet ') insert('Lorem ipsum dolor sit amet ')
command('set shiftwidth=2') command('set shiftwidth=2')
feed('>>') feed('>>')
@ -940,6 +952,114 @@ describe("'winhighlight' highlight", function()
| |
]]) ]])
end) end)
it('can override NonText, Conceal and EndOfBuffer', function()
curbufmeths.set_lines(0,-1,true, {"raa\000"})
command('call matchaddpos("Conceal", [[1,2]], 0, -1, {"conceal": "#"})')
command('set cole=2 cocu=nvic')
command('split')
command('call matchaddpos("Conceal", [[1,2]], 0, -1, {"conceal": "#"})')
command('set winhl=SpecialKey:ErrorMsg,EndOfBuffer:Background1,'
..'Conceal:Background2')
screen:expect([[
^r{5:#}a{15:^@} |
{1:~ }|
{1:~ }|
{3:[No Name] [+] }|
r{19:#}a{16:^@} |
{0:~ }|
{4:[No Name] [+] }|
|
]])
end)
it('can override LineNr, CursorColumn and ColorColumn', function()
insert('very text\nmore text')
command('set number')
command('set colorcolumn=2')
command('set cursorcolumn')
command('split')
command('set winhl=LineNr:Background1,CursorColumn:Background2,'
..'ColorColumn:ErrorMsg')
screen:expect([[
{1: 1 }v{15:e}ry tex{5:t} |
{1: 2 }m{15:o}re tex^t |
{0:~ }|
{3:[No Name] [+] }|
{9: 1 }v{17:e}ry tex{18:t} |
{9: 2 }m{17:o}re text |
{4:[No Name] [+] }|
|
]])
end)
it('can override Tabline', function()
command('tabnew')
command('set winhl=TabLine:Background1,TabLineSel:ErrorMsg')
screen:expect([[
{20: No Name] }{15: No Name]}{20:X}|
^ |
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
|
]])
command("tabnext")
screen:expect([[
{21: No Name] }{1: No Name]}{20:X}|
^ |
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
|
]])
end)
it('can override popupmenu', function()
insert('word wording wordy')
command('split')
command('set winhl=Pmenu:Background1,PmenuSel:Background2,'
..'PmenuSbar:ErrorMsg,PmenuThumb:Normal')
screen:expect([[
word wording word^y |
{0:~ }|
{0:~ }|
{3:[No Name] [+] }|
word wording wordy |
{0:~ }|
{4:[No Name] [+] }|
|
]])
feed('oword<c-x><c-p>')
screen:expect([[
word wording wordy |
wordy^ |
{1:word }{0: }|
{1:wording }{3: }|
{5:wordy }rdy |
wordy |
{4:[No Name] [+] }|
{21:-- }{22:match 1 of 3} |
]])
feed('<esc>u<c-w><c-w>oword<c-x><c-p>')
screen:expect([[
word wording wordy |
wordy |
{23:word }{0: }|
{23:wording }{4: }|
{24:wordy }rdy |
wordy^ |
{3:[No Name] [+] }|
{21:-- }{22:match 1 of 3} |
]])
end)
end) end)