以下是我的代码:
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中实现。
我不是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!
Tabularize /,\zs
请查看:help \zs
由于之前的模式不起作用,请尝试使用以下内容:
Tabularize /[^,]\+,
在Raimondi的回答基础上,
:Tabularize /,\zs/l0r1
对我来说更有意义,而且只需要一个命令 :-).
l0r1
表示左对齐,左边填充 0 个空格,右边填充 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
约翰,贝蒂·戴维斯,沃利,贝丝 沃尔特,乔治,托马斯,约翰 赫伯特,鲍勃,佩蒂,米克
现在我只需要弄清如何将它们转换为一个可用的 vmap
。
另一个选择可能是作弊,并将名称也用作分隔符的一部分:
:Tabularize /[a-z]*,/l0l1
该程序寻找任何小写名称和逗号。所有内容都向左对齐,分隔逗号后至少有一个空格。
这个怎么样:
%s/,/,\t/g
:Tabularize /,\zs \+/
。 - Raimondi