1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
local api = vim.api
-- Note: The functions used here will be upstreamed eventually.
local ts_utils = require('nvim-treesitter.ts_utils')
local function get_ast_nodes()
local wininfo = vim.fn.getwininfo(api.nvim_get_current_win())[1]
-- Get current TS node.
local cur_node = ts_utils.get_node_at_cursor(0)
if not cur_node then return end
-- Get parent nodes recursively.
local nodes = { cur_node }
local parent = cur_node:parent()
while parent do
table.insert(nodes, parent)
parent = parent:parent()
end
-- Create Leap targets from TS nodes.
local targets = {}
local startline, startcol
for _, node in ipairs(nodes) do
startline, startcol, _, _ = node:range() -- (0,0)
if startline + 1 >= wininfo.topline then
local target = { node = node, pos = { startline + 1, startcol + 1 } }
table.insert(targets, target)
end
end
if #targets >= 1 then return targets end
end
local function select_range(target)
local mode = api.nvim_get_mode().mode
if not mode:match('n?o') then
-- Force going back to Normal (implies mode = v | V | ).
vim.cmd('normal! ' .. mode)
end
ts_utils.update_selection(0, target.node,
mode:match('V') and 'linewise' or
mode:match('') and 'blockwise' or
'charwise'
)
end
local function leap()
require('leap').leap {
targets = get_ast_nodes(),
action = api.nvim_get_mode().mode ~= 'n' and select_range, -- or jump
backward = true
}
end
return { leap = leap }
|