From 2e256be3e91af44cca7852f4a30568eef68bb83a Mon Sep 17 00:00:00 2001 From: David Luevano Alvarado Date: Sat, 1 Aug 2026 21:46:27 -0600 Subject: chore(tree-sitter): fix installation for nvim 0.12 (fuck you) --- init.lua | 2 +- lua/config/set.lua | 4 +- lua/plugins/lspconfig.lua | 6 +- lua/plugins/treesitter.lua | 235 +++++++++++++++++++++++++++------------------ 4 files changed, 150 insertions(+), 97 deletions(-) diff --git a/init.lua b/init.lua index 1ff0c84..0b29a18 100644 --- a/init.lua +++ b/init.lua @@ -3,7 +3,7 @@ require('config.set') -- Install https://github.com/folke/lazy.nvim local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim' -if not vim.loop.fs_stat(lazypath) then +if not vim.uv.fs_stat(lazypath) then vim.fn.system { 'git', 'clone', diff --git a/lua/config/set.lua b/lua/config/set.lua index 71bf222..e10c6a0 100644 --- a/lua/config/set.lua +++ b/lua/config/set.lua @@ -42,13 +42,13 @@ vim.o.termguicolors = true vim.foldmethod='expr' vim.opt.foldexpr='nvim_treesitter#foldexpr()' -- Disable folding at startup. -vim.nofoldenable=true +vim.o.foldenable = false -- Highlight on yank local highlight_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true }) vim.api.nvim_create_autocmd('TextYankPost', { callback = function() - vim.highlight.on_yank() + vim.hl.on_yank() end, group = highlight_group, pattern = '*', diff --git a/lua/plugins/lspconfig.lua b/lua/plugins/lspconfig.lua index bc3eee5..aead9fb 100644 --- a/lua/plugins/lspconfig.lua +++ b/lua/plugins/lspconfig.lua @@ -1,5 +1,5 @@ local function get_lua_lib() - if vim.loop.os_uname().sysname == 'Linux' then + if vim.uv.os_uname().sysname == 'Linux' then return { vim.env.VIMRUNTIME, os.getenv('HOME') .. '/.local/lib/lua', @@ -12,7 +12,7 @@ end local function get_gdscript_cmd() local port = os.getenv('GDScript_Port') or '6005' - if vim.loop.os_uname().sysname == 'Linux' then + if vim.uv.os_uname().sysname == 'Linux' then return { 'nc', 'localhost', port } end return { 'ncat', 'localhost', port } @@ -109,7 +109,7 @@ return { -- Required for the keybinds 'nvim-telescope/telescope.nvim', { 'j-hui/fidget.nvim', tag = 'v1.4.5', opts = { notification = { window = { winblend = 0 } } } }, - { 'folke/neodev.nvim', opts = {} }, + { 'folke/lazydev.nvim', ft = 'lua', opts = {} }, }, config = function() -- nvim-cmp supports additional completion capabilities, so broadcast that to servers diff --git a/lua/plugins/treesitter.lua b/lua/plugins/treesitter.lua index df93a7c..6ad61a1 100644 --- a/lua/plugins/treesitter.lua +++ b/lua/plugins/treesitter.lua @@ -1,102 +1,155 @@ +-- nvim-treesitter `main` branch: required on Neovim 0.12+ (`master` is frozen at 0.11). +-- Modules are gone: highlight/indent/folds are Neovim's, keymaps are plain keymaps. +local langs = { + 'c', + 'cpp', + 'bash', + 'ini', + 'go', + 'lua', + 'python', + 'typescript', + 'vimdoc', + 'vim', + 'css', + 'html', + 'markdown', + 'markdown_inline', + 'php', + 'sql', + 'gdscript', + 'godot_resource', + 'rust', +} + +local no_indent = { cpp = true, python = true, css = true } + +local function move(fn, query) + return function() + require('nvim-treesitter-textobjects.move')[fn](query, 'textobjects') + end +end + +local function select(query) + return function() + require('nvim-treesitter-textobjects.select').select_textobject(query, 'textobjects') + end +end + +-- Replaces the `incremental_selection` module, dropped with the rest of them on `main`. +local nodes = {} + +local function visual_select(node) + local sr, sc, er, ec = node:range() + if ec == 0 then -- node ends at col 0 of the next line; back up to the real last char + er = er - 1 + ec = #(vim.api.nvim_buf_get_lines(0, er, er + 1, false)[1] or '') + end + vim.fn.setpos("'<", { 0, sr + 1, sc + 1, 0 }) + vim.fn.setpos("'>", { 0, er + 1, ec, 0 }) + vim.cmd('normal! gv') +end + +local function node_init() + local node = vim.treesitter.get_node() + if not node then + return + end + nodes = { node } + visual_select(node) +end + +local function node_incremental() + local node = nodes[#nodes] + if not node then + return node_init() + end + local parent = node:parent() + while parent and vim.deep_equal({ parent:range() }, { node:range() }) do + parent = parent:parent() + end + if parent then + nodes[#nodes + 1] = parent + end + visual_select(nodes[#nodes]) +end + +local function node_decremental() + if #nodes > 1 then + table.remove(nodes) + end + if nodes[#nodes] then + visual_select(nodes[#nodes]) + end +end + return { - 'nvim-treesitter/nvim-treesitter', - dependencies = { - 'nvim-treesitter/nvim-treesitter-textobjects', + { + 'nvim-treesitter/nvim-treesitter', + branch = 'main', + lazy = false, + build = ':TSUpdate', + config = function() + require('nvim-treesitter').install(langs) + + vim.api.nvim_create_autocmd('FileType', { + callback = function(ev) + if not pcall(vim.treesitter.start, ev.buf) then + return + end + if not no_indent[ev.match] then + vim.bo[ev.buf].indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" + end + end, + }) + + vim.keymap.set('n', '', node_init, { desc = 'Init selection' }) + vim.keymap.set('x', '', node_incremental, { desc = 'Increment selection' }) + vim.keymap.set('x', '', node_decremental, { desc = 'Decrement selection' }) + end, }, - build = ':TSUpdate', - -- This needs to be manually pased into config and used in the function(_, opts) - -- as it has to be configured with the required...'.config' - opts = { - ensure_installed = { - 'c', - 'cpp', - 'bash', - 'ini', - 'go', - 'lua', - 'python', - 'typescript', - 'vimdoc', - 'vim', - 'css', - 'html', - 'markdown', - 'markdown_inline', - 'php', - 'sql', - 'gdscript', - 'godot_resource', - 'rust', - }, - auto_install = true, - highlight = { enable = true }, - indent = { - enable = true, - disable = { - 'cpp', - 'python', - 'css', }, - }, - incremental_selection = { - enable = true, - keymaps = { - init_selection = '', - node_incremental = '', - node_decremental = '', - scope_incremental = '', - }, - }, - textobjects = { + { + 'nvim-treesitter/nvim-treesitter-textobjects', + branch = 'main', + dependencies = { 'nvim-treesitter/nvim-treesitter' }, + opts = { select = { - enable = true, - -- Automatically jump forward to textobj, similar to targets.vim lookahead = true, include_surrounding_whitespace = false, - keymaps = { - -- You can use the capture groups defined in textobjects.scm - -- The descriptions are simplistic to match the native descriptions - ['aa'] = { query = '@parameter.outer', desc = 'a parameter' }, - ['ia'] = { query = '@parameter.inner', desc = 'a parameter' }, - ['af'] = { query = '@function.outer', desc = 'a function' }, - ['if'] = { query = '@function.inner', desc = 'a function' }, - ['ac'] = { query = '@class.outer', desc = 'a class' }, - ['ic'] = { query = '@class.inner', desc = 'a class' }, - }, }, - -- TODO: change these keymaps to better ones - move = { - enable = true, - -- Whether to set jumps in the jumplist - set_jumps = true, - goto_next_start = { - [']m'] = '@function.outer', - [']]'] = '@class.outer', - }, - goto_next_end = { - [']M'] = '@function.outer', - [']['] = '@class.outer', - }, - goto_previous_start = { - ['[m'] = '@function.outer', - ['[['] = '@class.outer', - }, - goto_previous_end = { - ['[M'] = '@function.outer', - ['[]'] = '@class.outer', - }, + move = { set_jumps = true }, + }, + keys = { + { 'aa', select('@parameter.outer'), mode = { 'x', 'o' }, desc = 'a parameter' }, + { 'ia', select('@parameter.inner'), mode = { 'x', 'o' }, desc = 'inner parameter' }, + { 'af', select('@function.outer'), mode = { 'x', 'o' }, desc = 'a function' }, + { 'if', select('@function.inner'), mode = { 'x', 'o' }, desc = 'inner function' }, + { 'ac', select('@class.outer'), mode = { 'x', 'o' }, desc = 'a class' }, + { 'ic', select('@class.inner'), mode = { 'x', 'o' }, desc = 'inner class' }, + + { ']m', move('goto_next_start', '@function.outer'), mode = { 'n', 'x', 'o' }, desc = 'Next function start' }, + { ']]', move('goto_next_start', '@class.outer'), mode = { 'n', 'x', 'o' }, desc = 'Next class start' }, + { ']M', move('goto_next_end', '@function.outer'), mode = { 'n', 'x', 'o' }, desc = 'Next function end' }, + { '][', move('goto_next_end', '@class.outer'), mode = { 'n', 'x', 'o' }, desc = 'Next class end' }, + { '[m', move('goto_previous_start', '@function.outer'), mode = { 'n', 'x', 'o' }, desc = 'Previous function start' }, + { '[[', move('goto_previous_start', '@class.outer'), mode = { 'n', 'x', 'o' }, desc = 'Previous class start' }, + { '[M', move('goto_previous_end', '@function.outer'), mode = { 'n', 'x', 'o' }, desc = 'Previous function end' }, + { '[]', move('goto_previous_end', '@class.outer'), mode = { 'n', 'x', 'o' }, desc = 'Previous class end' }, + + { + 'a', + function() + require('nvim-treesitter-textobjects.swap').swap_next('@parameter.inner') + end, + desc = 'Swap with next [a]rgument', }, - swap = { - enable = true, - swap_next = { - ['a'] = { query = '@parameter.inner', desc = 'Swap with next [a]rgument' }, - }, - swap_previous = { - ['A'] = { query = '@parameter.inner', desc = 'Swap with previous [A]rgument' }, - }, + { + 'A', + function() + require('nvim-treesitter-textobjects.swap').swap_previous('@parameter.inner') + end, + desc = 'Swap with previous [A]rgument', }, }, }, - config = function(_, opts) - require('nvim-treesitter.configs').setup(opts) - end, } -- cgit v1.3.1