From 6c07981853dfedbdd721e51affc38380e576c592 Mon Sep 17 00:00:00 2001 From: psychhim Date: Fri, 10 Oct 2025 23:49:56 +0530 Subject: [PATCH] Fix: Visual mode paste --- lua/keymaps.lua | 51 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/lua/keymaps.lua b/lua/keymaps.lua index bdef5ce..7f8b173 100644 --- a/lua/keymaps.lua +++ b/lua/keymaps.lua @@ -263,7 +263,8 @@ vim.keymap.set('x', 'Y', function() require('copy_to_clipboard_fix').trim_clipboard() end, { noremap = true, silent = true }) --- [[ Paste from clipboard inline with line count ]] +-- [[ Custom inline Paste]] +-- Paste from clipboard local function paste_from_clipboard() -- Get clipboard lines local lines = vim.fn.getreg('+', 1, true) @@ -318,9 +319,8 @@ local function paste_from_clipboard() end vim.keymap.set('n', 'P', paste_from_clipboard, { desc = 'Paste from clipboard before cursor' }) vim.keymap.set('x', 'P', paste_from_clipboard, { desc = 'Paste clipboard over selection' }) - --- [[ Paste Neovim yanks inline ]] --- In Normal Mode before cursor +-- Paste Neovim yanks +-- In Normal Mode, before cursor vim.keymap.set('n', 'p', function() local lines = vim.fn.getreg('"', 1, true) -- get as list of lines if vim.tbl_isempty(lines) then @@ -347,12 +347,43 @@ vim.keymap.set('n', 'p', function() end, { desc = 'Paste before cursor inline' }) -- In Visual Mode, paste over selection without yanking vim.keymap.set('x', 'p', function() - -- Force the unnamed register to characterwise - local reg = vim.fn.getreg('"', 1, true) -- get list of lines - vim.fn.setreg('"', table.concat(reg, '\n'), 'c') -- set as charwise - vim.cmd 'normal! "_dP' -- paste over selection - vim.cmd 'normal! `]' -- move to end of pasted text -end, { desc = 'Paste over selection without yanking' }) + -- Exit visual mode first + vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes('', true, false, true), 'n', false) + vim.schedule(function() + local start_pos = vim.api.nvim_buf_get_mark(0, '<') + local end_pos = vim.api.nvim_buf_get_mark(0, '>') + local start_row, start_col = start_pos[1] - 1, start_pos[2] + local end_row, end_col = end_pos[1] - 1, end_pos[2] + local mode = vim.fn.visualmode() + if mode == 'V' then + -- Full line selection + start_col = 0 + local line = vim.api.nvim_buf_get_lines(0, end_row, end_row + 1, false)[1] or '' + end_col = #line + else + -- Charwise selection → include last char + end_col = end_col + 1 + end + -- Get yanked text + local reg = vim.fn.getreg('"', 1, true) + if #reg == 0 then + return + end + -- Replace the selected text with yanked text + vim.api.nvim_buf_set_text(0, start_row, start_col, end_row, end_col, reg) + -- Move cursor to the end of pasted text + local last_line_text = tostring(reg[#reg] or '') + local last_line = start_row + #reg - 1 + local last_col = #last_line_text + if mode == 'v' then + -- Charwise paste → end of the same line + pcall(vim.api.nvim_win_set_cursor, 0, { start_row + 1, start_col + #last_line_text }) + else + -- Linewise paste → end of last line + pcall(vim.api.nvim_win_set_cursor, 0, { last_line + 1, last_col }) + end + end) +end, { desc = 'Paste over selection', silent = true }) -- [[ Redo ]] vim.keymap.set('n', 'U', '')