{ config, pkgs, lib, ... }: let inherit (lib.modules) mkIf mkMerge; inherit (lib.lists) optional optionals; inherit (lib.nvim.binds) mkSetBinding addDescriptionsToMappings; inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.dag) entryBefore entryAfter; cfg = config.vim.treesitter; usingNvimCmp = config.vim.autocomplete.nvim-cmp.enable; self = import ./treesitter.nix {inherit pkgs lib;}; mappingDefinitions = self.options.vim.treesitter.mappings; mappings = addDescriptionsToMappings cfg.mappings mappingDefinitions; in { config = mkIf cfg.enable { vim = { startPlugins = ["nvim-treesitter"] ++ optional usingNvimCmp "cmp-treesitter"; lazy.plugins = { cmp-treesitter = mkIf usingNvimCmp { package = "cmp-treesitter"; after = '' local path = vim.fn.globpath(vim.o.packpath, 'pack/*/opt/cmp-treesitter') require("rtp_nvim").source_after_plugin_dir(path) ''; }; nvim-cmp.after = mkIf cfg.cmp.enable "require('lz.n').trigger_load('cmp-treesitter')"; }; autocomplete.nvim-cmp.sources = {treesitter = "[Treesitter]";}; treesitter.grammars = optionals cfg.addDefaultGrammars cfg.defaultGrammars; maps = { # HACK: Using mkSetLuaBinding and putting the lua code does not work for some reason: It just selects the whole file. # This works though, and if it ain't broke, don't fix it. normal = mkSetBinding mappings.incrementalSelection.init ":lua require('nvim-treesitter.incremental_selection').init_selection()"; visualOnly = mkMerge [ (mkSetBinding mappings.incrementalSelection.incrementByNode "lua require('nvim-treesitter.incremental_selection').node_incremental()") (mkSetBinding mappings.incrementalSelection.incrementByScope "lua require('nvim-treesitter.incremental_selection').scope_incremental()") (mkSetBinding mappings.incrementalSelection.decrementByNode "lua require('nvim-treesitter.incremental_selection').node_decremental()") ]; }; # For some reason treesitter highlighting does not work on start if this is set before syntax on pluginRC.treesitter-fold = mkIf cfg.fold (entryBefore ["basic"] '' -- This is required by treesitter-context to handle folds vim.o.foldmethod = "expr" vim.o.foldexpr = "nvim_treesitter#foldexpr()" -- This is optional, but is set rather as a sane default. -- If unset, opened files will be folded by automatically as -- the files are opened vim.o.foldenable = false ''); pluginRC.treesitter = entryAfter ["basic"] '' require('nvim-treesitter.configs').setup { -- Disable imperative treesitter options that would attempt to fetch -- grammars into the read-only Nix store. To add additional grammars here -- you must use the `config.vim.treesitter.grammars` option. auto_install = false, sync_install = false, ensure_installed = {}, -- Indentation module for Treesitter indent = { enable = ${toLuaObject cfg.indent.enable}, disable = ${toLuaObject cfg.indent.disable}, }, -- Highlight module for Treesitter highlight = { enable = ${toLuaObject cfg.highlight.enable}, disable = ${toLuaObject cfg.highlight.disable}, additional_vim_regex_highlighting = ${toLuaObject cfg.highlight.additionalVimRegexHighlighting}, }, -- Indentation module for Treesitter -- Keymaps are set to false here as they are -- handled by `vim.maps` entries calling lua -- functions achieving the same functionality. incremental_selection = { enable = ${toLuaObject cfg.incrementalSelection.enable}, disable = ${toLuaObject cfg.incrementalSelection.disable}, keymaps = { init_selection = false, node_incremental = false, scope_incremental = false, node_decremental = false, }, }, } ''; }; }; }