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

时间:2014-05-08 18:13:18

标签: vim

假设我有一个类似的文本文件:

1   aa    1234
2   bbbb  5678
3   cc    9abc

如果我将光标放在字符串'aa'中的第一个'a'并点击ctrl-v进入块模式,是否有一组键击将光标向下移动到最后一行相同的列并将光标向右移动,以便完全选择列中最长的单词(在这种情况下为'bbbb')?

我目前所做的是在字符串'aa'中的第一个'a'然后向下箭头2,然后向右箭头4进入列模式。这看起来非常低效,我确信有更好的方法可以做它

此外,我示例中的最后一行可能不是我文件中的最后一行。我可以有类似的东西:

1   aa    1234
2   bbbb  5678
3   cc    9abc

4   dd    1234
5   eeeee 5678
6   ff    9abc

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

4 个答案:

答案 0 :(得分:2)

看看textobj-word-column.vim。它为列提供文本对象。对于您的示例,您只需将光标放在中间列的任意位置并执行vic

答案 1 :(得分:1)

Vim中通常不需要选择。甚至定义了一个可以解决的领域。

与电子表格程序不同,Vim只知道基于字符单元格的列;不是"逻辑"列。如果你的衣衫褴褛的柱子不在线的末端,你就不能直观地选择它。

但您的目标是来选择该列,是吗?

要删除吗?

:,+2norm dw

你想附加分号吗?

:,+2norm ea;

你想用双引号括起来吗? Surround.vim救援:

:,+2norm ysiw"

你想把它剪掉并粘贴在其​​他地方吗?

:,+2 norm "Wdw

等等。

答案 2 :(得分:0)

我根本没有看到如何根据第一列的最长时间进行选择,但这里是我如何取出整列,包括空格:

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

如果您担心这一点,您可以随时使用Tabular.vim插件重新排列列。

答案 3 :(得分:0)

选择目标列后,我不知道您要执行的操作。但它可以这样做:

faWh<c-v>jB

如果您的光标已经在第一个a上,只需

Wh<c-v>jB

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