mirror of
https://github.com/neovim/neovim.git
synced 2025-10-03 16:36:30 +00:00
feat(decorations): allow more than one stacked highlight in a virt_text
This commit is contained in:
@@ -1433,8 +1433,14 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id,
|
||||
/// - hl_group : name of the highlight group used to highlight
|
||||
/// this mark.
|
||||
/// - virt_text : virtual text to link to this mark.
|
||||
/// - virt_text_pos : positioning of virtual text. Possible
|
||||
/// values:
|
||||
/// A list of [text, highlight] tuples, each representing a
|
||||
/// text chunk with specified highlight. `highlight` element
|
||||
/// can either be a a single highlight group, or an array of
|
||||
/// multiple highlight groups that will be stacked
|
||||
/// (highest priority last). A highlight group can be supplied
|
||||
/// either as a string or as an integer, the latter which
|
||||
/// can be obtained using |nvim_get_hl_id_by_name|.
|
||||
/// - virt_text_pos : position of virtual text. Possible values:
|
||||
/// - "eol": right after eol character (default)
|
||||
/// - "overlay": display over the specified column, without
|
||||
/// shifting the underlying text.
|
||||
|
@@ -1603,22 +1603,38 @@ VirtText parse_virt_text(Array chunks, Error *err)
|
||||
Array chunk = chunks.items[i].data.array;
|
||||
if (chunk.size == 0 || chunk.size > 2
|
||||
|| chunk.items[0].type != kObjectTypeString
|
||||
|| (chunk.size == 2 && chunk.items[1].type != kObjectTypeString)) {
|
||||
|| chunk.size > 2) {
|
||||
api_set_error(err, kErrorTypeValidation,
|
||||
"Chunk is not an array with one or two strings");
|
||||
goto free_exit;
|
||||
}
|
||||
|
||||
String str = chunk.items[0].data.string;
|
||||
char *text = transstr(str.size > 0 ? str.data : ""); // allocates
|
||||
|
||||
int hl_id = 0;
|
||||
if (chunk.size == 2) {
|
||||
String hl = chunk.items[1].data.string;
|
||||
if (hl.size > 0) {
|
||||
hl_id = syn_check_group((char_u *)hl.data, (int)hl.size);
|
||||
Object hl = chunk.items[1];
|
||||
if (hl.type == kObjectTypeArray) {
|
||||
Array arr = hl.data.array;
|
||||
for (size_t j = 0; j < arr.size; j++) {
|
||||
hl_id = object_to_hl_id(arr.items[j], "virt_text highlight", err);
|
||||
if (ERROR_SET(err)) {
|
||||
goto free_exit;
|
||||
}
|
||||
if (j < arr.size-1) {
|
||||
kv_push(virt_text, ((VirtTextChunk){ .text = NULL,
|
||||
.hl_id = hl_id }));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
hl_id = object_to_hl_id(hl, "virt_text highlight", err);
|
||||
if (ERROR_SET(err)) {
|
||||
goto free_exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
char *text = transstr(str.size > 0 ? str.data : ""); // allocates
|
||||
kv_push(virt_text, ((VirtTextChunk){ .text = text, .hl_id = hl_id }));
|
||||
}
|
||||
|
||||
@@ -1656,7 +1672,7 @@ int object_to_hl_id(Object obj, const char *what, Error *err)
|
||||
String str = obj.data.string;
|
||||
return str.size ? syn_check_group((char_u *)str.data, (int)str.size) : 0;
|
||||
} else if (obj.type == kObjectTypeInteger) {
|
||||
return (int)obj.data.integer;
|
||||
return MAX((int)obj.data.integer, 0);
|
||||
} else {
|
||||
api_set_error(err, kErrorTypeValidation,
|
||||
"%s is not a valid highlight", what);
|
||||
|
Reference in New Issue
Block a user