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

What is the VIM way to copy a list of variables (a list of words vertically aligned with different widths)?

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

我想复制所有变量名(:aaaaa, :bb, :ccc_ccc)。
例如,在 VsCode 中,我会使用多行选择。
我怎样才能在 VIM 中做到这一点?

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

如果您的直接目标是在默认寄存器中包含类似这样的内容:

:aaaaa
:bb
:ccc_ccc

那么如果没有可视化 select 多个 non-contiguous 段任意长度的文本的能力,就不容易实现,Vim 没有盒子.

这意味着,如果我们不想使用多游标插件,我们就会有更多涉及替换、宏等的行人方式。

假设光标在第一行,你可以这样做:

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

但是 Vim 在有意使用时效果最好。 “复制这个”本身很少是一个目标:它通常是完成 higher-level 任务所需的几个 low-level 步骤之一(它本身可能是另一个甚至 higher-level任务)。一个人打算如何处理复制的文本通常在选择最佳策略方面起着重要作用。在这里,您的实际目标可能是在其定义正下方的三行中获取三个变量名称,这实际上并不意味着 copying 它们,因此前两个步骤应该是够了

您可以使用命令 :%norm f:"Qyt) 让您的 'q register' 包含 以下:

:aaaaa:bb:ccc_ccc

其工作方式如下:

  • :%norm表示'to all lines, apply the following normal commands'
  • f: 将光标移动到该行的第一个冒号
  • "Qy 将抽取的文本附加到 'q' 寄存器
  • t) 是一个动议 '直到下一个右括号

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

之后如何处理寄存器的内容由您决定。

"qp 会将它们放入缓冲区,然后你可能会 :s/:/\r:/g 像这样在冒号处拆分行:

:aaaaa
:bb
:ccc_ccc