VIM复制变量列表(垂直排列的单词列表,宽度不同)的方法是什么


let(:aaaaa)   { 123 }
let(:bb)      { true }
let(:ccc_ccc) { "foo bar" }

我想复制所有变量名(:aaaaa,:bb,:ccc_ccc)
例如,在VsCode中,我会使用多行选择
如何在VIM中执行此操作?

一旦变量名称具有不同的长度,块选择就不起作用。

您可以使用命令:%norm f:"Qyt)使"q register"包含以下内容:

:aaaaa:bb:ccc_ccc

其工作方式如下:

  • :%norm的意思是"对所有行应用以下常规命令">
  • f:将光标移动到行上的第一个冒号
  • "Qy将拖动的文本附加到'q'寄存器
  • t)是一个直到下一个右括号的运动

这假设'q'寄存器已经为空(可以使用qqq清除它)。如果只想对一个子集的行执行此操作,则需要替换%具有范围(或视觉选择)。

在那之后,你如何处理寄存器的内容取决于你自己。

"qp会将它们放入缓冲区,然后您可能会执行:s/:/r:/g将冒号处的行拆分如下:

:aaaaa
:bb
:ccc_ccc

如果您的直接目标是在默认寄存器中有这样的东西:

:aaaaa
:bb
:ccc_ccc

如果不能直观地选择任意长度的多个不连续的文本片段,这将不容易实现,而Vim没有现成的功能。

这意味着,如果我们不想使用多光标插件,我们将面临更多涉及替换、宏等的简单方法。

假设光标在第一行,您可以执行以下操作:

:,+2t+2                  " copy the block below itself
:'[,s/.*((.*)).*/1    " remove everything you don't need
:'[,d                    " cut the three lines to the unnamed register

但Vim在有意图地使用时效果最好"复制此";它本身很少是一个目标:它通常是完成更高级别任务所需的几个低级步骤之一(它本身可能是另一个更高级任务的步骤之一)。一个人打算如何处理复制的文本往往在选择最佳策略方面起着重要作用。在这里,您的实际目标可能是将三个变量名放在其定义下方的三行上,这实际上并不意味着复制它们,所以第一步的两个步骤就足够了。

最新更新