我如何与VIM的Tabular插件对齐?

时间:2011-03-25 18:40:16

标签: vim alignment tabular

这是我的代码:

john,betty,wally,beth 
walter,george,thomas,john
herbert,bob,petty,mick`

有没有人知道如何使用VIM的Tabular插件将其与此对齐:

john,    betty,  wally,  beth
walter,  george, thomas, john
herbert, bob,    petty,  mick

我知道如何在Align插件中执行此操作,但无法在Tabular中找到它的工作原理。

6 个答案:

答案 0 :(得分:14)

我不是这方面的大师,我在这里所说的一切都是基于对Tabularize的理解。

Tabularize总是在字段中拆分,由正则表达式描述。例如:

abc,d,e
a,b,cde

:Tab /,

使它按如下方式划分每一行:

|abc|,|d|,|e|
|a|,|b|,|cde|

然后用空格填充每个字段,以便分隔符字段对齐 - 默认情况下,所有内容都会接收和占用空间(我认为最后一个字段除外)。

|abc |, |d |, |e  |
|a   |, |b |, |cde|

导致:

abc , d , e
a   , b , cde

通过添加标志,您可以控制每个字段的对齐和填充。如果提供的标志少于所需的标记,则会重复使用它们。因此,为了使所有内容以相同的方式对齐,例如左边填充0,您可以使用将为每个字段重复的单个标记。所以:

abc,d,e
a,b,cde

Tab /,/l0 <-- or c0, or r0 or whatever

abc,d,e
a  ,b,cde

我想到的结论是,有一个零宽度字段(如:Tab /,\zs)没有多大意义,可能导致它获得模式之后的第一个字符并弄乱,切割它

现在,对我来说:Tab /[^,]\+,没有正常工作,产生了双倍的空格:

john,     betty,   wally,  beth
walter,   george,  thomas, john
herbert,  bob,     petty,  mick`
        ^^       ^^

我认为那是因为没有中间领域。这种模式使一个字段分隔符与另一个并排,如下所示:

|john,||betty,||wally,||beth|

然后默认情况下,使用额外的1个空格填充带有字段的零(在分隔符之间)。

|john, | |betty, | |wally, ||beth| <-- for some outrageous reason the las one is cut.

john,  betty,  wally, beth

如何解决?

我会为分隔符打开空间,这不会导致分隔符靠近其他分隔符。怎么样?只需在逗号后面添加一个空格。

john,betty,wally,beth 
walter,george,thomas,john
herbert,bob,petty,mick`

:%s/,/, /g

john, betty, wally, beth 
walter, george, thomas, john
herbert, bob, petty, mick`

现在你可以在空格和零填充上对齐所有内容:

john, betty, wally, beth 
walter, george, thomas, john
herbert, bob, petty, mick`

:Tab / /l0

john,    betty,  wally,  beth
walter,  george, thomas, john
herbert, bob,    petty,  mick`

我希望这有助于理解Tabularize!

答案 1 :(得分:13)

Tabularize /,\zs

请参阅:help \zs

由于上一个模式不起作用,请尝试使用:

Tabularize /[^,]\+,

答案 2 :(得分:5)

以Raimondi的回答为基础,

:Tabularize /,\zs/l0r1

对我来说更有意义,它也只有一个命令: - )。

l0r1表示左边对齐,左边距为0空格,右边距为1空格。

答案 3 :(得分:1)

另一种选择可能是欺骗并使用这些名称作为分隔符的一部分:

:Tabularize /[a-z]*,/l0l1

使用逗号查找小写的任何名称。所有内容都左对齐,并且分隔的逗号后面至少有一个空格。

答案 4 :(得分:1)

我有类似的事情。我经常需要将逗号分隔的值转换为列:

a, b
a,b,c
a, b, c
a, b, c
ab,cd,ef
ab, cd,ef
ab,cd
ab, cd

john, betty davis, wally, beth 
walter, george, thomas, john
herbert, bob, petty, mick

使用:s/,\s*/, /g准备值在逗号后面添加一个空格:

a, b
a, b, c
a, b, c
a, b, c
ab, cd, ef
ab, cd, ef
ab, cd
ab, cd

john, betty davis, wally, beth 
walter, george, thomas, john
herbert, bob, petty, mick

正在运行:Tab /,\zs \+/10将其转换为:

a,  b
a,  b,  c
a,  b,  c
a,  b,  c
ab, cd, ef
ab, cd, ef
ab, cd
ab, cd

john,    betty davis, wally,  beth
walter,  george,      thomas, john
herbert, bob,         petty,  mick

现在我只需要弄清楚如何将它们变成可行的vmap

答案 5 :(得分:-1)

这是怎么回事:

%s/,/,\t/g