From 5bf1ec232ed5fc8b52b46ffb95d90385cda4a9e9 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 9 Dec 2025 22:49:24 +0000 Subject: [PATCH] Super keymaps --- lua/keymap.lua | 74 ++++++++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/lua/keymap.lua b/lua/keymap.lua index 95d33cb..8b172f0 100644 --- a/lua/keymap.lua +++ b/lua/keymap.lua @@ -38,56 +38,66 @@ vim.keymap.set('n', '', function() vim.cmd.normal 'v`x' end, { desc = 'Select surrounding treesitter node' }) -function get_node_around(node, start_pos, end_pos) - local range = { vim.treesitter.get_node_range(node) } - if - (range[1] == start_pos[1] and range[2] > start_pos[2]) - or (range[3] == end_pos[1] and range[4] < end_pos[2]) - or (range[1] > start_pos[1]) - or (range[3] < end_pos[1]) - then - get_node_around(node:parent(), start_pos, end_pos) - elseif range[3] == end_pos[2] and range[4] < end_pos[3] then - get_node_around(node:parent(), start_pos, end_pos) - else - return node - end -end - vim.keymap.set('v', '', function() - local start_pos = vim.api.nvim_win_get_cursor(0) - local end_pos = vim.fn.getpos "'>" - end_pos = { end_pos[2], end_pos[3] } - local node = vim.treesitter.get_node() - local parent = get_node_around(node:parent(), start_pos, end_pos) - if not parent then - return + local start = vim.api.nvim_win_get_cursor(0) + local start_row, start_column + if start[2] == 0 then + start_row = start[1] - 1 + start_column = 0 + else + start_row = start[1] + start_column = start[2] - 1 end - local range = { vim.treesitter.get_node_range(parent) } + vim.api.nvim_win_set_cursor(0, { start_row, start_column }) + local node = vim.treesitter.get_node {} + local range = { vim.treesitter.get_node_range(node) } vim.api.nvim_win_set_cursor(0, { range[3] + 1, range[4] - 1 }) vim.fn.setpos("'x", { 0, range[1] + 1, range[2] + 1, 0 }) vim.cmd.normal 'i' vim.cmd.normal 'v`x' end, { desc = 'Select surrounding treesitter node' }) +local swappable_nodes = { 'argument', 'array_element_initializer', 'simple_parameter', 'string', 'integer', 'member_call_expression', 'method_declaration' } + +local function closest_swappable_node(node) + while node and not vim.list_contains(swappable_nodes, node:type()) do + node = node:parent() + end + return node +end + vim.keymap.set({ 'n' }, '', function() - local node = vim.treesitter.get_node() - local prev_node = node:prev_sibling() + local node = closest_swappable_node(vim.treesitter.get_node()) + if not node then + return + end + local prev_node = node:prev_named_sibling() + while prev_node and not vim.list_contains(swappable_nodes, prev_node:type()) do + prev_node = prev_node:prev_named_sibling() + end if prev_node == nil then return end - require('nvim-treesitter.ts_utils').swap_nodes(node, prev_node) + require('nvim-treesitter.ts_utils').swap_nodes(node, prev_node, 0, true) end, { desc = 'Swap with node to the left' }) vim.keymap.set({ 'n' }, '', function() - local node = vim.treesitter.get_node() - local next_node = node:next_sibling() + local node = closest_swappable_node(vim.treesitter.get_node()) + if not node then + return + end + local next_node = node:next_named_sibling() + while next_node and not vim.list_contains(swappable_nodes, next_node:type()) do + next_node = next_node:next_named_sibling() + end if next_node == nil then return end - require('nvim-treesitter.ts_utils').swap_nodes(node, next_node) + require('nvim-treesitter.ts_utils').swap_nodes(node, next_node, 0, true) end, { desc = 'Swap with node to the right' }) --- vim.keymap.set('n', '', 'J', { desc = 'Move window to the lower' }) --- vim.keymap.set('n', '', 'K', { desc = 'Move window to the upper' }) +vim.keymap.set('n', '', 'ddp', { desc = 'Move line down' }) +vim.keymap.set('n', '', 'ddkP', { desc = 'Move line up' }) +vim.keymap.set('v', '', 'dop`[v`]', { desc = 'Move selection down' }) +vim.keymap.set('v', '', 'dkOp`[v`]', { desc = 'Move selection up' }) -- Keybinds to make split navigation easier. -- Use CTRL+ to switch between windows