在Vim块模式下,如何最有效地选择列?

在Vim块模式下,如何最有效地选择列?,vim,Vim,假设我有一个文本文件,它有如下内容: 1 aa 1234 2 bbbb 5678 3 cc 9abc 1 aa 1234 2 bbbb 5678 3 cc 9abc 4 dd 1234 5 eeeee 5678 6 ff 9abc 如果我将光标放在字符串“aa”中的第一个“a”上,然后按ctrl-v进入块模式,是否有一组按键将光标向下移动到同一列的最后一行,并向右移动光标,以便完全选中该列中最长的单词(在本例中为“

假设我有一个文本文件,它有如下内容:

1   aa    1234
2   bbbb  5678
3   cc    9abc
1   aa    1234
2   bbbb  5678
3   cc    9abc

4   dd    1234
5   eeeee 5678
6   ff    9abc
如果我将光标放在字符串“aa”中的第一个“a”上,然后按ctrl-v进入块模式,是否有一组按键将光标向下移动到同一列的最后一行,并向右移动光标,以便完全选中该列中最长的单词(在本例中为“bbbb”)

我目前要做的是在字符串“aa”的第一个“a”上输入列模式,然后向下箭头2,然后向右箭头4。这看起来效率很低,我相信有更好的方法

此外,示例中的最后一行可能不是文件中的最后一行。我可以吃点像:

1   aa    1234
2   bbbb  5678
3   cc    9abc
1   aa    1234
2   bbbb  5678
3   cc    9abc

4   dd    1234
5   eeeee 5678
6   ff    9abc

对于这个问题,我只对选择第1-3行中的整列感兴趣。

我不知道如何根据第一列的最长值进行选择,但下面是如何取出整列,包括空格:

ggfa    ; get to line 1, first column of the table

C-v}k   ; select all the wanted lines as a block selection

$Bh     ; unselect last block

x       ; take out selection

如果您担心这一点,您可以随时使用插件重新对齐您的列。

选择在Vim中通常是不必要的。实际上,甚至定义了一个工作领域

与电子表格程序不同,Vim只知道基于字符的单元格列;不是“逻辑”列。如果您的不规则列不在行的末尾,您将无法直观地选择它

但你的目标不是选择那个专栏,是吗

是否要删除它

:,+2norm dw
是否要附加分号

:,+2norm ea;
你想用双引号括起来吗?环绕.vim进行救援:

:,+2norm ysiw"
你想把它剪下来粘贴到别的地方吗

:,+2 norm "Wdw

等等。

看一看。它为列提供文本对象。对于您的示例,您只需将光标定位在中间列中的任何位置,并执行<代码> VIC。< /P> < P>我不知道在选择目标列之后您想做什么。但可以这样做:

faWh<c-v>jB

想法是,将光标(
*
)移动到
1 aa*1234
,然后进入分块选择模式,向后选择目标列。

这对vimgolf来说是个好问题;-)@我不知道维姆高尔夫。谢谢你提到它!实际上,我确实希望选择列,然后复制、删除或修改选择。在这一点上,我确实更喜欢使用可视块模式,因为它可以让我直观地确认我正在操作我想要操作的数据。谢谢你的建议。我不熟悉这种方法,但我确实看到了它的用处。除非参差不齐的列位于行的末尾,否则无法选择非矩形视觉块,因此,如果不剪切几个字符或选择第二列的部分或不必要的空白,就无法使用视觉块来实现目标。