Vim 复制到系统剪贴板而不覆盖默认寄存器(")

Vim 复制到系统剪贴板而不覆盖默认寄存器(")

当我使用"+y复制到系统剪贴板时,选定的内容会复制到寄存器+以及默认的(")寄存器。如何确保内容只复制到寄存器+而不修改"寄存器?

编辑:我现在明白这是预期的行为,任何猛拉都会修改默认寄存器。我仍然想知道是否有解决方法。

我提出了一个天真的解决方案

对于视觉模式

vnoremap <Leader>y :<C-u>let @+=@*<CR>

对于单行

nnoremap <Leader>yy :<C-u>let @+=getline('.') . "\n"<CR>

但我们会缺少许多 yank 功能。我希望有人提供更好的解决方案。

答案1

您需要定义一个自定义运算符;:help :map-operator有详细信息和示例。通过该功能,您还可以轻松实现视觉模式(已在示例中显示)和yy映射(使用v:count . 'yy')。

为了避免 yank 破坏默认寄存器,请将保存和恢复该寄存器的逻辑包含在以下内容中:

let l:save_clipboard = &clipboard
set clipboard= " Avoid clobbering the selection and clipboard registers.
let l:save_reg = getreg('"')
let l:save_regmode = getregtype('"')
" some yank
call setreg('"', l:save_reg, l:save_regmode)
let &clipboard = l:save_clipboard

相关内容