summaryrefslogtreecommitdiff
path: root/lua/config/plugins/treesitter.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/config/plugins/treesitter.lua')
-rw-r--r--lua/config/plugins/treesitter.lua179
1 files changed, 179 insertions, 0 deletions
diff --git a/lua/config/plugins/treesitter.lua b/lua/config/plugins/treesitter.lua
new file mode 100644
index 0000000..654c688
--- /dev/null
+++ b/lua/config/plugins/treesitter.lua
@@ -0,0 +1,179 @@
+return {
+ {
+ "nvim-treesitter/nvim-treesitter",
+ dependencies = {
+ "nvim-treesitter/nvim-treesitter-textobjects",
+ {
+ "nvim-treesitter/nvim-treesitter-context",
+ enabled = false,
+ config = function()
+ require("treesitter-context").setup({
+ mode = "cursor",
+ max_lines = 5,
+ multiline_threshold = 5,
+ })
+ end,
+ },
+ },
+ build = ":TSUpdate",
+ config = function()
+ require("nvim-treesitter.configs").setup({
+ ensure_installed = {
+ "bash",
+ "c",
+ "css",
+ "diff",
+ "gitcommit",
+ "html",
+ "http",
+ "javascript",
+ "json",
+ "lua",
+ "make",
+ "markdown",
+ "markdown_inline",
+ "query",
+ "ruby",
+ "vim",
+ "vimdoc",
+ "xml",
+ "yaml",
+ },
+ auto_install = false,
+ indent = { enable = true },
+
+ highlight = {
+ enable = true,
+ disable = function(_, buf)
+ local max_filesize = 100 * 1024 -- 100 KB
+ local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf))
+ if ok and stats and stats.size > max_filesize then
+ return true
+ end
+ end,
+ additional_vim_regex_highlighting = false,
+ },
+
+ textobjects = {
+ select = {
+ enable = true,
+ lookahead = true,
+ keymaps = {
+ ["aa"] = "@parameter.outer",
+ ["ia"] = "@parameter.inner",
+ ["af"] = "@function.outer",
+ ["if"] = "@function.inner",
+ ["ac"] = "@class.outer",
+ ["ic"] = "@class.inner",
+ ["ai"] = "@conditional.outer",
+ ["ii"] = "@conditional.inner",
+ ["al"] = "@loop.outer",
+ ["il"] = "@loop.inner",
+ ["ab"] = "@block.outer",
+ ["ib"] = "@loop.inner",
+ ["at"] = "@comment.outer",
+ },
+ },
+
+ move = {
+ enable = true,
+ set_jumps = true,
+ goto_next_start = {
+ ["]p"] = "@parameter.inner",
+ ["]m"] = "@function.outer",
+ ["]]"] = "@class.outer",
+ ["]l"] = "@loop.outer",
+ ["]i"] = "@conditional.outer",
+ ["]b"] = "@block.outer",
+ ["]t"] = "@comment.outer",
+ },
+ goto_next_end = {
+ ["]P"] = "@parameter.inner",
+ ["]M"] = "@function.outer",
+ ["]["] = "@class.outer",
+ ["]L"] = "@loop.outer",
+ ["]B"] = "@block.outer",
+ },
+ goto_previous_start = {
+ ["[p"] = "@parameter.inner",
+ ["[m"] = "@function.outer",
+ ["[["] = "@class.outer",
+ ["[l"] = "@loop.outer",
+ ["[i"] = "@conditional.outer",
+ ["[b"] = "@block.outer",
+ ["[t"] = "@comment.outer",
+ },
+ goto_previous_end = {
+ ["[P"] = "@parameter.inner",
+ ["[M"] = "@function.outer",
+ ["[]"] = "@class.outer",
+ ["[L"] = "@loop.outer",
+ ["[B"] = "@block.outer",
+ },
+ },
+
+ swap = {
+ enable = true,
+ swap_next = {
+ ["<Leader>a"] = "@parameter.inner",
+ },
+ swap_previous = {
+ ["<Leader>A"] = "@parameter.inner",
+ },
+ },
+
+ lsp_interop = {
+ enable = true,
+ border = "single",
+ floating_preview_opts = {},
+ peek_definition_code = {
+ ["<Leader>df"] = "@function.outer",
+ ["<Leader>dF"] = "@class.outer",
+ },
+ },
+ },
+ })
+
+ -- Crystal parser
+ local parsers = require("nvim-treesitter.parsers")
+ local parser_config = parsers.get_parser_configs()
+ parser_config.crystal = {
+ install_info = {
+ url = "~/Downloads/src/tree-sitter-crystal",
+ files = { "src/parser.c", "src/scanner.c" },
+ branch = "main",
+ },
+ filetype = "cr",
+ }
+
+ parser_config.haml = {
+ install_info = {
+ url = "https://github.com/vitallium/tree-sitter-haml",
+ files = { "src/parser.c", "src/scanner.c" },
+ branch = "main",
+ },
+ filetype = "haml",
+ }
+
+ -- Code folding
+ vim.opt.foldlevel = 99
+ vim.opt.foldlevelstart = 1
+ vim.opt.foldnestmax = 4
+ vim.opt.foldcolumn = "1"
+ vim.opt.foldenable = false
+ vim.api.nvim_create_autocmd("FileType", {
+ callback = function()
+ if parsers.has_parser() then
+ vim.opt.foldmethod = "expr"
+ vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()"
+ vim.opt.foldtext = ""
+ else
+ vim.opt.foldmethod = "indent"
+ vim.opt.foldtext = ""
+ end
+ end,
+ desc = "Set foldmethod",
+ })
+ end,
+ },
+}