-- Better text-objects return { "echasnovski/mini.ai", -- keys = { -- { "a", mode = { "x", "o" } }, -- { "i", mode = { "x", "o" } }, -- }, event = "VeryLazy", opts = function() local ai = require("mini.ai") return { n_lines = 500, custom_textobjects = { o = ai.gen_spec.treesitter({ a = { "@block.outer", "@conditional.outer", "@loop.outer" }, i = { "@block.inner", "@conditional.inner", "@loop.inner" }, }, {}), f = ai.gen_spec.treesitter({ a = "@function.outer", i = "@function.inner" }, {}), c = ai.gen_spec.treesitter({ a = "@class.outer", i = "@class.inner" }, {}), t = { "<([%p%w]-)%f[^<%w][^<>]->.-", "^<.->().*()$" }, d = { "%f[%d]%d+" }, -- digits e = { -- Word with case { "%u[%l%d]+%f[^%l%d]", "%f[%S][%l%d]+%f[^%l%d]", "%f[%P][%l%d]+%f[^%l%d]", "^[%l%d]+%f[^%l%d]", }, "^().*()$", }, g = function() -- Whole buffer, similar to `gg` and 'G' motion local from = { line = 1, col = 1 } local to = { line = vim.fn.line("$"), col = math.max(vim.fn.getline("$"):len(), 1), } return { from = from, to = to } end, u = ai.gen_spec.function_call(), -- u for "Usage" U = ai.gen_spec.function_call({ name_pattern = "[%w_]" }), -- without dot in function name }, } end, config = function(_, opts) require("mini.ai").setup(opts) -- register all text objects with which-key LazyVim.on_load("which-key.nvim", function() ---@type table local i = { [" "] = "Whitespace", ['"'] = 'Balanced "', ["'"] = "Balanced '", ["`"] = "Balanced `", ["("] = "Balanced (", [")"] = "Balanced ) including white-space", [">"] = "Balanced > including white-space", [""] = "Balanced <", ["]"] = "Balanced ] including white-space", ["["] = "Balanced [", ["}"] = "Balanced } including white-space", ["{"] = "Balanced {", ["?"] = "User Prompt", _ = "Underscore", a = "Argument", b = "Balanced ), ], }", c = "Class", d = "Digit(s)", e = "Word in CamelCase & snake_case", f = "Function", g = "Entire file", o = "Block, conditional, loop", q = "Quote `, \", '", t = "Tag", u = "Use/call function & method", U = "Use/call without dot in name", } local a = vim.deepcopy(i) for k, v in pairs(a) do a[k] = v:gsub(" including.*", "") end local ic = vim.deepcopy(i) local ac = vim.deepcopy(a) for key, name in pairs({ n = "Next", l = "Last" }) do i[key] = vim.tbl_extend("force", { name = "Inside " .. name .. " textobject" }, ic) a[key] = vim.tbl_extend("force", { name = "Around " .. name .. " textobject" }, ac) end require("which-key").register({ mode = { "o", "x" }, i = i, a = a, }) end) end, }