From 6258b2b4bab1964f36279e16afc093306b35d006 Mon Sep 17 00:00:00 2001 From: Anshuman Medhi Date: Tue, 6 Jul 2021 07:48:58 +0800 Subject: Add Treesitter extensions for better textobjects (#700) This adds three plugins that use treesitters parsing to provide smarter text objects [ts_textobjects](https://github.com/nvim-treesitter/nvim-treesitter-textobjects) lets you define text objects for things like functions and classes [ts_textsubjects](https://github.com/RRethy/nvim-treesitter-textsubjects.git) defines a smart text object that selects a semantic block around the cursor [ts_hintobjects](https://github.com/mfussenegger/nvim-ts-hint-textobject) uses easymotion style hint labeling to show all the surrounding semantic blocks, letting you choose the correct one I have also added which-key entries for all the above Co-authored-by: Christian Chiarulli --- lua/lv-treesitter/init.lua | 117 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 110 insertions(+), 7 deletions(-) (limited to 'lua/lv-treesitter/init.lua') diff --git a/lua/lv-treesitter/init.lua b/lua/lv-treesitter/init.lua index ea7ff56f..2fdd7f14 100644 --- a/lua/lv-treesitter/init.lua +++ b/lua/lv-treesitter/init.lua @@ -1,6 +1,85 @@ --- if not package.loaded['nvim-treesitter'] then --- return --- end +-- if not package.loaded['nvim-treesitter'] then return end +-- +-- Custom parsers +local parser_config = require("nvim-treesitter.parsers").get_parser_configs() +-- parser_config.make = { +-- install_info = { +-- url = "https://github.com/alemuller/tree-sitter-make", -- local path or git repo +-- files = {"src/parser.c"}, +-- requires_generate_from_grammar = true +-- } +-- } +-- parser_config.just = { +-- install_info = { +-- url = "~/dev/tree-sitter-just", -- local path or git repo +-- files = {"src/parser.c"} +-- } +-- -- filetype = "just", -- if filetype does not agrees with parser name +-- -- used_by = {"bar", "baz"} -- additional filetypes that use this parser +-- } + +-- Custom text objects +local textobj_prefixes = O.treesitter.textobj_prefixes +local textobj_suffixes = O.treesitter.textobj_suffixes +local textobj_sel_keymaps = {} +local textobj_swap_keymaps = {} +local textobj_move_keymaps = { + enable = O.plugin.ts_textobjects, + set_jumps = true, -- whether to set jumps in the jumplist + goto_next_start = {}, + goto_next_end = {}, + goto_previous_start = {}, + goto_previous_end = {}, +} +for obj, suffix in pairs(textobj_suffixes) do + if textobj_prefixes["goto_next"] ~= nil then + textobj_move_keymaps["goto_next_start"][textobj_prefixes["goto_next"] .. suffix[1]] = "@" .. obj .. ".outer" + textobj_move_keymaps["goto_next_end"][textobj_prefixes["goto_next"] .. suffix[2]] = "@" .. obj .. ".outer" + end + if textobj_prefixes["goto_prev"] ~= nil then + textobj_move_keymaps["goto_previous_start"][textobj_prefixes["goto_previous"] .. suffix[2]] = "@" .. obj .. ".outer" + textobj_move_keymaps["goto_previous_end"][textobj_prefixes["goto_previous"] .. suffix[1]] = "@" .. obj .. ".outer" + end + + if textobj_prefixes["inner"] ~= nil then + textobj_sel_keymaps[textobj_prefixes["inner"] .. suffix[1]] = "@" .. obj .. ".inner" + end + if textobj_prefixes["outer"] ~= nil then + textobj_sel_keymaps[textobj_prefixes["outer"] .. suffix[1]] = "@" .. obj .. ".outer" + end + + if textobj_prefixes["swap"] ~= nil then + textobj_swap_keymaps[textobj_prefixes["swap"] .. suffix[1]] = "@" .. obj .. ".outer" + end +end +vim.g.ts_hint_textobject_keys = O.treesitter.hint_labels -- Requires https://github.com/mfussenegger/nvim-ts-hint-textobject/pull/2 + +-- Add which key menu entries +local status, wk = pcall(require, "which-key") +if status then + local normal = { + mode = "n", -- Normal mode + } + local operators = { + mode = "o", -- Operator mode + } + wk.register(textobj_sel_keymaps, operators) + wk.register({ + ["m"] = "Hint Objects", + ["."] = "Textsubject", + [";"] = "Textsubject-big", + }, operators) + wk.register(textobj_swap_keymaps, normal) + wk.register({ + [textobj_prefixes["swap"]] = "Swap", + -- [textobj_prefixes["goto_next"]] = "Jump [", + -- [textobj_prefixes["goto_previous"]] = "Jump ]" + }, normal) + wk.register(textobj_move_keymaps["goto_next_start"], normal) + wk.register(textobj_move_keymaps["goto_next_end"], normal) + wk.register(textobj_move_keymaps["goto_previous_start"], normal) + wk.register(textobj_move_keymaps["goto_previous_end"], normal) +end require("nvim-treesitter.configs").setup { ensure_installed = O.treesitter.ensure_installed, -- one of "all", "maintained" (parsers with maintainers), or a list of languages @@ -10,14 +89,33 @@ require("nvim-treesitter.configs").setup { -- disable = { "c", "ruby" }, -- optional, list of language that will be disabled }, highlight = { - enable = O.treesitter.highlight.enabled, -- false will disable the whole extension + enable = O.treesitter.enabled, -- false will disable the whole extension + additional_vim_regex_highlighting = true, + disable = { "latex" }, + }, + context_commentstring = { + enable = O.plugin.ts_context_commentstring.active, + config = { css = "// %s" }, }, - context_commentstring = { enable = O.plugin.ts_context_commentstring, config = { css = "// %s" } }, -- indent = {enable = true, disable = {"python", "html", "javascript"}}, -- TODO seems to be broken indent = { enable = { "javascriptreact" } }, - autotag = { enable = true }, - + autotag = { enable = O.plugin.ts_autotag.active }, + textobjects = { + swap = { + enable = O.plugin.ts_textobjects, + swap_next = textobj_swap_keymaps, + }, + move = textobj_move_keymaps, + select = { + enable = O.plugin.ts_textobjects, + keymaps = textobj_sel_keymaps, + }, + }, + textsubjects = { + enable = O.plugin.ts_textsubjects, + keymaps = { ["."] = "textsubjects-smart", [";"] = "textsubjects-big" }, + }, playground = { enable = O.plugin.ts_playground.active, disable = {}, @@ -36,4 +134,9 @@ require("nvim-treesitter.configs").setup { show_help = "?", }, }, + rainbow = { + enable = O.plugin.ts_rainbow.active, + extended_mode = true, -- Highlight also non-parentheses delimiters, boolean or table: lang -> boolean + max_file_lines = 1000, -- Do not enable for files with more than 1000 lines, int + }, } -- cgit v1.2.3 From 0b7e8e1b073b7b362f0ea08f989724dd7d312fcc Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 5 Jul 2021 19:56:08 -0400 Subject: fix ts bugs --- lua/lv-treesitter/init.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'lua/lv-treesitter/init.lua') diff --git a/lua/lv-treesitter/init.lua b/lua/lv-treesitter/init.lua index 2fdd7f14..3876fb7a 100644 --- a/lua/lv-treesitter/init.lua +++ b/lua/lv-treesitter/init.lua @@ -100,7 +100,7 @@ require("nvim-treesitter.configs").setup { -- indent = {enable = true, disable = {"python", "html", "javascript"}}, -- TODO seems to be broken indent = { enable = { "javascriptreact" } }, - autotag = { enable = O.plugin.ts_autotag.active }, + -- autotag = { enable = O.plugin.ts_autotag.active }, textobjects = { swap = { enable = O.plugin.ts_textobjects, @@ -134,9 +134,9 @@ require("nvim-treesitter.configs").setup { show_help = "?", }, }, - rainbow = { - enable = O.plugin.ts_rainbow.active, - extended_mode = true, -- Highlight also non-parentheses delimiters, boolean or table: lang -> boolean - max_file_lines = 1000, -- Do not enable for files with more than 1000 lines, int - }, + -- rainbow = { + -- enable = O.plugin.ts_rainbow.active, + -- extended_mode = true, -- Highlight also non-parentheses delimiters, boolean or table: lang -> boolean + -- max_file_lines = 1000, -- Do not enable for files with more than 1000 lines, int + -- }, } -- cgit v1.2.3 From 2e4314331b442dc4686546d9721b0db4769158e0 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 5 Jul 2021 20:15:53 -0400 Subject: another ts typo --- lua/lv-treesitter/init.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'lua/lv-treesitter/init.lua') diff --git a/lua/lv-treesitter/init.lua b/lua/lv-treesitter/init.lua index 3876fb7a..0cd3bf6f 100644 --- a/lua/lv-treesitter/init.lua +++ b/lua/lv-treesitter/init.lua @@ -1,7 +1,7 @@ -- if not package.loaded['nvim-treesitter'] then return end -- -- Custom parsers -local parser_config = require("nvim-treesitter.parsers").get_parser_configs() +-- local parser_config = require("nvim-treesitter.parsers").get_parser_configs() -- parser_config.make = { -- install_info = { -- url = "https://github.com/alemuller/tree-sitter-make", -- local path or git repo @@ -17,7 +17,6 @@ local parser_config = require("nvim-treesitter.parsers").get_parser_configs() -- -- filetype = "just", -- if filetype does not agrees with parser name -- -- used_by = {"bar", "baz"} -- additional filetypes that use this parser -- } - -- Custom text objects local textobj_prefixes = O.treesitter.textobj_prefixes local textobj_suffixes = O.treesitter.textobj_suffixes @@ -89,7 +88,7 @@ require("nvim-treesitter.configs").setup { -- disable = { "c", "ruby" }, -- optional, list of language that will be disabled }, highlight = { - enable = O.treesitter.enabled, -- false will disable the whole extension + enable = O.treesitter.highlight.enabled, -- false will disable the whole extension additional_vim_regex_highlighting = true, disable = { "latex" }, }, -- cgit v1.2.3 From 326f1e7060a06a543fbe7971550650d7606776a4 Mon Sep 17 00:00:00 2001 From: christianchiarulli Date: Mon, 5 Jul 2021 21:03:46 -0400 Subject: more treesitter --- lua/lv-treesitter/init.lua | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'lua/lv-treesitter/init.lua') diff --git a/lua/lv-treesitter/init.lua b/lua/lv-treesitter/init.lua index 0cd3bf6f..27877f03 100644 --- a/lua/lv-treesitter/init.lua +++ b/lua/lv-treesitter/init.lua @@ -1,3 +1,4 @@ +-- TODO refacor this whole file and treesitter in general -- if not package.loaded['nvim-treesitter'] then return end -- -- Custom parsers @@ -99,7 +100,7 @@ require("nvim-treesitter.configs").setup { -- indent = {enable = true, disable = {"python", "html", "javascript"}}, -- TODO seems to be broken indent = { enable = { "javascriptreact" } }, - -- autotag = { enable = O.plugin.ts_autotag.active }, + autotag = { enable = O.plugin.ts_autotag.active }, textobjects = { swap = { enable = O.plugin.ts_textobjects, @@ -133,9 +134,9 @@ require("nvim-treesitter.configs").setup { show_help = "?", }, }, - -- rainbow = { - -- enable = O.plugin.ts_rainbow.active, - -- extended_mode = true, -- Highlight also non-parentheses delimiters, boolean or table: lang -> boolean - -- max_file_lines = 1000, -- Do not enable for files with more than 1000 lines, int - -- }, + rainbow = { + enable = O.plugin.ts_rainbow.active, + extended_mode = true, -- Highlight also non-parentheses delimiters, boolean or table: lang -> boolean + max_file_lines = 1000, -- Do not enable for files with more than 1000 lines, int + }, } -- cgit v1.2.3