|
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