mirror of
https://github.com/neovim/neovim.git
synced 2025-09-28 14:08:32 +00:00
feat(ui): allow to set the highlight namespace per window
- reimplement 'winhl' in terms of highlight namespaces - check for EOF in screen tests (to indicate a likely crash)
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
#include "nvim/charset.h"
|
||||
#include "nvim/cursor.h"
|
||||
#include "nvim/cursor_shape.h"
|
||||
#include "nvim/decoration_provider.h"
|
||||
#include "nvim/diff.h"
|
||||
#include "nvim/digraph.h"
|
||||
#include "nvim/edit.h"
|
||||
@@ -84,7 +85,9 @@
|
||||
#ifdef WIN32
|
||||
# include "nvim/os/pty_conpty_win.h"
|
||||
#endif
|
||||
#include "nvim/api/extmark.h"
|
||||
#include "nvim/api/private/helpers.h"
|
||||
#include "nvim/api/vim.h"
|
||||
#include "nvim/lua/executor.h"
|
||||
#include "nvim/os/input.h"
|
||||
#include "nvim/os/lang.h"
|
||||
@@ -3945,13 +3948,29 @@ static char *compile_cap_prog(synblock_T *synblock)
|
||||
}
|
||||
|
||||
/// Handle setting `winhighlight' in window "wp"
|
||||
static bool parse_winhl_opt(win_T *wp)
|
||||
bool parse_winhl_opt(win_T *wp)
|
||||
{
|
||||
int w_hl_id_normal = 0;
|
||||
int w_hl_ids[HLF_COUNT] = { 0 };
|
||||
int hlf;
|
||||
|
||||
const char *p = (const char *)wp->w_p_winhl;
|
||||
|
||||
if (!*p) {
|
||||
if (wp->w_ns_hl_winhl && wp->w_ns_hl == wp->w_ns_hl_winhl) {
|
||||
wp->w_ns_hl = 0;
|
||||
wp->w_hl_needs_update = true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (wp->w_ns_hl_winhl == 0) {
|
||||
wp->w_ns_hl_winhl = (int)nvim_create_namespace(NULL_STRING);
|
||||
} else {
|
||||
// namespace already exist. invalidate existing items
|
||||
DecorProvider *dp = get_decor_provider(wp->w_ns_hl_winhl, true);
|
||||
dp->hl_valid++;
|
||||
}
|
||||
wp->w_ns_hl = wp->w_ns_hl_winhl;
|
||||
int ns_hl = wp->w_ns_hl;
|
||||
|
||||
while (*p) {
|
||||
char *colon = strchr(p, ':');
|
||||
if (!colon) {
|
||||
@@ -3962,27 +3981,15 @@ static bool parse_winhl_opt(win_T *wp)
|
||||
char *commap = xstrchrnul(hi, ',');
|
||||
size_t len = (size_t)(commap - hi);
|
||||
int hl_id = len ? syn_check_group(hi, len) : -1;
|
||||
int hl_id_link = nlen ? syn_check_group(p, nlen) : 0;
|
||||
|
||||
if (strncmp("Normal", p, nlen) == 0) {
|
||||
w_hl_id_normal = hl_id;
|
||||
} else {
|
||||
for (hlf = 0; hlf < HLF_COUNT; hlf++) {
|
||||
if (strlen(hlf_names[hlf]) == nlen
|
||||
&& strncmp(hlf_names[hlf], p, nlen) == 0) {
|
||||
w_hl_ids[hlf] = hl_id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hlf == HLF_COUNT) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
HlAttrs attrs = HLATTRS_INIT;
|
||||
attrs.rgb_ae_attr |= HL_GLOBAL;
|
||||
ns_hl_def(ns_hl, hl_id_link, attrs, hl_id, NULL);
|
||||
|
||||
p = *commap ? commap + 1 : "";
|
||||
}
|
||||
|
||||
wp->w_hl_id_normal = w_hl_id_normal;
|
||||
memcpy(wp->w_hl_ids, w_hl_ids, sizeof(w_hl_ids));
|
||||
wp->w_hl_needs_update = true;
|
||||
return true;
|
||||
}
|
||||
|
Reference in New Issue
Block a user