有没有办法在vim中向上或向下复制选定区域?

Fah*_*roz 2 vim remap pasting

在 VSCode 中,您可以使用 Alt+Shift + 向上或向下复制并向上或向下粘贴选定的文本行。

几个月前我转用了 vim,我真的很怀念这个功能。我发现您可以使用这些视觉模式绑定在视觉模式下向上或向下移动选定的行,

vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv
Run Code Online (Sandbox Code Playgroud)

但如果您也可以在不使用 yy 和 p 的情况下上下复制和粘贴,那就太好了,因为当您完成拉动时,光标将放置在初始位置,退出可视模式并降低工作效率。

rom*_*inl 5

好吧,这就是从互联网上复制和粘贴随机片段而不了解它们的作用的问题:它们是小黑匣子,由于缺乏知识,人们无法随意修改或扩展。

让我们解构第一个映射:

vnoremap J :m '>+1<CR>gv=gv
Run Code Online (Sandbox Code Playgroud)
  • :[range]m {address} 将覆盖的行移动[range]到 line 下方{address}。这里,范围是 Vim 自动注入的:'<,'>表示“从最新视觉选择的第一行到最后一行”,地址是'>+1,表示“最新视觉选择的最后一行 + 1 行”。因此:'<,'>m '>+1<CR>有效地将选定的行移动到其下方,
  • gv重新选择最新的视觉选择,
  • =缩进它,
  • gv再次重新选择它以进行进一步的Js 或Ks。

现在,我们想要一个类似的映射,但用于复制给定的行。也许我们可以开始:help :m并滚动?

果然我们:help :copy在上面找到了:help :move,我们可以立即尝试:

xnoremap <key> :co '>+1<CR>gv=gv
Run Code Online (Sandbox Code Playgroud)

嗯,它并没有真正按照我们想要的方式工作,但这是可以预见的:

  • 地址位于所选内容最后一行下方一行,
  • 重新选择并缩进选择,这是毫无意义的。

我们可以通过删除以下内容来解决第一个问题+1

xnoremap <key> :co '><CR>gv=gv
Run Code Online (Sandbox Code Playgroud)

并通过选择复制的行而不是重新选择最新的选择来修复第二个:

xnoremap <key> :co '><CR>V'[=gv
Run Code Online (Sandbox Code Playgroud)

参见:help :copy:help '[