treesitter.lua 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. local M = {}
  2. M.config = function()
  3. O.treesitter = {
  4. ensure_installed = {}, -- one of "all", "maintained" (parsers with maintainers), or a list of languages
  5. ignore_install = {},
  6. matchup = {
  7. enable = false, -- mandatory, false will disable the whole extension
  8. -- disable = { "c", "ruby" }, -- optional, list of language that will be disabled
  9. },
  10. highlight = {
  11. enable = true, -- false will disable the whole extension
  12. additional_vim_regex_highlighting = true,
  13. disable = { "latex" },
  14. },
  15. context_commentstring = {
  16. enable = false,
  17. config = { css = "// %s" },
  18. },
  19. -- indent = {enable = true, disable = {"python", "html", "javascript"}},
  20. -- TODO seems to be broken
  21. indent = { enable = { "javascriptreact" } },
  22. autotag = { enable = false },
  23. textobjects = {
  24. swap = {
  25. enable = false,
  26. -- swap_next = textobj_swap_keymaps,
  27. },
  28. -- move = textobj_move_keymaps,
  29. select = {
  30. enable = false,
  31. -- keymaps = textobj_sel_keymaps,
  32. },
  33. },
  34. textsubjects = {
  35. enable = false,
  36. keymaps = { ["."] = "textsubjects-smart", [";"] = "textsubjects-big" },
  37. },
  38. playground = {
  39. enable = false,
  40. disable = {},
  41. updatetime = 25, -- Debounced time for highlighting nodes in the playground from source code
  42. persist_queries = false, -- Whether the query persists across vim sessions
  43. keybindings = {
  44. toggle_query_editor = "o",
  45. toggle_hl_groups = "i",
  46. toggle_injected_languages = "t",
  47. toggle_anonymous_nodes = "a",
  48. toggle_language_display = "I",
  49. focus_language = "f",
  50. unfocus_language = "F",
  51. update = "R",
  52. goto_node = "<cr>",
  53. show_help = "?",
  54. },
  55. },
  56. rainbow = {
  57. enable = false,
  58. extended_mode = true, -- Highlight also non-parentheses delimiters, boolean or table: lang -> boolean
  59. max_file_lines = 1000, -- Do not enable for files with more than 1000 lines, int
  60. },
  61. }
  62. -- -- TODO refactor treesitter
  63. -- -- @usage pass a table with your desired languages
  64. -- treesitter = {
  65. -- ensure_installed = "all",
  66. -- ignore_install = { "haskell" },
  67. -- highlight = { enabled = true },
  68. -- -- The below are for treesitter-textobjects plugin
  69. -- textobj_prefixes = {
  70. -- goto_next = "]", -- Go to next
  71. -- goto_previous = "[", -- Go to previous
  72. -- inner = "i", -- Select inside
  73. -- outer = "a", -- Selct around
  74. -- swap = "<leader>a", -- Swap with next
  75. -- },
  76. -- textobj_suffixes = {
  77. -- -- Start and End respectively for the goto keys
  78. -- -- for other keys it only uses the first
  79. -- ["function"] = { "f", "F" },
  80. -- ["class"] = { "m", "M" },
  81. -- ["parameter"] = { "a", "A" },
  82. -- ["block"] = { "k", "K" },
  83. -- ["conditional"] = { "i", "I" },
  84. -- ["call"] = { "c", "C" },
  85. -- ["loop"] = { "l", "L" },
  86. -- ["statement"] = { "s", "S" },
  87. -- ["comment"] = { "/", "?" },
  88. -- },
  89. -- -- The below is for treesitter hint textobjects plugin
  90. -- hint_labels = { "h", "j", "f", "d", "n", "v", "s", "l", "a" },
  91. -- },
  92. end
  93. M.setup = function()
  94. -- TODO: refacor this whole file and treesitter in general
  95. -- if not package.loaded['nvim-treesitter'] then return end
  96. --
  97. -- Custom parsers
  98. -- local parser_config = require("nvim-treesitter.parsers").get_parser_configs()
  99. -- parser_config.make = {
  100. -- install_info = {
  101. -- url = "https://github.com/alemuller/tree-sitter-make", -- local path or git repo
  102. -- files = {"src/parser.c"},
  103. -- requires_generate_from_grammar = true
  104. -- }
  105. -- }
  106. -- parser_config.just = {
  107. -- install_info = {
  108. -- url = "~/dev/tree-sitter-just", -- local path or git repo
  109. -- files = {"src/parser.c"}
  110. -- }
  111. -- -- filetype = "just", -- if filetype does not agrees with parser name
  112. -- -- used_by = {"bar", "baz"} -- additional filetypes that use this parser
  113. -- }
  114. -- Custom text objects
  115. -- local textobj_prefixes = O.treesitter.textobj_prefixes
  116. -- local textobj_suffixes = O.treesitter.textobj_suffixes
  117. -- local textobj_sel_keymaps = {}
  118. -- local textobj_swap_keymaps = {}
  119. -- local textobj_move_keymaps = {
  120. -- enable = O.plugin.ts_textobjects,
  121. -- set_jumps = true, -- whether to set jumps in the jumplist
  122. -- goto_next_start = {},
  123. -- goto_next_end = {},
  124. -- goto_previous_start = {},
  125. -- goto_previous_end = {},
  126. -- }
  127. -- for obj, suffix in pairs(textobj_suffixes) do
  128. -- if textobj_prefixes["goto_next"] ~= nil then
  129. -- textobj_move_keymaps["goto_next_start"][textobj_prefixes["goto_next"] .. suffix[1]] = "@" .. obj .. ".outer"
  130. -- textobj_move_keymaps["goto_next_end"][textobj_prefixes["goto_next"] .. suffix[2]] = "@" .. obj .. ".outer"
  131. -- end
  132. -- if textobj_prefixes["goto_previous"] ~= nil then
  133. -- textobj_move_keymaps["goto_previous_start"][textobj_prefixes["goto_previous"] .. suffix[2]] = "@" .. obj .. ".outer"
  134. -- textobj_move_keymaps["goto_previous_end"][textobj_prefixes["goto_previous"] .. suffix[1]] = "@" .. obj .. ".outer"
  135. -- end
  136. --
  137. -- if textobj_prefixes["inner"] ~= nil then
  138. -- textobj_sel_keymaps[textobj_prefixes["inner"] .. suffix[1]] = "@" .. obj .. ".inner"
  139. -- end
  140. -- if textobj_prefixes["outer"] ~= nil then
  141. -- textobj_sel_keymaps[textobj_prefixes["outer"] .. suffix[1]] = "@" .. obj .. ".outer"
  142. -- end
  143. --
  144. -- if textobj_prefixes["swap"] ~= nil then
  145. -- textobj_swap_keymaps[textobj_prefixes["swap"] .. suffix[1]] = "@" .. obj .. ".outer"
  146. -- end
  147. -- end
  148. -- vim.g.ts_hint_textobject_keys = O.treesitter.hint_labels -- Requires https://github.com/mfussenegger/nvim-ts-hint-textobject/pull/2
  149. --
  150. -- -- Add which key menu entries
  151. -- local status, wk = pcall(require, "which-key")
  152. -- if status then
  153. -- local normal = {
  154. -- mode = "n", -- Normal mode
  155. -- }
  156. -- local operators = {
  157. -- mode = "o", -- Operator mode
  158. -- }
  159. -- wk.register(textobj_sel_keymaps, operators)
  160. -- wk.register({
  161. -- ["m"] = "Hint Objects",
  162. -- ["."] = "Textsubject",
  163. -- [";"] = "Textsubject-big",
  164. -- }, operators)
  165. -- wk.register(textobj_swap_keymaps, normal)
  166. -- wk.register({
  167. -- [textobj_prefixes["swap"]] = "Swap",
  168. -- -- [textobj_prefixes["goto_next"]] = "Jump [",
  169. -- -- [textobj_prefixes["goto_previous"]] = "Jump ]"
  170. -- }, normal)
  171. -- wk.register(textobj_move_keymaps["goto_next_start"], normal)
  172. -- wk.register(textobj_move_keymaps["goto_next_end"], normal)
  173. -- wk.register(textobj_move_keymaps["goto_previous_start"], normal)
  174. -- wk.register(textobj_move_keymaps["goto_previous_end"], normal)
  175. -- end
  176. local status_ok, treesitter_configs = pcall(require, "nvim-treesitter.configs")
  177. if not status_ok then
  178. return
  179. end
  180. treesitter_configs.setup(O.treesitter)
  181. end
  182. return M