Skip to content

Commit 5f8582d

Browse files
committed
fix(treesitter): added a provisional solution for repeatable functions since the { expr = true } throws on repeatable non builtin returns; fixed selection mode on selection textobjects; see nvim-treesitter/nvim-treesitter-textobjects#795
1 parent 593cfa5 commit 5f8582d

File tree

1 file changed

+52
-38
lines changed

1 file changed

+52
-38
lines changed

lua/utils/treesitter.lua

Lines changed: 52 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
---@class Utils.Treesitter.TextObject.Repeatable
88
---@field repeat_last_move_opposite fun()
9-
---@field repeat_last_move fun()
9+
---@field repeat_last_move fun(opts: TSTextObjects.MoveOpts?)
1010
---@field builtin_F_expr fun()
1111
---@field builtin_T_expr fun()
1212
---@field builtin_f_expr fun()
@@ -16,47 +16,61 @@
1616
---@field select_textobject fun(query: string, group: string)
1717

1818
local textobjects = {
19-
group = "textobjects",
20-
mode = { "n", "o", "x" },
21-
options = { expr = true },
19+
group = "textobjects",
20+
mode_nox = { "n", "o", "x" },
21+
mode_ox = { "o", "x" },
22+
options = { expr = true },
2223
}
2324

25+
---@see https://github.com/nvim-treesitter/nvim-treesitter-textobjects/pull/795
26+
---@param func function
27+
---@return string?
28+
function Provisional(func)
29+
local response = func()
30+
31+
return response and vim.api.nvim_feedkeys(vim.v.count1 .. response, "n", true)
32+
end
33+
2434
---@class Utils.Treesitter
2535
M = {
26-
---@param lhs string
27-
---@param to_move Utils.Treesitter.TextObject.Move
28-
---@param query string
29-
to_move_mapper = function(lhs, to_move, query)
30-
vim.keymap.set(textobjects.mode, "[" .. lhs, function()
31-
to_move.goto_previous_start(query, textobjects.group)
32-
end)
33-
vim.keymap.set(textobjects.mode, "[" .. string.upper(lhs), function()
34-
to_move.goto_previous_end(query, textobjects.group)
35-
end)
36-
vim.keymap.set(textobjects.mode, "]" .. lhs, function()
37-
to_move.goto_next_start(query, textobjects.group)
38-
end)
39-
vim.keymap.set(textobjects.mode, "]" .. string.upper(lhs), function()
40-
to_move.goto_next_end(query, textobjects.group)
41-
end)
42-
end,
43-
---@param to_repeatable Utils.Treesitter.TextObject.Repeatable
44-
to_repeatable_mapper = function(to_repeatable)
45-
vim.keymap.set(textobjects.mode, ",", to_repeatable.repeat_last_move_opposite)
46-
vim.keymap.set(textobjects.mode, ";", to_repeatable.repeat_last_move)
47-
vim.keymap.set(textobjects.mode, "F", to_repeatable.builtin_F_expr, textobjects.options)
48-
vim.keymap.set(textobjects.mode, "T", to_repeatable.builtin_T_expr, textobjects.options)
49-
vim.keymap.set(textobjects.mode, "f", to_repeatable.builtin_f_expr, textobjects.options)
50-
vim.keymap.set(textobjects.mode, "t", to_repeatable.builtin_t_expr, textobjects.options)
51-
end,
52-
---@param lhs string
53-
---@param to_select Utils.Treesitter.TextObject.Select
54-
---@param query string
55-
to_select_mapper = function(lhs, to_select, query)
56-
vim.keymap.set(textobjects.mode, lhs, function()
57-
to_select.select_textobject(query, textobjects.group)
58-
end)
59-
end,
36+
---@param lhs string
37+
---@param to_move Utils.Treesitter.TextObject.Move
38+
---@param query string
39+
to_move_mapper = function(lhs, to_move, query)
40+
vim.keymap.set(textobjects.mode_nox, "[" .. lhs, function()
41+
to_move.goto_previous_start(query, textobjects.group)
42+
end)
43+
vim.keymap.set(textobjects.mode_nox, "[" .. string.upper(lhs), function()
44+
to_move.goto_previous_end(query, textobjects.group)
45+
end)
46+
vim.keymap.set(textobjects.mode_nox, "]" .. lhs, function()
47+
to_move.goto_next_start(query, textobjects.group)
48+
end)
49+
vim.keymap.set(textobjects.mode_nox, "]" .. string.upper(lhs), function()
50+
to_move.goto_next_end(query, textobjects.group)
51+
end)
52+
end,
53+
---@param to_repeatable Utils.Treesitter.TextObject.Repeatable
54+
to_repeatable_mapper = function(to_repeatable)
55+
vim.keymap.set(textobjects.mode_nox, ",", function()
56+
Provisional(to_repeatable.repeat_last_move_opposite)
57+
end)
58+
vim.keymap.set(textobjects.mode_nox, ";", function()
59+
Provisional(to_repeatable.repeat_last_move)
60+
end)
61+
vim.keymap.set(textobjects.mode_nox, "F", to_repeatable.builtin_F_expr, textobjects.options)
62+
vim.keymap.set(textobjects.mode_nox, "T", to_repeatable.builtin_T_expr, textobjects.options)
63+
vim.keymap.set(textobjects.mode_nox, "f", to_repeatable.builtin_f_expr, textobjects.options)
64+
vim.keymap.set(textobjects.mode_nox, "t", to_repeatable.builtin_t_expr, textobjects.options)
65+
end,
66+
---@param lhs string
67+
---@param to_select Utils.Treesitter.TextObject.Select
68+
---@param query string
69+
to_select_mapper = function(lhs, to_select, query)
70+
vim.keymap.set(textobjects.mode_ox, lhs, function()
71+
to_select.select_textobject(query, textobjects.group)
72+
end)
73+
end,
6074
}
6175

6276
return M

0 commit comments

Comments
 (0)