Как выровнять это с помощью VIM Tabular Plugin?

Это мой код:

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

Кто-нибудь знает, как выровнять его с помощью VIM Tabular Plugin:

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

Я знаю, как это сделать в Align Plugin, но не могу узнать, как это работает в Tabular.

Ответ 1

Tabularize /,\zs

См. :help \zs

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

Tabularize /[^,]\+,

Ответ 2

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

Ответ 3

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

:Tabularize /,\zs/l0r1

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

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

Ответ 4

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

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

Ищет любое имя в нижнем регистре с запятой. Все выравнивается влево и по меньшей мере одно пробел следует в разделительной запятой.

Ответ 5

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

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

Ответ 6

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

%s/,/,\t/g