aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-08-20 08:20:19 +0800
committerGitHub <noreply@github.com>2024-08-20 08:20:19 +0800
commita8fbe1d409e08c68b05bc26b096486020ae3162b (patch)
tree0f1a85498382cb7d3674ca33701f6fc156a581f5
parent1d11808bfd2879bf278cd05a7095a6634fa5afec (diff)
downloadrneovim-a8fbe1d409e08c68b05bc26b096486020ae3162b.tar.gz
rneovim-a8fbe1d409e08c68b05bc26b096486020ae3162b.tar.bz2
rneovim-a8fbe1d409e08c68b05bc26b096486020ae3162b.zip
fix(decor): don't use separate DecorSignHighlight for url (#30096)
-rw-r--r--src/nvim/api/extmark.c18
-rw-r--r--test/functional/api/extmark_spec.lua11
-rw-r--r--test/functional/ui/decorations_spec.lua19
3 files changed, 27 insertions, 21 deletions
diff --git a/src/nvim/api/extmark.c b/src/nvim/api/extmark.c
index e30ec9a2ca..1673519479 100644
--- a/src/nvim/api/extmark.c
+++ b/src/nvim/api/extmark.c
@@ -687,6 +687,7 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer line, Integer
if (HAS_KEY(opts, set_extmark, url)) {
url = string_to_cstr(opts->url);
+ has_hl = true;
}
if (opts->ui_watched) {
@@ -758,13 +759,9 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer line, Integer
if (kv_size(virt_lines.data.virt_lines)) {
decor_range_add_virt(&decor_state, r, c, line2, col2, decor_put_vt(virt_lines, NULL), true);
}
- if (url != NULL) {
- DecorSignHighlight sh = DECOR_SIGN_HIGHLIGHT_INIT;
- sh.url = url;
- decor_range_add_sh(&decor_state, r, c, line2, col2, &sh, true, 0, 0);
- }
if (has_hl) {
DecorSignHighlight sh = decor_sh_from_inline(hl);
+ sh.url = url;
decor_range_add_sh(&decor_state, r, c, line2, col2, &sh, true, (uint32_t)ns_id, id);
}
} else {
@@ -788,12 +785,7 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer line, Integer
}
uint32_t decor_indexed = DECOR_ID_INVALID;
- if (url != NULL) {
- DecorSignHighlight sh = DECOR_SIGN_HIGHLIGHT_INIT;
- sh.url = url;
- sh.next = decor_indexed;
- decor_indexed = decor_put_sh(sh);
- }
+
if (sign.flags & kSHIsSign) {
sign.next = decor_indexed;
decor_indexed = decor_put_sh(sign);
@@ -806,9 +798,11 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer line, Integer
}
DecorInline decor = DECOR_INLINE_INIT;
- if (decor_alloc || decor_indexed != DECOR_ID_INVALID || schar_high(hl.conceal_char)) {
+ if (decor_alloc || decor_indexed != DECOR_ID_INVALID || url != NULL
+ || schar_high(hl.conceal_char)) {
if (has_hl) {
DecorSignHighlight sh = decor_sh_from_inline(hl);
+ sh.url = url;
sh.next = decor_indexed;
decor_indexed = decor_put_sh(sh);
}
diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua
index a7f4ba25e0..52d8fd5097 100644
--- a/test/functional/api/extmark_spec.lua
+++ b/test/functional/api/extmark_spec.lua
@@ -1798,10 +1798,15 @@ describe('API/extmarks', function()
end)
it('can set a URL', function()
- set_extmark(ns, 1, 0, 0, { url = 'https://example.com', end_col = 3 })
+ local url1 = 'https://example.com'
+ local url2 = 'http://127.0.0.1'
+ set_extmark(ns, 1, 0, 0, { url = url1, end_col = 3 })
+ set_extmark(ns, 2, 0, 3, { url = url2, hl_group = 'Search', end_col = 5 })
local extmarks = get_extmarks(ns, 0, -1, { details = true })
- eq(1, #extmarks)
- eq('https://example.com', extmarks[1][4].url)
+ eq(2, #extmarks)
+ eq(url1, extmarks[1][4].url)
+ eq(url2, extmarks[2][4].url)
+ eq('Search', extmarks[2][4].hl_group)
end)
it('respects priority', function()
diff --git a/test/functional/ui/decorations_spec.lua b/test/functional/ui/decorations_spec.lua
index 49ba4a7096..1709819575 100644
--- a/test/functional/ui/decorations_spec.lua
+++ b/test/functional/ui/decorations_spec.lua
@@ -2341,21 +2341,28 @@ describe('extmark decorations', function()
it('supports URLs', function()
insert(example_text)
- local url = 'https://example.com'
+ local url1 = 'https://example.com'
+ local url2 = 'http://127.0.0.1'
screen:add_extra_attr_ids {
- u = { url = "https://example.com" },
+ u = { url = url1 },
+ uh = { url = url2, background = Screen.colors.Yellow },
}
api.nvim_buf_set_extmark(0, ns, 1, 4, {
end_col = 14,
- url = url,
+ url = url1,
+ })
+ api.nvim_buf_set_extmark(0, ns, 2, 4, {
+ end_col = 17,
+ hl_group = 'Search',
+ url = url2,
})
- screen:expect{grid=[[
+ screen:expect([[
for _,item in ipairs(items) do |
{u:local text}, hl_id_cell, count = unpack(item) |
- if hl_id_cell ~= nil then |
+ {uh:if hl_id_cell} ~= nil then |
hl_id = hl_id_cell |
end |
for _ = 1, (count or 1) do |
@@ -2368,7 +2375,7 @@ describe('extmark decorations', function()
{1:~ }|
{1:~ }|
|
- ]]}
+ ]])
end)
it('can replace marks in place with different decorations #27211', function()