local M = {
  'nvim-treesitter/nvim-treesitter',
  dependencies = {
    'nvim-treesitter/nvim-treesitter-textobjects',
    'nvim-treesitter/nvim-treesitter-refactor',
    'nvim-treesitter/nvim-treesitter-context',
    -- { 'yioneko/nvim-yati', tag = 'legacy' },
    -- { dir = '/home/sogun/devel/nvim-yati/', }
  },
  build = ':TSUpdate',
}

function M.config()
  local ts_parsers = require 'nvim-treesitter.parsers'.get_parser_configs()
  -- ts_parsers.xml = {
  --   install_info = {
  --     url = 'https://github.com/dorgnarg/tree-sitter-xml', -- local path or git repo
  --     files = { 'src/parser.c' },
  --     -- optional entries:
  --     branch = 'main',                       -- default branch in case of git repo if different from master
  --     generate_requires_npm = false,         -- if stand-alone parser without npm dependencies
  --     requires_generate_from_grammar = true, -- if folder contains pre-generated src/parser.c
  --   },
  --   filetype = 'xml',                        -- if filetype does not match the parser name
  -- }
  ts_parsers.just = {
    install_info = {
      url = 'https://github.com/IndianBoy42/tree-sitter-just', -- local path or git repo
      files = { 'src/parser.c', 'src/scanner.c' },
      -- optional entries:
      branch = 'main', -- default branch in case of git repo if different from master
    },
  }


  require 'nvim-treesitter.configs'.setup {
    ensure_installed = 'all', -- one of "all", "maintained" (parsers with maintainers), or a list of languages
    ignore_install = {},
    auto_install = true,
    sync_install = false,
    refactor = {
      highlight_current_scope = { enable = false },
      smart_rename = {
        enable = true,
        -- Assign keymaps to false to disable them, e.g. `smart_rename = false`.
        keymaps = {
          smart_rename = '<Leader>er',
        },
      },
      navigation = {
        enable = true,
        -- Assign keymaps to false to disable them, e.g. `goto_definition = false`.
        keymaps = {
          goto_definition = 'gd',
          list_definitions = 'gtD',
          list_definitions_toc = 'gO',
          goto_next_usage = ']u',
          goto_previous_usage = '[u',
        },
      },
    },
    context = {
      enable = true,
    },
    highlight = {
      enable = true,
      disable = { 'help' },
    },
    incremental_selection = {
      enable = true,
      init_selection = "gnn",
      node_incremental = "grn",
      scope_incremental = "grc",
      node_decremental = "grm",
    },
    indent = {
      disable = { 'php' },   -- php indent SUCKS A LOT
      enable = true,
    },
    textobjects = {
      swap = {
        enable = true,
        swap_next = {
          ['<leader>ep'] = '@parameter.inner',
        },
        swap_previous = {
          ['<leader>eP'] = '@parameter.inner',
        },
      },
      select = {
        enable = true,
        -- Automatically jump forward to textobj, similar to targets.vim
        lookahead = true,
        keymaps = {
          -- You can use the capture groups defined in textobjects.scm
          ['af'] = '@function.outer',
          ['if'] = '@function.inner',
          ['ac'] = '@class.outer',
          -- You can optionally set descriptions to the mappings (used in the desc parameter of
          -- nvim_buf_set_keymap) which plugins like which-key display
          ['ic'] = { query = '@class.inner', desc = 'Select inner part of a class region' },
        },
        -- You can choose the select mode (default is charwise 'v')
        --
        -- Can also be a function which gets passed a table with the keys
        -- * query_string: eg '@function.inner'
        -- * method: eg 'v' or 'o'
        -- and should return the mode ('v', 'V', or '<c-v>') or a table
        -- mapping query_strings to modes.
        selection_modes = {
          ['@parameter.outer'] = 'v',   -- charwise
          ['@function.outer'] = 'V',    -- linewise
          ['@class.outer'] = '<c-v>',   -- blockwise
        },
        -- If you set this to `true` (default is `false`) then any textobject is
        -- extended to include preceding or succeeding whitespace. Succeeding
        -- whitespace has priority in order to act similarly to eg the built-in
        -- `ap`.
        --
        -- Can also be a function which gets passed a table with the keys
        -- * query_string: eg '@function.inner'
        -- * selection_mode: eg 'v'
        -- and should return true of false
        include_surrounding_whitespace = true,
      },
    },
  }
end

return M
