aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-05-12 05:39:33 +0800
committerGitHub <noreply@github.com>2024-05-12 05:39:33 +0800
commit4e5c633ed4871a948aff7338b793ac5f93484153 (patch)
tree744f6ad0ea34f49e17a5ffae6ae3e335de86559d
parentc1396afa7c41c2009d06a54c8aaf1ca5689a9786 (diff)
downloadrneovim-4e5c633ed4871a948aff7338b793ac5f93484153.tar.gz
rneovim-4e5c633ed4871a948aff7338b793ac5f93484153.tar.bz2
rneovim-4e5c633ed4871a948aff7338b793ac5f93484153.zip
fix(api): make getting explicit empty hl in virtual text work (#28697)
-rw-r--r--src/nvim/api/extmark.c8
-rw-r--r--src/nvim/decoration.c7
-rw-r--r--src/nvim/decoration_defs.h2
-rw-r--r--test/functional/api/extmark_spec.lua4
-rw-r--r--test/functional/ui/float_spec.lua42
5 files changed, 55 insertions, 8 deletions
diff --git a/src/nvim/api/extmark.c b/src/nvim/api/extmark.c
index 320e14b654..f7c3788dad 100644
--- a/src/nvim/api/extmark.c
+++ b/src/nvim/api/extmark.c
@@ -121,7 +121,7 @@ Array virt_text_to_array(VirtText vt, bool hl_name, Arena *arena)
Array hl_array = arena_array(arena, i < j ? j - i + 1 : 0);
for (; i < j; i++) {
int hl_id = kv_A(vt, i).hl_id;
- if (hl_id > 0) {
+ if (hl_id >= 0) {
ADD_C(hl_array, hl_group_name(hl_id, hl_name));
}
}
@@ -131,11 +131,11 @@ Array virt_text_to_array(VirtText vt, bool hl_name, Arena *arena)
Array chunk = arena_array(arena, 2);
ADD_C(chunk, CSTR_AS_OBJ(text));
if (hl_array.size > 0) {
- if (hl_id > 0) {
+ if (hl_id >= 0) {
ADD_C(hl_array, hl_group_name(hl_id, hl_name));
}
ADD_C(chunk, ARRAY_OBJ(hl_array));
- } else if (hl_id > 0) {
+ } else if (hl_id >= 0) {
ADD_C(chunk, hl_group_name(hl_id, hl_name));
}
ADD_C(chunks, ARRAY_OBJ(chunk));
@@ -1165,7 +1165,7 @@ VirtText parse_virt_text(Array chunks, Error *err, int *width)
String str = chunk.items[0].data.string;
- int hl_id = 0;
+ int hl_id = -1;
if (chunk.size == 2) {
Object hl = chunk.items[1];
if (hl.type == kObjectTypeArray) {
diff --git a/src/nvim/decoration.c b/src/nvim/decoration.c
index 38b4f8f204..bcfae50c8e 100644
--- a/src/nvim/decoration.c
+++ b/src/nvim/decoration.c
@@ -346,7 +346,12 @@ char *next_virt_text_chunk(VirtText vt, size_t *pos, int *attr)
for (; text == NULL && *pos < kv_size(vt); (*pos)++) {
text = kv_A(vt, *pos).text;
int hl_id = kv_A(vt, *pos).hl_id;
- *attr = hl_combine_attr(*attr, hl_id > 0 ? syn_id2attr(hl_id) : 0);
+ if (hl_id >= 0) {
+ *attr = MAX(*attr, 0);
+ if (hl_id > 0) {
+ *attr = hl_combine_attr(*attr, syn_id2attr(hl_id));
+ }
+ }
}
return text;
}
diff --git a/src/nvim/decoration_defs.h b/src/nvim/decoration_defs.h
index 8d0075b169..c9475257b1 100644
--- a/src/nvim/decoration_defs.h
+++ b/src/nvim/decoration_defs.h
@@ -10,7 +10,7 @@
typedef struct {
char *text;
- int hl_id;
+ int hl_id; ///< -1 if not specified
} VirtTextChunk;
typedef kvec_t(VirtTextChunk) VirtText;
diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua
index 965a60417a..5ab3e09bf8 100644
--- a/test/functional/api/extmark_spec.lua
+++ b/test/functional/api/extmark_spec.lua
@@ -1569,7 +1569,7 @@ describe('API/extmarks', function()
sign_text = '>>',
spell = true,
virt_lines = {
- { { 'lines', 'Macro' }, { '???' } },
+ { { 'lines', 'Macro' }, { '???' }, { ';;;', '' } },
{ { 'stack', { 'Type', 'Search' } }, { '!!!' } },
},
virt_lines_above = true,
@@ -1604,7 +1604,7 @@ describe('API/extmarks', function()
sign_text = '>>',
spell = true,
virt_lines = {
- { { 'lines', 'Macro' }, { '???' } },
+ { { 'lines', 'Macro' }, { '???' }, { ';;;', '' } },
{ { 'stack', { 'Type', 'Search' } }, { '!!!' } },
},
virt_lines_above = true,
diff --git a/test/functional/ui/float_spec.lua b/test/functional/ui/float_spec.lua
index 131cc15bfb..248220e28b 100644
--- a/test/functional/ui/float_spec.lua
+++ b/test/functional/ui/float_spec.lua
@@ -2407,6 +2407,7 @@ describe('float window', function()
command('hi B0 guibg=Red guifg=Black')
command('hi B1 guifg=White')
+
api.nvim_win_set_config(win, {
title = {{"🦄"}, {"BB", {"B0", "B1"}}}, title_pos = "right",
footer= {{"🦄"}, {"BB", {"B0", "B1"}}}, footer_pos = "right",
@@ -2443,6 +2444,47 @@ describe('float window', function()
|
]]}
end
+ eq({{"🦄"}, {"BB", {"B0", "B1"}}}, api.nvim_win_get_config(win).title)
+ eq({{"🦄"}, {"BB", {"B0", "B1"}}}, api.nvim_win_get_config(win).footer)
+
+ api.nvim_win_set_config(win, {
+ title = {{"🦄", ""}, {"BB", {"B0", "B1", ""}}}, title_pos = "left",
+ footer= {{"🦄", ""}, {"BB", {"B0", "B1", ""}}}, footer_pos = "left",
+ })
+ if multigrid then
+ screen:expect{grid=[[
+ ## grid 1
+ [2:----------------------------------------]|*6
+ [3:----------------------------------------]|
+ ## grid 2
+ ^ |
+ {0:~ }|*5
+ ## grid 3
+ |
+ ## grid 4
+ {5:╔}🦄{7:BB}{5:═════╗}|
+ {5:║}{1: halloj! }{5:║}|
+ {5:║}{1: BORDAA }{5:║}|
+ {5:╚}🦄{7:BB}{5:═════╝}|
+ ]], float_pos={
+ [4] = { 1001, "NW", 1, 2, 5, true }
+ }, win_viewport={
+ [2] = {win = 1000, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
+ [4] = {win = 1001, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 2, sum_scroll_delta = 0};
+ }}
+ else
+ screen:expect{grid=[[
+ ^ |
+ {0:~ }|
+ {0:~ }{5:╔}🦄{7:BB}{5:═════╗}{0: }|
+ {0:~ }{5:║}{1: halloj! }{5:║}{0: }|
+ {0:~ }{5:║}{1: BORDAA }{5:║}{0: }|
+ {0:~ }{5:╚}🦄{7:BB}{5:═════╝}{0: }|
+ |
+ ]]}
+ end
+ eq({{"🦄", ""}, {"BB", {"B0", "B1", ""}}}, api.nvim_win_get_config(win).title)
+ eq({{"🦄", ""}, {"BB", {"B0", "B1", ""}}}, api.nvim_win_get_config(win).footer)
end)
it('terminates border on edge of viewport when window extends past viewport', function()