diff --git a/src/nvim/extmark.c b/src/nvim/extmark.c index cbca6e0039..51d34ddd70 100644 --- a/src/nvim/extmark.c +++ b/src/nvim/extmark.c @@ -272,8 +272,11 @@ ExtmarkInfoArray extmark_get(buf_T *buf, uint32_t ns_id, int l_row, colnr_T l_co return array; } - MTPair pair; - while (marktree_itr_step_overlap(buf->b_marktree, itr, &pair)) { + while ((int64_t)kv_size(array) < amount) { + MTPair pair; + if (!marktree_itr_step_overlap(buf->b_marktree, itr, &pair)) { + break; + } push_mark(&array, ns_id, type_filter, pair); } } else { diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 1d030a2ee3..42f3a8fe30 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -817,6 +817,15 @@ describe('API/extmarks', function() get_extmarks(ns, { 2, 0 }, { 2, -1 }, { overlap = true }) ) end) + + it('limits overlap results', function() + set_extmark(ns, 1, 0, 0, { end_row = 5, end_col = 0 }) + set_extmark(ns, 2, 2, 5, { end_row = 2, end_col = 30 }) + set_extmark(ns, 3, 0, 5, { end_row = 2, end_col = 10 }) + set_extmark(ns, 4, 0, 0, { end_row = 1, end_col = 0 }) + local rv = get_extmarks(ns, { 2, 0 }, { 2, -1 }, { overlap = true, limit = 1 }) + eq(1, #rv) + end) end) it('replace works', function()