summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua')
-rw-r--r--lua/config/set.lua4
-rw-r--r--lua/plugins/lspconfig.lua6
-rw-r--r--lua/plugins/treesitter.lua235
3 files changed, 149 insertions, 96 deletions
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', '<cr>', node_init, { desc = 'Init selection' })
+ vim.keymap.set('x', '<tab>', node_incremental, { desc = 'Increment selection' })
+ vim.keymap.set('x', '<s-tab>', 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 = '<cr>',
- node_incremental = '<tab>',
- node_decremental = '<s-tab>',
- scope_incremental = '<cr>',
- },
- },
- 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' },
+
+ {
+ '<leader>a',
+ function()
+ require('nvim-treesitter-textobjects.swap').swap_next('@parameter.inner')
+ end,
+ desc = 'Swap with next [a]rgument',
},
- swap = {
- enable = true,
- swap_next = {
- ['<leader>a'] = { query = '@parameter.inner', desc = 'Swap with next [a]rgument' },
- },
- swap_previous = {
- ['<leader>A'] = { query = '@parameter.inner', desc = 'Swap with previous [A]rgument' },
- },
+ {
+ '<leader>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,
}