10

这是我的代码:

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

有谁知道如何将它与 VIM 的表格插件对齐:

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

我知道如何在 Align Plugin 中执行此操作,但无法了解它在 Tabular 中的工作原理。

4

6 回答 6

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!

于 2011-03-26T02:52:43.493 回答
13
Tabularize /,\zs

:help \zs

由于以前的模式不起作用,请尝试以下操作:

Tabularize /[^,]\+,
于 2011-03-25T18:54:17.503 回答
6

Building on Raimondi's answer,

:Tabularize /,\zs/l0r1

makes more sense to me and it's also in just one command :-).

The l0r1 means left-align with 0 space in the left padding and 1 space in the right padding.

于 2013-07-08T21:47:45.977 回答
1

另一种选择可能是作弊并将名称也用作分隔符的一部分:

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

它查找任何带有逗号的小写名称。一切都左对齐,并且在分隔的逗号后至少有一个空格。

于 2012-03-30T08:53:25.473 回答
1

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

一,乙
a,b,c
甲,乙,丙
甲,乙,丙
ab,cd,ef
ab、cd、ef
A B C D
A B C D

约翰、贝蒂戴维斯、沃利、贝丝
沃尔特、乔治、托马斯、约翰
赫伯特,鲍勃,小气,米克

使用:s/,\s*/, /gpreps 值在逗号后添加一个空格:

一,乙
甲,乙,丙
甲,乙,丙
甲,乙,丙
ab、cd、ef
ab、cd、ef
A B C D
A B C D

约翰、贝蒂戴维斯、沃利、贝丝
沃尔特、乔治、托马斯、约翰
赫伯特,鲍勃,小气,米克

运行:Tab /,\zs \+/10将它们变成:

一,乙
甲,乙,丙
甲,乙,丙
甲,乙,丙
ab、cd、ef
ab、cd、ef
A B C D
A B C D

约翰、贝蒂戴维斯、沃利、贝丝
沃尔特、乔治、托马斯、约翰
赫伯特,鲍勃,小气,米克

现在我只需要弄清楚如何将它们变成vmap有效的。

于 2013-02-11T21:15:02.253 回答
-1

这个怎么样:

%s/,/,\t/g
于 2011-03-25T19:18:57.990 回答