106 lines
3.4 KiB
Lua
106 lines
3.4 KiB
Lua
local function gh(repo) return 'https://github.com/' .. repo end
|
|
do
|
|
vim.pack.add { { src = gh 'nvim-treesitter/nvim-treesitter', version = 'main' } }
|
|
|
|
local parsers = {
|
|
'bash',
|
|
'c',
|
|
'diff',
|
|
'html',
|
|
'lua',
|
|
'luadoc',
|
|
'markdown',
|
|
'markdown_inline',
|
|
'query',
|
|
'vim',
|
|
'vimdoc',
|
|
'go',
|
|
'typescript',
|
|
'javascript',
|
|
'kotlin',
|
|
'yaml',
|
|
'html',
|
|
'json',
|
|
'markdown',
|
|
'markdown_inline',
|
|
'python',
|
|
'rust',
|
|
'toml',
|
|
'yaml',
|
|
}
|
|
|
|
require('nvim-treesitter').install(parsers)
|
|
|
|
---@param buf integer
|
|
---@param language string
|
|
local function treesitter_try_attach(buf, language)
|
|
-- Check if a parser exists and load it
|
|
if not vim.treesitter.language.add(language) then return end
|
|
-- Enable syntax highlighting and other treesitter features
|
|
vim.treesitter.start(buf, language)
|
|
|
|
-- Enable treesitter based folds
|
|
-- For more info on folds see `:help folds`
|
|
-- vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()'
|
|
-- vim.wo.foldmethod = 'expr'
|
|
|
|
-- Check if treesitter indentation is available for this language, and if so enable it
|
|
-- in case there is no indent query, the indentexpr will fallback to the vim's built in one
|
|
local has_indent_query = vim.treesitter.query.get(language, 'indents') ~= nil
|
|
|
|
-- Enable treesitter based indentation
|
|
if has_indent_query then vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" end
|
|
end
|
|
|
|
local available_parsers = require('nvim-treesitter').get_available()
|
|
vim.api.nvim_create_autocmd('FileType', {
|
|
callback = function(args)
|
|
local buf, filetype = args.buf, args.match
|
|
|
|
local language = vim.treesitter.language.get_lang(filetype)
|
|
if not language then return end
|
|
|
|
local installed_parsers = require('nvim-treesitter').get_installed 'parsers'
|
|
|
|
if vim.tbl_contains(installed_parsers, language) then
|
|
-- Enable the parser if it is already installed
|
|
treesitter_try_attach(buf, language)
|
|
elseif vim.tbl_contains(available_parsers, language) then
|
|
-- If a parser is available in `nvim-treesitter`, auto-install it and enable it after the installation is done
|
|
require('nvim-treesitter').install(language):await(function() treesitter_try_attach(buf, language) end)
|
|
else
|
|
-- Try to enable treesitter features in case the parser exists but is not available from `nvim-treesitter`
|
|
treesitter_try_attach(buf, language)
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- [[ Configure Treesitter ]] See `:help nvim-treesitter`
|
|
require('nvim-treesitter').setup {
|
|
ensure_installed = {},
|
|
-- Autoinstall languages that are not installed
|
|
auto_install = true,
|
|
highlight = {
|
|
enable = true,
|
|
disable = {}, -- list of language that will be disabled
|
|
-- Some languages depend on vim's regex highlighting system (such as Ruby) for indent rules.
|
|
-- If you are experiencing weird indenting issues, add the language to
|
|
-- the list of additional_vim_regex_highlighting and disabled languages for indent.
|
|
additional_vim_regex_highlighting = { 'ruby' },
|
|
},
|
|
indent = { enable = true, disable = { 'ruby' } },
|
|
textobjects = {
|
|
select = {
|
|
enable = true,
|
|
lookahead = true,
|
|
keymaps = {
|
|
['af'] = '@function.outer',
|
|
['if'] = '@function.inner',
|
|
['ac'] = '@class.outer',
|
|
['ic'] = '@class.inner',
|
|
},
|
|
},
|
|
},
|
|
}
|
|
end
|