Vim select 在目标大小可变的块模式下部分多行

Vim select partially multiple lines in block mode where the targets are variable in size

假设您有这个 kotlin 代码:

package sample

data class Sample(
    val title: String,
    val subTitle: String,
    val threeBlocksTitle: String
)

您正在使用 vim 进行编辑,并且您想要使用 Intellij 制作像这样的 V-BLOCK selection:

我所做的一切尝试都会导致以下两种情况之一:

select太多了:

select太少了:

我正在为此苦苦挣扎,我不知道该怎么做 :S

已编辑

我的最终目的是复制 val 名称并使用它作为命名 args 创建一个实例,如下所示:

我建议按步骤分解任务。首先,对齐您需要的线条。它可以通过许多 ways. I use Tabular 插件来实现。 Select 与 V 行并执行:

'<,'>Tabularize/:

现在你有这个:

val title            : String,
val subTitle         : String,
val threeBlocksTitle : String
val title2           : String,

第二步是块 select 和 <C-V>

进一步的步骤取决于您的目标。您可能想删除末尾的空格。将文本放在某处并使用简单的正则表达式,如:

'[,']s; ;;g

另一种使用宏的方法。

清除寄存器a(例如)并将其设置为初始值:

:let @a="\n"

导航到第一个变量并记录宏以注册 q:

qq"Ayiwjq

它将提取单词(变量),将其附加到寄存器 a 并向下移动一行。之后,您可以对要添加到结果的每个变量使用 @qiw 部分可以更改为 t: 如果可能出现非单词字符。

首先,对于视觉select离子:

如果您希望vim显示与 IntelliJ 显示的完全一样的可视块,您无法做到。

然而,如果你只想抽取变量名,当然可以通过vim完成。

在我的示例代码中,我使用了寄存器 x,因此请在尝试解决方案之前清除它。

清除x寄存器:

qxq

你可以做的是,select 包含目标变量名称的 3 行,然后执行:

:'<,'>s/\w\+\ze:/\=setreg('X', submatch(0), 'V')/gn

然后到你要粘贴的地方:

"xp

请注意,当您按下 : 时,vim 会自动添加范围,因此您不必输入

事实上,如果我是你,我会复制这 3 行(整行或没有 val),然后粘贴到某处,编辑起来很容易实现你的目标: