nixvimConfig/plugins/treesitter.nix
2024-09-09 12:01:29 +02:00

151 lines
5.5 KiB
Nix

# homepage: https://github.com/nvim-treesitter/nvim-treesitter
# nixvim doc: https://nix-community.github.io/nixvim/plugins/treesitter/index.html
{ lib, ... }:
{
opts = {
# Enable treesitter syntax highlighting
enable = true;
# Enable treesitter based indentation (use '=' to auto-indent)
settings = {
indent.enable = true;
highlight = {
enable = true;
};
};
# Workaround to enable incremental selection without setting default keymaps (keymaps are set globally)
# This is needed in order to set custom descriptions and avoid to have multiple keymaps
# See https://github.com/nix-community/nixvim/issues/1506
settings.incremental_selection = {
enable = true;
keymaps = lib.mkForce { };
};
settings.highlight.enable = true;
};
rootOpts = {
# Enable catppuccin colors
# https://github.com/catppuccin/nvim/blob/main/lua/catppuccin/groups/integrations/treesitter.lua
colorschemes.catppuccin.settings.integrations.treesitter = true;
keymaps = [
{
mode = [ "n" "x" "o" ];
key = ",";
action.__raw = "function() require('nvim-treesitter.textobjects.repeatable_move').repeat_last_move() end";
options.desc = "Repeat last move";
}
{
mode = [ "n" "x" "o" ];
key = "-";
action.__raw = "function() require('nvim-treesitter.textobjects.repeatable_move').repeat_last_move_opposite() end";
options.desc = "Repeat last move in the opposite direction";
}
{
mode = "n";
key = "<leader>ls";
action.__raw = "function() require('nvim-treesitter.incremental_selection').init_selection() end";
options.desc = "Start incremental selection";
}
{
mode = "v";
key = "<leader>ld";
action.__raw = "function() require('nvim-treesitter.incremental_selection').node_decremental() end";
options.desc = "Decrement node selection";
}
{
mode = "v";
key = "<leader>li";
action.__raw = "function() require('nvim-treesitter.incremental_selection').node_incremental() end";
options.desc = "Increment node selection";
}
{
mode = "v";
key = "<leader>lc";
action.__raw = "function() require('nvim-treesitter.incremental_selection').scope_incremental() end";
options.desc = "Increment scope selection";
}
];
# Treesitter textobjects configuration
plugins.treesitter-textobjects = {
enable = true;
# Jump across text objects
move = {
enable = true;
setJumps = true;
gotoNextStart = {
"]k" = { query = "@block.outer"; desc = "Next block start"; };
"]f" = { query = "@function.outer"; desc = "Next function start"; };
"]a" = { query = "@parameter.inner"; desc = "Next argument start"; };
};
gotoNextEnd = {
"]K" = { query = "@block.outer"; desc = "Next block end"; };
"]F" = { query = "@function.outer"; desc = "Next function end"; };
"]A" = { query = "@parameter.inner"; desc = "Next argument end"; };
};
gotoPreviousStart = {
"[k" = { query = "@block.outer"; desc = "Previous block start"; };
"[f" = { query = "@function.outer"; desc = "Previous function start"; };
"[a" = { query = "@parameter.inner"; desc = "Previous argument start"; };
};
gotoPreviousEnd = {
"[K" = { query = "@block.outer"; desc = "Previous block end"; };
"[F" = { query = "@function.outer"; desc = "Previous function end"; };
"[A" = { query = "@parameter.inner"; desc = "Previous argument end"; };
};
};
# Select text objects
select = {
enable = true;
# Automatically jump to next textobjects, ie. if a keymap is pressed
# while the cursor is not under a textobject, the next relevant
# textobject will be used as "source", similar to the default nvim
# behavior
lookahead = true;
keymaps = {
ak = { query = "@block.outer"; desc = "around block"; };
ik = { query = "@block.inner"; desc = "inside block"; };
ac = { query = "@class.outer"; desc = "around class"; };
ic = { query = "@class.inner"; desc = "inside class"; };
"a?" = { query = "@conditional.outer"; desc = "around conditional"; };
"i?" = { query = "@conditional.inner"; desc = "inside conditional"; };
af = { query = "@function.outer"; desc = "around function"; };
"if" = { query = "@function.inner"; desc = "inside function"; };
ao = { query = "@loop.outer"; desc = "around loop"; };
io = { query = "@loop.inner"; desc = "inside loop"; };
aa = { query = "@parameter.outer"; desc = "around argument"; };
ia = { query = "@parameter.inner"; desc = "inside argument"; };
};
};
# Swap nodes with next/previous one
swap = {
enable = true;
swapNext = {
">K" = { query = "@block.outer"; desc = "Swap next block"; };
">F" = { query = "@function.outer"; desc = "Swap next function"; };
">A" = { query = "@parameter.inner"; desc = "Swap next argument"; };
};
swapPrevious = {
"<K" = { query = "@block.outer"; desc = "Swap previous block"; };
"<F" = { query = "@function.outer"; desc = "Swap previous function"; };
"<A" = { query = "@parameter.inner"; desc = "Swap previous argument"; };
};
};
};
};
}