If you woke up to the news that treesitter has set
their default branch to main from the now frozen
master then you may wish to know how to now configure
your plugins that depend on it in neovim. Here's how I did
it in my local dotfiles.
Treesitter
The treesitter config is simplified quite a bit, however there is no longer a
ensure_installed config option so you need to do it this way instead.
Note: I am using lazy.nvim to manage my packages and have a layout that loads
configs that use the structure where I have a plugins/ directory that
returns the table that lazy needs to install.
return {
"nvim-treesitter/nvim-treesitter",
lazy = false,
build = ":TSUpdate",
config = function()
local ts = require 'nvim-treesitter'
local parsers = {
"bash",
"comment",
"css",
"diff",
"dockerfile",
"elixir",
"git_config",
"gitcommit",
"gitignore",
"groovy",
"go",
"heex",
"hcl",
"html",
"http",
"java",
"javascript",
"jsdoc",
"json",
"json5",
"jsonc",
"lua",
"make",
"markdown",
"markdown_inline",
"python",
"regex",
"rst",
"rust",
"scss",
"ssh_config",
"sql",
"terraform",
"typst",
"toml",
"tsx",
"typescript",
"vim",
"vimdoc",
"yaml",
}
for _, parser in ipairs(parsers) do
ts.install(parser)
end
vim.treesitter.language.register("groovy", "Jenkinsfile")
vim.wo[0][0].foldexpr = 'v:lua.vim.treesitter.foldexpr()'
vim.wo[0][0].foldmethod = 'expr'
vim.api.nvim_command("set nofoldenable")
vim.api.nvim_create_autocmd('FileType', {
pattern = parsers,
callback = function()
vim.treesitter.start()
end,
})
end,
}
Treesitter Text-Objects
For
treesitter-text-objects,
I just split that out into a new file, and called the recommended setup. Quite
a straightforward copy paste job, bit still worth ensuring that the pinned
dependent version is the main branch.
return {
"nvim-treesitter/nvim-treesitter-textobjects",
branch = "main",
dependencies = { "nvim-treesitter/nvim-treesitter", branch = "main" },
init = function()
vim.g.no_plugin_maps = true
end,
config = function()
require("nvim-treesitter-textobjects").setup {
select = {
lookahead = true,
selection_modes = {
['@parameter.outer'] = 'v', ['@function.outer'] = 'V', ['@class.outer'] = '<c-v>', },
include_surrounding_whitespace = false,
},
move = {
set_jumps = true,
},
}
local select = require "nvim-treesitter-textobjects.select"
vim.keymap.set({ "x", "o" }, "am", function()
select.select_textobject("@function.outer", "textobjects")
end)
vim.keymap.set({ "x", "o" }, "im", function()
select.select_textobject("@function.inner", "textobjects")
end)
vim.keymap.set({ "x", "o" }, "ac", function()
select.select_textobject("@class.outer", "textobjects")
end)
vim.keymap.set({ "x", "o" }, "ic", function()
select.select_textobject("@class.inner", "textobjects")
end)
vim.keymap.set({ "x", "o" }, "as", function()
select.select_textobject("@local.scope", "locals")
end)
local swap = require("nvim-treesitter-textobjects.swap")
vim.keymap.set("n", "<leader>a", function()
swap.swap_next "@parameter.inner"
end)
vim.keymap.set("n", "<leader>A", function()
swap.swap_previous "@parameter.outer"
end)
local move = require("nvim-treesitter-textobjects.move")
vim.keymap.set({ "n", "x", "o" }, "]m", function()
move.goto_next_start("@function.outer", "textobjects")
end)
vim.keymap.set({ "n", "x", "o" }, "]]", function()
move.goto_next_start("@class.outer", "textobjects")
end)
vim.keymap.set({ "n", "x", "o" }, "]o", function()
move.goto_next_start({ "@loop.inner", "@loop.outer" }, "textobjects")
end)
vim.keymap.set({ "n", "x", "o" }, "]s", function()
move.goto_next_start("@local.scope", "locals")
end)
vim.keymap.set({ "n", "x", "o" }, "]z", function()
move.goto_next_start("@fold", "folds")
end)
vim.keymap.set({ "n", "x", "o" }, "]M", function()
move.goto_next_end("@function.outer", "textobjects")
end)
vim.keymap.set({ "n", "x", "o" }, "][", function()
move.goto_next_end("@class.outer", "textobjects")
end)
vim.keymap.set({ "n", "x", "o" }, "[m", function()
move.goto_previous_start("@function.outer", "textobjects")
end)
vim.keymap.set({ "n", "x", "o" }, "[[", function()
move.goto_previous_start("@class.outer", "textobjects")
end)
vim.keymap.set({ "n", "x", "o" }, "[M", function()
move.goto_previous_end("@function.outer", "textobjects")
end)
vim.keymap.set({ "n", "x", "o" }, "[]", function()
move.goto_previous_end("@class.outer", "textobjects")
end)
vim.keymap.set({ "n", "x", "o" }, "]d", function()
move.goto_next("@conditional.outer", "textobjects")
end)
vim.keymap.set({ "n", "x", "o" }, "[d", function()
move.goto_previous("@conditional.outer", "textobjects")
end)
local ts_repeat_move = require "nvim-treesitter-textobjects.repeatable_move"
vim.keymap.set({ "n", "x", "o" }, ";", ts_repeat_move.repeat_last_move_next)
vim.keymap.set({ "n", "x", "o" }, ",", ts_repeat_move.repeat_last_move_previous)
vim.keymap.set({ "n", "x", "o" }, "f", ts_repeat_move.builtin_f_expr, { expr = true })
vim.keymap.set({ "n", "x", "o" }, "F", ts_repeat_move.builtin_F_expr, { expr = true })
vim.keymap.set({ "n", "x", "o" }, "t", ts_repeat_move.builtin_t_expr, { expr = true })
vim.keymap.set({ "n", "x", "o" }, "T", ts_repeat_move.builtin_T_expr, { expr = true })
end,
}
Happy Vimming!