Как мне выровнять это с помощью табличного плагина VIM? - PullRequest
10 голосов
/ 25 марта 2011

Это мой код:

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.

Ответы [ 6 ]

14 голосов
/ 26 марта 2011

Я не мастер в этом, и все, что я скажу здесь, основано на моем понимании 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|

Затем к нулю с созданным полем (между разделителями) также добавляется дополнительный пробел по умолчанию.

|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!

13 голосов
/ 25 марта 2011
Tabularize /,\zs

См. :help \zs

Поскольку предыдущий шаблон не работает, попробуйте следующее:

Tabularize /[^,]\+,
5 голосов
/ 09 июля 2013

Опираясь на ответ Раймонди,

:Tabularize /,\zs/l0r1

имеет больше смысла для меня, и это также в одной команде: -).

l0r1 означает выравнивание по левому краю с 0 пробелом в левом заполнении и 1 пробел в правом заполнении.

1 голос
/ 12 февраля 2013

У меня что-то похожее я делаю. Мне регулярно нужно превращать разделенные запятыми значения в столбцы:

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, который работает.

1 голос
/ 30 марта 2012

Другой вариант может заключаться в том, чтобы обмануть и использовать имена также как часть разделителя:

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

, который ищет любое имя в нижнем регистре с запятой.Все выровнено по левому краю, и через запятую следует хотя бы один пробел.

0 голосов
/ 25 марта 2011

А как на счет этого:

%s/,/,\t/g
...