93 lines
3.5 KiB
Lua
93 lines
3.5 KiB
Lua
local treesitter = require("nvim-treesitter")
|
|
local ts_select = require("nvim-treesitter-textobjects.select")
|
|
local ts_move = require("nvim-treesitter-textobjects.move")
|
|
local utils = require("ambroisie.utils")
|
|
local wk = require("which-key")
|
|
|
|
local function select_textobject(query)
|
|
return utils.partial(ts_select.select_textobject, query)
|
|
end
|
|
|
|
local function goto_next_start(query)
|
|
return utils.partial(ts_move.goto_next_start, query)
|
|
end
|
|
local function goto_next_end(query)
|
|
return utils.partial(ts_move.goto_next_end, query)
|
|
end
|
|
local function goto_previous_start(query)
|
|
return utils.partial(ts_move.goto_previous_start, query)
|
|
end
|
|
local function goto_previous_end(query)
|
|
return utils.partial(ts_move.goto_previous_end, query)
|
|
end
|
|
|
|
local objects = {
|
|
mode = { "x", "o" },
|
|
{ "aa", select_textobject("@parameter.outer"), desc = "a parameter" },
|
|
{ "ia", select_textobject("@parameter.inner"), desc = "inner parameter" },
|
|
{ "ab", select_textobject("@block.outer"), desc = "a block" },
|
|
{ "ib", select_textobject("@block.inner"), desc = "inner block" },
|
|
{ "ac", select_textobject("@class.outer"), desc = "a class" },
|
|
{ "ic", select_textobject("@class.inner"), desc = "inner class" },
|
|
{ "af", select_textobject("@function.outer"), desc = "a function" },
|
|
{ "if", select_textobject("@function.inner"), desc = "inner function" },
|
|
{ "ak", select_textobject("@comment.outer"), desc = "a comment" },
|
|
{ "aS", select_textobject("@statement.outer"), desc = "a statement" },
|
|
}
|
|
local moves = {
|
|
mode = { "n", "x", "o" },
|
|
-- Next start
|
|
{ "]m", goto_next_start("@function.outer"), desc = "Next method start" },
|
|
{ "]S", goto_next_start("@statement.outer"), desc = "Next statement start" },
|
|
{ "]]", goto_next_start("@class.outer"), desc = "Next class start" },
|
|
-- Next end
|
|
{ "]M", goto_next_end("@function.outer"), desc = "Next method end" },
|
|
{ "][", goto_next_end("@class.outer"), desc = "Next class end" },
|
|
-- Previous start
|
|
{ "[m", goto_previous_start("@function.outer"), desc = "Previous method start" },
|
|
{ "[S", goto_previous_start("@statement.outer"), desc = "Previous statement start" },
|
|
{ "[[", goto_previous_start("@class.outer"), desc = "Previous class start" },
|
|
-- Previous end
|
|
{ "[M", goto_previous_end("@function.outer"), desc = "Previous method end" },
|
|
{ "[]", goto_previous_end("@class.outer"), desc = "Previous class end" },
|
|
}
|
|
|
|
require("nvim-treesitter-textobjects").setup({
|
|
select = {
|
|
-- Jump to matching text objects
|
|
lookahead = true,
|
|
},
|
|
move = {
|
|
-- Add to jump list
|
|
set_jumps = true,
|
|
},
|
|
})
|
|
|
|
-- Automatically setup treesitter for supported filetypes
|
|
local function treesitter_try_attach(buf, language)
|
|
-- Try to load language
|
|
-- NOTE: the best way I found to check if a filetype has a grammar
|
|
if not vim.treesitter.language.add(language) then
|
|
return false
|
|
end
|
|
|
|
-- Syntax highlighting
|
|
vim.treesitter.start(buf, language)
|
|
-- Indentation
|
|
vim.bo.indentexpr = "v:lua.require('nvim-treesitter').indentexpr()"
|
|
|
|
return true
|
|
end
|
|
|
|
vim.api.nvim_create_autocmd("FileType", {
|
|
pattern = "*",
|
|
group = vim.api.nvim_create_augroup("treesitter_attach", { clear = true }),
|
|
callback = function(args)
|
|
local buf, filetype = args.buf, args.match
|
|
local language = vim.treesitter.language.get_lang(filetype)
|
|
if not language then
|
|
return
|
|
end
|
|
treesitter_try_attach(buf, language)
|
|
end,
|
|
})
|