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

标签 vim remap pasting

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

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

vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv

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

最佳答案

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

让我们解构第一个映射:

vnoremap J :m '>+1<CR>gv=gv
  • :[range]m {address} 移动 [range] 覆盖的行到下面的线{address} 。这里,范围是由 Vim 自动注入(inject)的: '<,'>意思是“从最新视觉选择的第一行到最后一行”,地址是'>+1 ,意思是“最新视觉选择的最后一行+1行”。所以:'<,'>m '>+1<CR>有效地将所选行移动到其下方,
  • gv重新选择最新的视觉选择,
  • =缩进,
  • gv再次重新选择它以进一步 JK

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

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

xnoremap <key> :co '>+1<CR>gv=gv

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

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

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

xnoremap <key> :co '><CR>gv=gv

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

xnoremap <key> :co '><CR>V'[=gv

参见:help :copy:help '[ .

关于vim - 有没有办法在vim中向上或向下复制选定区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69264441/

相关文章:

git - Vim 忽略自动命令中的特定文件

c++ - 当程序在两者之间进入休眠状态时,OpenCV 函数 cv::remap() 的执行时间更长

ubuntu - 如何在 Lubuntu 中将 caps esc 重新映射到 caps lock 键?

javascript - 如何将图像粘贴到 Web 应用程序中?有哪些解决方案? HTML 5 Canvas ?

vim - 当在 tmux session 中打开的 vim 进程上移动光标时,为什么它时不时地会留下幽灵字符的痕迹 - ^[OB,^[OA?

Vim FZF : sort initial results on file date

haskell - Vim 有什么好的 Haskell 缩进脚本吗?

c++ - 将 opencv 重映射代码从 c++ 转换为 python

C 预处理 : pasting valid token and value of a token