From 21444552c06240b68fd1ad2c3be4e83f64a10882 Mon Sep 17 00:00:00 2001 From: shadmansaleh Date: Fri, 18 Jun 2021 15:03:12 +0600 Subject: [PATCH 1/2] BugFix(clipboard): Fix block paste not working properly Block copy and paste from system-clipboard currently breaks formatting. This fixes it. The bug occurs because system-clipboard doesn't contain information about what mode the copy was made. Simple solution to this is we keep a cache of copy we last made along with mode information. If system-clipboard returns the cache we apply the mode information that we know about that cache. --- runtime/autoload/provider/clipboard.vim | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/runtime/autoload/provider/clipboard.vim b/runtime/autoload/provider/clipboard.vim index 07f37d604f..dea79f21f0 100644 --- a/runtime/autoload/provider/clipboard.vim +++ b/runtime/autoload/provider/clipboard.vim @@ -156,7 +156,14 @@ function! s:clipboard.get(reg) abort elseif s:selections[a:reg].owner > 0 return s:selections[a:reg].data end - return s:try_cmd(s:paste[a:reg]) + + let clipboard_data = s:try_cmd(s:paste[a:reg]) + if match(&clipboard, '\v(unnamed|unnamedplus)') >= 0 && get(s:selections[a:reg].data, 0, []) == clipboard_data + " When system clipboard return is same as our cache return the cache + " as it contains regtype information + return s:selections[a:reg].data + end + return clipboard_data endfunction function! s:clipboard.set(lines, regtype, reg) abort @@ -175,6 +182,9 @@ function! s:clipboard.set(lines, regtype, reg) abort if s:cache_enabled == 0 call s:try_cmd(s:copy[a:reg], a:lines) + "Cache it anyway we can compare it later to get regtype of the yank + let s:selections[a:reg] = copy(s:selection) + let s:selections[a:reg].data = [a:lines, a:regtype] return 0 end From 47a08ec72ed27ef0ba2519865ebcedf9f62abe8e Mon Sep 17 00:00:00 2001 From: shadmansaleh Date: Fri, 18 Jun 2021 18:17:27 +0600 Subject: [PATCH 2/2] Tests(clipboard): Add test for block paste --- test/functional/provider/clipboard_spec.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/functional/provider/clipboard_spec.lua b/test/functional/provider/clipboard_spec.lua index 2c681eb9d8..e5e21f11a6 100644 --- a/test/functional/provider/clipboard_spec.lua +++ b/test/functional/provider/clipboard_spec.lua @@ -506,6 +506,20 @@ describe('clipboard (with fake clipboard.vim)', function() feed('p') eq('textstar', meths.get_current_line()) end) + + it('Block paste works currectly', function() + insert([[ + aabbcc + ddeeff + ]]) + feed('gg^') -- Goto start of top line enter visual block mode + feed('3ljy^k') -- yank 4x2 block & goto initial location + feed('P') -- Paste it infront + expect([[ + aabbaabbcc + ddeeddeeff + ]]) + end) end) describe('clipboard=unnamedplus', function()