|
19 | 19 |
|
20 | 20 | ---@return string[]
|
21 | 21 | function M.trigger_characters()
|
22 |
| - return { '-', '*', '+', '>', ' ' } |
| 22 | + local characters = vim.tbl_values(list_markers) |
| 23 | + return vim.list_extend(characters, { '>', ' ' }) |
23 | 24 | end
|
24 | 25 |
|
25 | 26 | ---@param buf integer 0 for current buffer
|
26 | 27 | ---@param row integer 0-indexed
|
27 | 28 | ---@param col integer 0-indexed
|
28 | 29 | ---@return lsp.CompletionItem[]?
|
29 | 30 | function M.items(buf, row, col)
|
30 |
| - if buf == 0 then |
31 |
| - buf = util.current('buf') |
32 |
| - end |
33 |
| - |
34 |
| - local has_parser, parser = pcall(vim.treesitter.get_parser, buf) |
35 |
| - if not has_parser or parser == nil then |
36 |
| - return nil |
37 |
| - end |
38 |
| - |
39 |
| - -- Parse current row to get up to date node |
40 |
| - parser:parse({ row, row }) |
41 |
| - local node = vim.treesitter.get_node({ bufnr = buf, pos = { row, col } }) |
| 31 | + buf = buf == 0 and util.current('buf') or buf |
| 32 | + local node = M.get_node(buf, row, col) |
42 | 33 | if node == nil then
|
43 | 34 | return nil
|
44 | 35 | end
|
45 |
| - |
46 |
| - local children = { 'block_quote_marker', 'block_continuation' } |
47 |
| - if vim.tbl_contains(children, node:type()) or list_markers[node:type()] ~= nil then |
48 |
| - node = node:parent() |
49 |
| - if node == nil then |
50 |
| - return nil |
51 |
| - end |
52 |
| - end |
53 |
| - |
54 |
| - local items = {} |
55 |
| - local config = state.get(buf) |
| 36 | + local result, config = {}, state.get(buf) |
56 | 37 | if node:type() == 'block_quote' then
|
57 | 38 | local quote_row = node:range()
|
58 | 39 | if quote_row == row then
|
59 | 40 | local prefix = M.space_prefix(buf, node)
|
60 | 41 | for _, component in pairs(config.callout) do
|
61 |
| - table.insert(items, M.item(prefix .. component.raw, component.rendered, nil)) |
| 42 | + table.insert(result, M.item(prefix .. component.raw, component.rendered, nil)) |
62 | 43 | end
|
63 | 44 | end
|
64 | 45 | elseif node:type() == 'list_item' then
|
65 | 46 | local checkbox = config.checkbox
|
66 | 47 | local prefix = M.list_prefix(buf, row, node)
|
67 |
| - table.insert(items, M.item(prefix .. '[ ] ', checkbox.unchecked.icon, 'unchecked')) |
68 |
| - table.insert(items, M.item(prefix .. '[x] ', checkbox.checked.icon, 'checked')) |
| 48 | + table.insert(result, M.item(prefix .. '[ ] ', checkbox.unchecked.icon, 'unchecked')) |
| 49 | + table.insert(result, M.item(prefix .. '[x] ', checkbox.checked.icon, 'checked')) |
69 | 50 | for name, component in pairs(checkbox.custom) do
|
70 |
| - table.insert(items, M.item(prefix .. component.raw .. ' ', component.rendered, name)) |
| 51 | + table.insert(result, M.item(prefix .. component.raw .. ' ', component.rendered, name)) |
71 | 52 | end
|
72 | 53 | end
|
73 |
| - return items |
| 54 | + return result |
| 55 | +end |
| 56 | + |
| 57 | +---@private |
| 58 | +---@param buf integer |
| 59 | +---@param row integer |
| 60 | +---@param col integer |
| 61 | +---@return TSNode? |
| 62 | +function M.get_node(buf, row, col) |
| 63 | + -- Parse current row to get up to date node |
| 64 | + local has_parser, parser = pcall(vim.treesitter.get_parser, buf) |
| 65 | + if not has_parser or parser == nil then |
| 66 | + return nil |
| 67 | + end |
| 68 | + parser:parse({ row, row }) |
| 69 | + |
| 70 | + local node = vim.treesitter.get_node({ |
| 71 | + bufnr = buf, |
| 72 | + lang = 'markdown', |
| 73 | + pos = { row, col }, |
| 74 | + }) |
| 75 | + local children = vim.tbl_keys(list_markers) |
| 76 | + vim.list_extend(children, { 'block_quote_marker', 'block_continuation' }) |
| 77 | + if node ~= nil and vim.tbl_contains(children, node:type()) then |
| 78 | + node = node:parent() |
| 79 | + end |
| 80 | + return node |
74 | 81 | end
|
75 | 82 |
|
76 | 83 | ---@private
|
|
0 commit comments