mirror of
https://github.com/nvim-treesitter/nvim-treesitter.git
synced 2026-07-19 03:40:04 -04:00
feat(refactor.navigation): add navigation.goto_{next,previous}_usage
This commit is contained in:
parent
ffe7d96dfd
commit
5948aba886
7 changed files with 72 additions and 20 deletions
|
|
@ -185,6 +185,9 @@ EOF
|
||||||
|
|
||||||
Provides "go to definition" for the symbol under the cursor,
|
Provides "go to definition" for the symbol under the cursor,
|
||||||
and lists the definitions from the current file.
|
and lists the definitions from the current file.
|
||||||
|
goto_next_usage/goto_previous_usage go to the next usage of the
|
||||||
|
identifier under the cursor.
|
||||||
|
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
lua <<EOF
|
lua <<EOF
|
||||||
|
|
@ -195,6 +198,8 @@ require'nvim-treesitter.configs'.setup {
|
||||||
keymaps = {
|
keymaps = {
|
||||||
goto_definition = "gnd",
|
goto_definition = "gnd",
|
||||||
list_definitions = "gnD",
|
list_definitions = "gnD",
|
||||||
|
goto_next_usage = "<a-*>",
|
||||||
|
goto_previous_usage = "<a-#>",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -246,6 +246,10 @@ Supported options:
|
||||||
Defaults to `gnd`.
|
Defaults to `gnd`.
|
||||||
- list_definitions: list all definitions from the current file.
|
- list_definitions: list all definitions from the current file.
|
||||||
Defaults to `gnD`.
|
Defaults to `gnD`.
|
||||||
|
- goto_next_usage: go to next usage of identifier under the cursor.
|
||||||
|
Defaults to `<a-*>`.
|
||||||
|
- goto_previous_usage: go to previous usage of identifier.
|
||||||
|
Defaults to `<a-#>`.
|
||||||
|
|
||||||
>
|
>
|
||||||
lua <<EOF
|
lua <<EOF
|
||||||
|
|
@ -256,6 +260,8 @@ Supported options:
|
||||||
keymaps = {
|
keymaps = {
|
||||||
goto_definition = "gnd",
|
goto_definition = "gnd",
|
||||||
list_definitions = "gnD",
|
list_definitions = "gnD",
|
||||||
|
goto_next_usage = "<a-*>",
|
||||||
|
goto_previous_usage = "<a-#>",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -513,6 +519,14 @@ Returns the previous node within the same parent.
|
||||||
`allow_switch_parent` and `allow_prev_parent` follow the same rule
|
`allow_switch_parent` and `allow_prev_parent` follow the same rule
|
||||||
as |ts_utils.get_next_node| but if the node is the first node.
|
as |ts_utils.get_next_node| but if the node is the first node.
|
||||||
|
|
||||||
|
*ts_utils.goto_node*
|
||||||
|
goto_node(node, goto_end, avoid_set_jump)~
|
||||||
|
|
||||||
|
Sets cursor to the position of `node` in the current windows.
|
||||||
|
If `goto_end` is truthy, the cursor is set to the end the node range.
|
||||||
|
Setting `avoid_set_jump` to `true`, avoids setting the current cursor position
|
||||||
|
to the jump list.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
FUNCTIONS *nvim-treesitter-functions*
|
FUNCTIONS *nvim-treesitter-functions*
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,9 @@ local builtin_modules = {
|
||||||
is_supported = queries.has_locals,
|
is_supported = queries.has_locals,
|
||||||
keymaps = {
|
keymaps = {
|
||||||
goto_definition = "gnd",
|
goto_definition = "gnd",
|
||||||
list_definitions = "gnD"
|
list_definitions = "gnD",
|
||||||
|
goto_next_usage = "<a-*>",
|
||||||
|
goto_previous_usage = "<a-#>",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -12,14 +12,10 @@ function M.goto_definition(bufnr)
|
||||||
local bufnr = bufnr or api.nvim_get_current_buf()
|
local bufnr = bufnr or api.nvim_get_current_buf()
|
||||||
local node_at_point = ts_utils.get_node_at_cursor()
|
local node_at_point = ts_utils.get_node_at_cursor()
|
||||||
|
|
||||||
utils.set_jump()
|
|
||||||
|
|
||||||
if not node_at_point then return end
|
if not node_at_point then return end
|
||||||
|
|
||||||
local definition, _ = locals.find_definition(node_at_point, bufnr)
|
local definition, _ = locals.find_definition(node_at_point, bufnr)
|
||||||
local start_row, start_col, _ = definition:start()
|
ts_utils.goto_node(definition)
|
||||||
|
|
||||||
api.nvim_win_set_cursor(0, { start_row + 1, start_col })
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function M.list_definitions(bufnr)
|
function M.list_definitions(bufnr)
|
||||||
|
|
@ -48,6 +44,25 @@ function M.list_definitions(bufnr)
|
||||||
api.nvim_command('copen')
|
api.nvim_command('copen')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function M.goto_adjacent_usage(bufnr, delta)
|
||||||
|
local bufnr = bufnr or api.nvim_get_current_buf()
|
||||||
|
local node_at_point = ts_utils.get_node_at_cursor()
|
||||||
|
if not node_at_point then return end
|
||||||
|
|
||||||
|
local def_node, scope = locals.find_definition(node_at_point, bufnr)
|
||||||
|
local usages = locals.find_usages(def_node, scope, bufnr)
|
||||||
|
|
||||||
|
local index = utils.index_of(usages, node_at_point)
|
||||||
|
if not index then return end
|
||||||
|
|
||||||
|
local target_index = (index + delta + #usages - 1) % #usages + 1
|
||||||
|
ts_utils.goto_node(usages[target_index])
|
||||||
|
return usages[target_index]
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.goto_next_usage(bufnr) return M.goto_adjacent_usage(bufnr, 1) end
|
||||||
|
function M.goto_previous_usage(bufnr) return M.goto_adjacent_usage(bufnr, -1) end
|
||||||
|
|
||||||
function M.attach(bufnr)
|
function M.attach(bufnr)
|
||||||
local config = configs.get_module('refactor.navigation')
|
local config = configs.get_module('refactor.navigation')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
local utils = require'nvim-treesitter.utils'
|
local ts_utils = require'nvim-treesitter.ts_utils'
|
||||||
local shared = require'nvim-treesitter.textobjects.shared'
|
local shared = require'nvim-treesitter.textobjects.shared'
|
||||||
local attach = require'nvim-treesitter.textobjects.attach'
|
local attach = require'nvim-treesitter.textobjects.attach'
|
||||||
local api = vim.api
|
|
||||||
|
|
||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
|
|
@ -9,18 +8,7 @@ function M.goto_adjacent(query_string, forward, start, same_parent, overlapping_
|
||||||
local bufnr, _, node = shared.textobject_at_point(query_string)
|
local bufnr, _, node = shared.textobject_at_point(query_string)
|
||||||
local adjacent = shared.get_adjacent(forward, node, query_string, same_parent, overlapping_range_ok, bufnr)
|
local adjacent = shared.get_adjacent(forward, node, query_string, same_parent, overlapping_range_ok, bufnr)
|
||||||
|
|
||||||
if adjacent then
|
ts_utils.goto_node(adjacent, not start)
|
||||||
utils.set_jump()
|
|
||||||
|
|
||||||
local adjacent_textobject_range = {adjacent:range()}
|
|
||||||
local position
|
|
||||||
if start then
|
|
||||||
position = { adjacent_textobject_range[1] + 1, adjacent_textobject_range[2] }
|
|
||||||
else
|
|
||||||
position = { adjacent_textobject_range[3] + 1, adjacent_textobject_range[4] }
|
|
||||||
end
|
|
||||||
api.nvim_win_set_cursor(api.nvim_get_current_win(), position)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- luacheck: push ignore 631
|
-- luacheck: push ignore 631
|
||||||
|
|
|
||||||
|
|
@ -276,4 +276,24 @@ function M.swap_nodes(node_or_range1, node_or_range2, bufnr, cursor_to_second)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function M.goto_node(node, goto_end, avoid_set_jump)
|
||||||
|
if not node then return end
|
||||||
|
if not avoid_set_jump then
|
||||||
|
utils.set_jump()
|
||||||
|
end
|
||||||
|
local range = {node:range()}
|
||||||
|
local position
|
||||||
|
if not goto_end then
|
||||||
|
position = { range[1], range[2] }
|
||||||
|
else
|
||||||
|
-- ranges are exclusive: -1 character!
|
||||||
|
if range[4] == 0 then
|
||||||
|
position = { range[3] - 1, -1 }
|
||||||
|
else
|
||||||
|
position = { range[3], range[4] - 1 }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
api.nvim_win_set_cursor(0, { position[1] + 1, position[2] })
|
||||||
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
|
|
||||||
|
|
@ -67,4 +67,12 @@ function M.set_jump()
|
||||||
vim.cmd "normal! m'"
|
vim.cmd "normal! m'"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function M.index_of(tbl, obj)
|
||||||
|
for i, o in ipairs(tbl) do
|
||||||
|
if o == obj then
|
||||||
|
return i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue