【问题标题】:Is there a way to copy a selected area up or down in vim?有没有办法在vim中向上或向下复制选定区域?
【发布时间】:2021-11-14 18:04:17
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我没有看到任何问题,只是一个建议。

标签: vim remap pasting


【解决方案1】:

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

让我们解构第一个映射:

vnoremap J :m '>+1<CR>gv=gv
  • :[range]m {address} 移动 [range] 覆盖的行到{address} 的下方。这里的范围是 Vim 自动注入的:'&lt;,'&gt;,意思是“从最新的视觉选择的第一行到最后一行”,地址是'&gt;+1,意思是“最新的视觉选择的最后一行+ 1 行”。所以:'&lt;,'&gt;m '&gt;+1&lt;CR&gt; 有效地移动它们自己下面的选定行,
  • gv 重新选择最新的视觉选择,
  • = 缩进它,
  • gv 再次重新选择它以进一步选择Js 或Ks。

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

果然在:help :move上方找到了:help :copy,我们可以马上试试:

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

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

  • 地址是所选内容最后一行的下一行,
  • 选择被重新选择并缩进,​​这是没有意义的。

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

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

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

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

请参阅 :help :copy:help '[

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多