-- nvim-treesitter --- Interface to the AST-level parser generator 'tree-sitter', enabling operations on source code that intelligently understand the syntax. --- Out of the box, grammer-aware code highlighting, indentation, etc. . --- Base for a lot of other plugins that rely on these kinds of features. --- TODO: Look into extensions for: --- * Text Objects: https://github.com/nvim-treesitter/nvim-treesitter-textobjects --- As always, consult return { 'nvim-treesitter/nvim-treesitter', commit = 'cfc6f2c117aaaa82f19bcce44deec2c194d900ab', dependencies = { { 'nvim-treesitter/nvim-treesitter-textobjects', commit = 'ad8f0a472148c3e0ae9851e26a722ee4e29b1595', }, }, build = ':TSUpdate all', -- Update lang parsers unconditionally on build lazy = vim.fn.argc(-1) == 0, -- Load early only when opening file w/cmdline event = { 'VeryLazy', }, cmd = { 'TSUpdateSync', 'TSUpdate', 'TSInstall', }, init = function(plugin) --- Many plugins apparently no longer require("nvim-treesitter"). --- This messes with the lazy-loading logic. --- However, such plugins only otherwise use custom queries (seems to be called "RTP"). --- We therefore register treesitter w/RTP, so such queries will load treesitter. require('lazy.core.loader').add_to_rtp(plugin) require('nvim-treesitter.query_predicates') end, opts = { -- Grammer-Aware Syntax Highlighting highlight = { enable = true, }, -- Grammer-Aware Indentation --- TODO: EXPERIMENTAL - CAREFUL! --indent = { enable = true }, textobjects = { select = { enable = true, lookahead = false, keymaps = { -- You can use the capture groups defined in textobjects.scm ['af'] = { query = '@function.outer', desc = 'Select [A]round [F]unction', }, ['if'] = { query = '@function.inner', desc = 'Select [I]nside [F]unction', }, ['al'] = { query = '@class.outer', desc = 'Select [A]round C[L]ass', }, ['il'] = { query = '@class.outer', desc = 'Select [I]nside C[L]ass', }, ['ac'] = { query = '@cell.outer', desc = 'Select [A]round [C]ell', }, ['ic'] = { query = '@cell.inner', desc = 'Select [I]nside [C]ell', }, }, }, move = { enable = true, set_jumps = true, }, }, -- Always Install Parsers for Languages ensure_installed = { 'ada', 'arduino', 'asm', 'awk', 'bash', 'bibtex', 'c', 'c_sharp', 'clojure', 'cmake', 'comment', 'commonlisp', 'cpp', 'css', 'csv', 'cuda', 'd', 'dart', 'diff', 'disassembly', 'dockerfile', 'dot', 'doxygen', 'dtd', 'editorconfig', 'eex', 'elixir', 'elm', 'erlang', 'fennel', 'fish', 'forth', 'fortran', 'fsh', 'fsharp', 'gap', 'gdscript', 'gdshader', 'git_config', 'git_rebase', 'gitattributes', 'gitcommit', 'gitignore', 'gleam', 'glsl', 'gnuplot', 'go', 'gpg', 'graphql', 'haskell', 'hcl', 'hlsl', 'hlsplaylist', 'html', 'htmldjango', 'hyprlang', 'ini', 'java', 'javascript', 'jq', 'jsdoc', 'json', 'json5', 'jsonc', 'jsonnet', 'julia', 'just', 'kconfig', 'kdl', 'latex', 'llvm', 'lua', 'luadoc', 'luap', 'luau', 'm68k', 'make', 'markdown', 'markdown_inline', 'matlab', 'meson', 'mlir', 'nasm', 'nginx', 'nix', 'objc', 'objdump', 'ocaml', 'pascal', 'pem', 'perl', 'php', 'phpdoc', 'po', 'pod', 'powershell', 'printf', 'prisma', 'prolog', 'promql', 'proto', 'puppet', 'pymanifest', 'python', 'qmldir', 'qmljs', 'r', 'readline', 'regex', 'requirements', 'robots', 'rst', 'ruby', 'rust', 'scala', 'scss', 'sflog', 'smithy', 'sql', 'ssh_config', 'starlark', 'strace', 'svelte', 'swift', 't32', 'tablegen', 'tcl', 'teal', 'terraform', 'tmux', 'todotxt', 'toml', 'tsv', 'tsx', 'turtle', 'typescript', 'typespec', 'typst', 'udev', 'unison', 'usd', 'vala', 'verilog', 'vim', 'vimdoc', 'vue', 'wgsl', 'wgsl_bevy', 'xml', 'xresources', 'yaml', 'zathurarc', 'zig', }, }, config = function(_, opts) require('nvim-treesitter.configs').setup(opts) -- Use Treesitter as the Folding Method --vim.opt.foldmethod = "expr" --vim.opt.foldexpr = "nvim_treesitter#foldexpr()" -- require('vim.treesitter.query').set( 'markdown', 'highlights', [[ ;From MDeiml/tree-sitter-markdown [ (fenced_code_block_delimiter) ] @punctuation.delimiter ]] ) end, }