aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua')
-rw-r--r--lua/nvim-treesitter/refactor/navigation.lua4
-rw-r--r--lua/nvim-treesitter/textobjects.lua164
-rw-r--r--lua/nvim-treesitter/ts_utils.lua4
-rw-r--r--lua/nvim-treesitter/utils.lua4
4 files changed, 88 insertions, 88 deletions
diff --git a/lua/nvim-treesitter/refactor/navigation.lua b/lua/nvim-treesitter/refactor/navigation.lua
index a3fee20e8..5f5eebd53 100644
--- a/lua/nvim-treesitter/refactor/navigation.lua
+++ b/lua/nvim-treesitter/refactor/navigation.lua
@@ -1,6 +1,7 @@
-- Definition based navigation module
local ts_utils = require'nvim-treesitter.ts_utils'
+local utils = require'nvim-treesitter.utils'
local locals = require'nvim-treesitter.locals'
local configs = require'nvim-treesitter.configs'
local api = vim.api
@@ -11,8 +12,7 @@ function M.goto_definition(bufnr)
local bufnr = bufnr or api.nvim_get_current_buf()
local node_at_point = ts_utils.get_node_at_cursor()
- -- Set the item in jump list
- vim.cmd "normal! m'"
+ utils.set_jump()
if not node_at_point then return end
diff --git a/lua/nvim-treesitter/textobjects.lua b/lua/nvim-treesitter/textobjects.lua
index 1220acedd..95b46cabc 100644
--- a/lua/nvim-treesitter/textobjects.lua
+++ b/lua/nvim-treesitter/textobjects.lua
@@ -5,6 +5,7 @@ local configs = require "nvim-treesitter.configs"
local parsers = require "nvim-treesitter.parsers"
local queries = require'nvim-treesitter.query'
local ts_utils = require'nvim-treesitter.ts_utils'
+local utils = require'nvim-treesitter.utils'
local M = {}
@@ -80,63 +81,11 @@ function M.select_textobject(query_string)
end
end
-local function swap_textobject(query_string, direction)
- local bufnr, textobject_range, node = textobject_at_point(query_string)
- local step = direction > 0 and 1 or -1
- if not node then return end
- local overlapping_range_ok = false
- local same_parent = true
- for _ = 1, math.abs(direction), step do
- if direction > 0 then
- ts_utils.swap_nodes(textobject_range,
- M.next_textobject(node, query_string, same_parent, overlapping_range_ok, bufnr),
- bufnr,
- "yes, set cursor!")
- else
- ts_utils.swap_nodes(textobject_range,
- M.previous_textobject(node, query_string, same_parent, overlapping_range_ok, bufnr),
- bufnr,
- "yes, set cursor!")
- end
- end
-end
-
-function M.swap_next(query_string)
- swap_textobject(query_string, 1)
+local function get_adjacent(forward, node, query_string, same_parent, overlapping_range_ok, bufnr)
+ local fn = forward and M.next_textobject or M.previous_textobject
+ return fn(node, query_string, same_parent, overlapping_range_ok, bufnr)
end
-function M.swap_previous(query_string)
- swap_textobject(query_string, -1)
-end
-
-function M.goto_adjacent(query_string, forward, start, same_parent, overlapping_range_ok)
- local bufnr, _, node = textobject_at_point(query_string)
- local adjacent_textobject
- if forward then
- adjacent_textobject = M.next_textobject(node, query_string, same_parent, overlapping_range_ok, bufnr)
- else
- adjacent_textobject = M.previous_textobject(node, query_string, same_parent, overlapping_range_ok, bufnr)
- end
-
- if adjacent_textobject then
- local adjacent_textobject_range = {adjacent_textobject:range()}
- if start then
- api.nvim_win_set_cursor(api.nvim_get_current_win(),
- { adjacent_textobject_range[1] + 1, adjacent_textobject_range[2] })
- else
- api.nvim_win_set_cursor(api.nvim_get_current_win(),
- { adjacent_textobject_range[3] + 1, adjacent_textobject_range[4] })
- end
- end
-end
-
--- luacheck: push ignore 631
-M.goto_next_start = function(query_string) M.goto_adjacent(query_string, 'forward', 'start', not 'same_parent', 'overlap ok') end
-M.goto_next_end = function(query_string) M.goto_adjacent(query_string, 'forward', not 'start', not 'same_parent', 'overlap ok') end
-M.goto_previous_start = function(query_string) M.goto_adjacent(query_string, not 'forward', 'start', not 'same_parent', 'overlap ok') end
-M.goto_previous_end = function(query_string) M.goto_adjacent(query_string, not 'forward', not 'start', not 'same_parent', 'overlap ok') end
--- luacheck: pop
-
function M.next_textobject(node, query_string, same_parent, overlapping_range_ok, bufnr)
local node = node or ts_utils.get_node_at_cursor()
local bufnr = bufnr or api.nvim_get_current_buf()
@@ -149,22 +98,20 @@ function M.next_textobject(node, query_string, same_parent, overlapping_range_ok
else
_, _, search_start = node:end_()
end
+ local function scoring_function(match)
+ if match.node == node then return end
+ if not same_parent or node:parent() == match.node:parent() then
+ local _, _, start = match.node:start()
+ local _, _, end_ = match.node:end_()
+ return start > search_start and end_ >= node_end
+ end
+ end
+ local function filter_function(match)
+ local _, _, node_start = match.node:start()
+ return -node_start
+ end
- local next_node = queries.find_best_match(bufnr,
- query_string,
- 'textobjects',
- function(match)
- if match.node == node then return end
- if not same_parent or node:parent() == match.node:parent() then
- local _, _, start = match.node:start()
- local _, _, end_ = match.node:end_()
- return start > search_start and end_ >= node_end
- end
- end,
- function(match)
- local _, _, node_start = match.node:start()
- return -node_start
- end)
+ local next_node = queries.find_best_match(bufnr, query_string, 'textobjects', scoring_function, filter_function)
return next_node and next_node.node
end
@@ -182,24 +129,73 @@ function M.previous_textobject(node, query_string, same_parent, overlapping_rang
else
_, _, search_end = node:start()
end
- local previous_node = queries.find_best_match(bufnr,
- query_string,
- 'textobjects',
- function(match)
- if not same_parent or node:parent() == match.node:parent() then
- local _, _, end_ = match.node:end_()
- local _, _, start = match.node:start()
- return end_ < search_end and start < node_start
- end
- end,
- function(match)
- local _, _, node_end = match.node:end_()
- return node_end
- end)
+
+ local function scoring_function(match)
+ if not same_parent or node:parent() == match.node:parent() then
+ local _, _, end_ = match.node:end_()
+ local _, _, start = match.node:start()
+ return end_ < search_end and start < node_start
+ end
+ end
+
+ local function filter_function(match)
+ local _, _, node_end = match.node:end_()
+ return node_end
+ end
+
+ local previous_node = queries.find_best_match(bufnr, query_string, 'textobjects', scoring_function, filter_function)
return previous_node and previous_node.node
end
+function M.goto_adjacent(query_string, forward, start, same_parent, overlapping_range_ok)
+ local bufnr, _, node = textobject_at_point(query_string)
+ local adjacent_textobject = get_adjacent(forward, node, query_string, same_parent, overlapping_range_ok, bufnr)
+
+ if adjacent_textobject then
+ utils.set_jump()
+
+ local adjacent_textobject_range = {adjacent_textobject: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
+
+local function swap_textobject(query_string, direction)
+ local bufnr, textobject_range, node = textobject_at_point(query_string)
+ if not node then return end
+
+ local step = direction > 0 and 1 or -1
+ local overlapping_range_ok = false
+ local same_parent = true
+ for _ = 1, math.abs(direction), step do
+ local forward = direction > 0
+ local adjacent_textobject = get_adjacent(forward, node, query_string, same_parent, overlapping_range_ok, bufnr)
+ ts_utils.swap_nodes(textobject_range, adjacent_textobject, bufnr, "yes, set cursor!")
+ end
+end
+
+function M.swap_next(query_string)
+ swap_textobject(query_string, 1)
+end
+
+function M.swap_previous(query_string)
+ swap_textobject(query_string, -1)
+end
+
+
+-- luacheck: push ignore 631
+M.goto_next_start = function(query_string) M.goto_adjacent(query_string, 'forward', 'start', not 'same_parent', 'overlap ok') end
+M.goto_next_end = function(query_string) M.goto_adjacent(query_string, 'forward', not 'start', not 'same_parent', 'overlap ok') end
+M.goto_previous_start = function(query_string) M.goto_adjacent(query_string, not 'forward', 'start', not 'same_parent', 'overlap ok') end
+M.goto_previous_end = function(query_string) M.goto_adjacent(query_string, not 'forward', not 'start', not 'same_parent', 'overlap ok') end
+-- luacheck: pop
+
local normal_mode_functions = { "swap_next",
"swap_previous",
"goto_next_start",
diff --git a/lua/nvim-treesitter/ts_utils.lua b/lua/nvim-treesitter/ts_utils.lua
index eddd0f56b..52fdd0fc8 100644
--- a/lua/nvim-treesitter/ts_utils.lua
+++ b/lua/nvim-treesitter/ts_utils.lua
@@ -1,6 +1,7 @@
local api = vim.api
local parsers = require'nvim-treesitter.parsers'
+local utils = require'nvim-treesitter.utils'
local M = {}
@@ -241,8 +242,7 @@ function M.swap_nodes(node_or_range1, node_or_range2, bufnr, cursor_to_second)
vim.lsp.util.apply_text_edits({edit1, edit2}, bufnr)
if cursor_to_second then
- -- Set the item in jump list
- vim.cmd "normal! m'"
+ utils.set_jump()
local char_delta = 0
local line_delta = 0
diff --git a/lua/nvim-treesitter/utils.lua b/lua/nvim-treesitter/utils.lua
index 416326e48..d3d183395 100644
--- a/lua/nvim-treesitter/utils.lua
+++ b/lua/nvim-treesitter/utils.lua
@@ -67,4 +67,8 @@ function M.print_warning(text)
api.nvim_command(string.format([[echohl WarningMsg | echo "%s" | echohl None]], text))
end
+function M.set_jump()
+ vim.cmd "normal! m'"
+end
+
return M