mirror of
https://github.com/neovim/neovim.git
synced 2025-09-22 19:18:34 +00:00
treesitter: use internal "decorations" buffer
This commit is contained in:
@@ -637,6 +637,15 @@ bool win_cursorline_standout(const win_T *wp)
|
||||
static DecorationState decorations;
|
||||
bool decorations_active = false;
|
||||
|
||||
// VERY ad-hoc, should be in mark_extended.c?
|
||||
void decoration_state_add_tmp(int attr_id,
|
||||
int start_row, int start_col,
|
||||
int end_row, int end_col)
|
||||
{
|
||||
kv_push(decorations.active,
|
||||
((HlRange){ start_row, start_col, end_row, end_col, attr_id, NULL }));
|
||||
}
|
||||
|
||||
/*
|
||||
* Update a single window.
|
||||
*
|
||||
@@ -2311,6 +2320,8 @@ win_line (
|
||||
|
||||
char *luatext = NULL;
|
||||
|
||||
buf_T *buf = wp->w_buffer;
|
||||
|
||||
if (!number_only) {
|
||||
// To speed up the loop below, set extra_check when there is linebreak,
|
||||
// trailing white space and/or syntax processing to be done.
|
||||
@@ -2332,6 +2343,33 @@ win_line (
|
||||
}
|
||||
}
|
||||
|
||||
if (buf->b_luahl && buf->b_luahl_line != LUA_NOREF) {
|
||||
Error err = ERROR_INIT;
|
||||
// TODO(bfredl): build a macro for the "static array" pattern
|
||||
// in buf_updates_send_changes?
|
||||
FIXED_TEMP_ARRAY(args, 3);
|
||||
args.items[0] = WINDOW_OBJ(wp->handle);
|
||||
args.items[1] = BUFFER_OBJ(buf->handle);
|
||||
args.items[2] = INTEGER_OBJ(lnum-1);
|
||||
lua_attr_active = true;
|
||||
extra_check = true;
|
||||
Object o = executor_exec_lua_cb(buf->b_luahl_line, "line",
|
||||
args, true, &err);
|
||||
lua_attr_active = false;
|
||||
if (o.type == kObjectTypeString) {
|
||||
// TODO(bfredl): this is a bit of a hack. A final API should use an
|
||||
// "unified" interface where luahl can add both bufhl and virttext
|
||||
luatext = o.data.string.data;
|
||||
do_virttext = true;
|
||||
} else if (ERROR_SET(&err)) {
|
||||
ELOG("error in luahl line: %s", err.msg);
|
||||
luatext = err.msg;
|
||||
do_virttext = true;
|
||||
}
|
||||
decorations_active = true; // TODO: huff!
|
||||
}
|
||||
|
||||
|
||||
if (decorations_active) {
|
||||
has_decorations = extmark_decorations_line(wp->w_buffer, lnum-1,
|
||||
&decorations);
|
||||
@@ -2532,41 +2570,6 @@ win_line (
|
||||
line = ml_get_buf(wp->w_buffer, lnum, FALSE);
|
||||
ptr = line;
|
||||
|
||||
buf_T *buf = wp->w_buffer;
|
||||
if (buf->b_luahl && buf->b_luahl_line != LUA_NOREF) {
|
||||
size_t size = STRLEN(line);
|
||||
if (lua_attr_bufsize < size) {
|
||||
xfree(lua_attr_buf);
|
||||
lua_attr_buf = xcalloc(size, sizeof(*lua_attr_buf));
|
||||
lua_attr_bufsize = size;
|
||||
} else if (lua_attr_buf) {
|
||||
memset(lua_attr_buf, 0, size * sizeof(*lua_attr_buf));
|
||||
}
|
||||
Error err = ERROR_INIT;
|
||||
// TODO(bfredl): build a macro for the "static array" pattern
|
||||
// in buf_updates_send_changes?
|
||||
FIXED_TEMP_ARRAY(args, 3);
|
||||
args.items[0] = WINDOW_OBJ(wp->handle);
|
||||
args.items[1] = BUFFER_OBJ(buf->handle);
|
||||
args.items[2] = INTEGER_OBJ(lnum-1);
|
||||
lua_attr_active = true;
|
||||
extra_check = true;
|
||||
Object o = executor_exec_lua_cb(buf->b_luahl_line, "line",
|
||||
args, true, &err);
|
||||
lua_attr_active = false;
|
||||
if (o.type == kObjectTypeString) {
|
||||
// TODO(bfredl): this is a bit of a hack. A final API should use an
|
||||
// "unified" interface where luahl can add both bufhl and virttext
|
||||
luatext = o.data.string.data;
|
||||
do_virttext = true;
|
||||
} else if (ERROR_SET(&err)) {
|
||||
ELOG("error in luahl line: %s", err.msg);
|
||||
luatext = err.msg;
|
||||
do_virttext = true;
|
||||
api_clear_error(&err);
|
||||
}
|
||||
}
|
||||
|
||||
if (has_spell && !number_only) {
|
||||
// For checking first word with a capital skip white space.
|
||||
if (cap_col == 0) {
|
||||
@@ -3549,15 +3552,6 @@ win_line (
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(bfredl): luahl should reuse the "active decorations" buffer
|
||||
if (buf->b_luahl && v > 0 && v < (long)lua_attr_bufsize+1) {
|
||||
if (!attr_pri) {
|
||||
char_attr = hl_combine_attr(char_attr, lua_attr_buf[v-1]);
|
||||
} else {
|
||||
char_attr = hl_combine_attr(lua_attr_buf[v-1], char_attr);
|
||||
}
|
||||
}
|
||||
|
||||
if (wp->w_buffer->terminal) {
|
||||
char_attr = hl_combine_attr(term_attrs[vcol], char_attr);
|
||||
}
|
||||
|
Reference in New Issue
Block a user