add-plugin: nvim-treesitter-textobjects
also add `which-key` groups.
This commit is contained in:
parent
7535dda26f
commit
678ac0187e
|
|
@ -0,0 +1,100 @@
|
||||||
|
return {
|
||||||
|
'nvim-treesitter/nvim-treesitter-textobjects',
|
||||||
|
branch = 'main',
|
||||||
|
-- init = function()
|
||||||
|
-- -- Disable entire built-in ftplugin mappings to avoid conflicts.
|
||||||
|
-- -- See https://github.com/neovim/neovim/tree/master/runtime/ftplugin for built-in ftplugins.
|
||||||
|
-- vim.g.no_plugin_maps = true
|
||||||
|
--
|
||||||
|
-- -- Or, disable per filetype (add as you like)
|
||||||
|
-- -- vim.g.no_python_maps = true
|
||||||
|
-- -- vim.g.no_ruby_maps = true
|
||||||
|
-- -- vim.g.no_rust_maps = true
|
||||||
|
-- -- vim.g.no_go_maps = true
|
||||||
|
-- end,
|
||||||
|
config = function()
|
||||||
|
-- put your config here
|
||||||
|
-- configuration
|
||||||
|
require('nvim-treesitter-textobjects').setup {
|
||||||
|
select = {
|
||||||
|
-- Automatically jump forward to textobj, similar to targets.vim
|
||||||
|
lookahead = true,
|
||||||
|
-- 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 = false,
|
||||||
|
},
|
||||||
|
|
||||||
|
move = {
|
||||||
|
-- whether to set jumps in the jumplist
|
||||||
|
set_jumps = true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
local select = require 'nvim-treesitter-textobjects.select'
|
||||||
|
local move = require 'nvim-treesitter-textobjects.move'
|
||||||
|
|
||||||
|
-- One-place defined treesitter-textobjects
|
||||||
|
local ts_to = {
|
||||||
|
['b'] = 'block',
|
||||||
|
['c'] = 'class',
|
||||||
|
['f'] = 'function',
|
||||||
|
['i'] = 'conditional',
|
||||||
|
['l'] = 'loop',
|
||||||
|
['m'] = 'comment',
|
||||||
|
['p'] = 'parameter',
|
||||||
|
['r'] = 'return',
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Set a _leader_ key to put all treesitter-textobjects under one prefix
|
||||||
|
-- I set this for:
|
||||||
|
-- - avoid conflict. (it's better than setting vim.g.no_plugin_maps = false)
|
||||||
|
-- - experimenting with other plugins like mini.ai and mini.move
|
||||||
|
local ldr = 'o'
|
||||||
|
|
||||||
|
for k, o in pairs(ts_to) do
|
||||||
|
local outer = '@' .. o .. '.outer'
|
||||||
|
local inner = '@' .. o .. '.inner'
|
||||||
|
|
||||||
|
-- [a]round/[i]nner
|
||||||
|
vim.keymap.set({ 'x', 'o' }, 'a' .. ldr .. k, function()
|
||||||
|
select.select_textobject(outer, 'textobjects')
|
||||||
|
end, { desc = 'arround ' .. o })
|
||||||
|
vim.keymap.set({ 'x', 'o' }, 'i' .. ldr .. k, function()
|
||||||
|
select.select_textobject(inner, 'textobjects')
|
||||||
|
end, { desc = 'inner ' .. o })
|
||||||
|
|
||||||
|
-- jump next] / previous[
|
||||||
|
vim.keymap.set({ 'n', 'x', 'o' }, ']' .. ldr .. k, function()
|
||||||
|
move.goto_next_start(outer, 'textobjects')
|
||||||
|
end, { desc = 'next ' .. o .. ' start' })
|
||||||
|
vim.keymap.set({ 'n', 'x', 'o' }, ']' .. ldr .. k:upper(), function()
|
||||||
|
move.goto_next_end(outer, 'textobjects')
|
||||||
|
end, { desc = 'next ' .. o .. ' end' })
|
||||||
|
vim.keymap.set({ 'n', 'x', 'o' }, '[' .. ldr .. k, function()
|
||||||
|
move.goto_previous_start(outer, 'textobjects')
|
||||||
|
end, { desc = 'previous ' .. o .. ' start' })
|
||||||
|
vim.keymap.set({ 'n', 'x', 'o' }, '[' .. ldr .. k:upper(), function()
|
||||||
|
move.goto_previous_end(outer, 'textobjects')
|
||||||
|
end, { desc = 'previous ' .. o .. ' end' })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
@ -26,6 +26,10 @@ return {
|
||||||
{ '<leader>l', group = '[L]SP', mode = { 'n', 'v' } },
|
{ '<leader>l', group = '[L]SP', mode = { 'n', 'v' } },
|
||||||
{ '<leader>t', group = '[T]oggle' },
|
{ '<leader>t', group = '[T]oggle' },
|
||||||
{ '<leader>d', group = '[D]iangostic' },
|
{ '<leader>d', group = '[D]iangostic' },
|
||||||
|
{ 'ao', group = 'TS text[O]bject', mode = { 'v', 'o' } },
|
||||||
|
{ 'io', group = 'TS text[O]bject', mode = { 'v', 'o' } },
|
||||||
|
{ '[o', group = 'TS text[O]bject', mode = { 'n', 'v', 'o' } },
|
||||||
|
{ ']o', group = 'TS text[O]bject', mode = { 'n', 'v', 'o' } },
|
||||||
{ '<leader>h', group = 'Git [H]unk', mode = { 'n', 'v' } },
|
{ '<leader>h', group = 'Git [H]unk', mode = { 'n', 'v' } },
|
||||||
{ 'gr', group = 'LSP Actions', mode = { 'n' } },
|
{ 'gr', group = 'LSP Actions', mode = { 'n' } },
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue