Skip to content

Commit afcd2af

Browse files
committed
feat: extmarks copy filtering support
1 parent 3288c5a commit afcd2af

File tree

3 files changed

+34
-26
lines changed

3 files changed

+34
-26
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ require'treesitter-context'.setup{
227227
separator = nil,
228228
zindex = 20, -- The Z-index of the context window
229229
on_attach = nil, -- (fun(buf: integer): boolean) return false to disable attaching
230+
filter_extmarks = nil, -- (fun(extmark: [integer, integer, integer, vim.api.keyset.extmark_details]): boolean) filter out extmarks that should not be copied over
230231
}
231232
```
232233

lua/treesitter-context/config.lua

+5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
--- @field mode 'cursor'|'topline'
1212
--- @field separator? string
1313
--- @field on_attach? fun(buf: integer): boolean
14+
--- @field filter_extmarks? fun(extmark: [integer, integer, integer, vim.api.keyset.extmark_details]): boolean
1415

1516
--- @class (exact) TSContext.UserConfig : TSContext.Config
1617
---
@@ -45,6 +46,9 @@
4546
---
4647
--- Callback when attaching. Return false to disable attaching
4748
--- @field on_attach? fun(buf: integer): boolean
49+
---
50+
--- Callback to filter out extmarks that should not be copied over
51+
--- @field filter_extmarks? fun(extmark: [integer, integer, integer, vim.api.keyset.extmark_details]): boolean
4852

4953
--- @type TSContext.Config
5054
local default_config = {
@@ -57,6 +61,7 @@ local default_config = {
5761
trim_scope = 'outer',
5862
zindex = 20,
5963
mode = 'cursor',
64+
filter_extmarks = nil,
6065
}
6166

6267
local config = vim.deepcopy(default_config)

lua/treesitter-context/render.lua

+28-26
Original file line numberDiff line numberDiff line change
@@ -360,35 +360,37 @@ local function copy_extmarks(bufnr, ctx_bufnr, contexts)
360360
local extmarks = api.nvim_buf_get_extmarks(bufnr, -1, {ctx_srow, ctx_scol}, {ctx_erow, ctx_ecol}, { details = true })
361361

362362
for _, m in ipairs(extmarks) do
363-
--- @type integer, integer, integer, vim.api.keyset.extmark_details
364-
local id, row, col, opts = m[1], m[2], m[3], m[4]
363+
if not config.filter_extmarks or config.filter_extmarks(m) then
364+
--- @type integer, integer, integer, vim.api.keyset.extmark_details
365+
local id, row, col, opts = m[1], m[2], m[3], m[4]
365366

366-
local start_row = offset + (row - ctx_srow)
367+
local start_row = offset + (row - ctx_srow)
367368

368-
local end_row --- @type integer?
369-
if opts.end_row then
370-
end_row = offset + (opts.end_row - ctx_srow)
371-
end
369+
local end_row --- @type integer?
370+
if opts.end_row then
371+
end_row = offset + (opts.end_row - ctx_srow)
372+
end
372373

373-
-- Use pcall incase fields from opts are inconsistent with opts in
374-
-- nvim_buf_set_extmark
375-
pcall(add_extmark, ctx_bufnr, start_row, col, {
376-
id = id,
377-
end_row = end_row,
378-
end_col = opts.end_col,
379-
priority = opts.priority,
380-
hl_group = opts.hl_group,
381-
end_right_gravity = opts.end_right_gravity,
382-
right_gravity = opts.right_gravity,
383-
hl_eol = opts.hl_eol,
384-
virt_text = opts.virt_text,
385-
virt_text_pos = opts.virt_text_pos,
386-
virt_text_win_col = opts.virt_text_win_col,
387-
hl_mode = opts.hl_mode,
388-
line_hl_group = opts.line_hl_group,
389-
spell = opts.spell,
390-
url = opts.url,
391-
}, opts.ns_id)
374+
-- Use pcall incase fields from opts are inconsistent with opts in
375+
-- nvim_buf_set_extmark
376+
pcall(add_extmark, ctx_bufnr, start_row, col, {
377+
id = id,
378+
end_row = end_row,
379+
end_col = opts.end_col,
380+
priority = opts.priority,
381+
hl_group = opts.hl_group,
382+
end_right_gravity = opts.end_right_gravity,
383+
right_gravity = opts.right_gravity,
384+
hl_eol = opts.hl_eol,
385+
virt_text = opts.virt_text,
386+
virt_text_pos = opts.virt_text_pos,
387+
virt_text_win_col = opts.virt_text_win_col,
388+
hl_mode = opts.hl_mode,
389+
line_hl_group = opts.line_hl_group,
390+
spell = opts.spell,
391+
url = opts.url,
392+
}, opts.ns_id)
393+
end
392394
end
393395
offset = offset + util.get_range_height(context)
394396
end

0 commit comments

Comments
 (0)