2011-03-25 9 views
10

Este es mi código:¿Cómo me alineo así con el complemento tabular de VIM?

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

¿Alguien sabe cómo alinear a esto con el VIM tabular Plugin:

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

Yo sé cómo hacer esto en Alinear Plugin pero no puedo averiguar cómo funciona en Tabular.

Respuesta

13
Tabularize /,\zs 

Ver :help \zs

Dado que el patrón anterior no funciona, pruebe con esto:

Tabularize /[^,]\+, 
+0

su solución (la que probé también) elimina los primeros caracteres de la segunda y tercera columna. – Reman

+0

Correcto, puedo reproducir eso y parece un error. He creado un ticket para esto: https://github.com/godlygeek/tabular/issues/3 – Raimondi

+0

Funciona muy bien, ¡muchas gracias! – Reman

0

Y ¿qué tal esto:

%s/,/,\t/g 
+0

tampoco funciona. La tercera fila no está alineada. – Reman

13

yo no soy una maestro en esto, y todo lo que diré aquí se basa en mi un comprensión de Tabularize.

Tabularizar siempre divide las cosas en los campos, descritos por la expresión regular. Por ejemplo:

abc,d,e 
a,b,cde 

:Tab /, 

hace que se divida cada línea como la siguiente:

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

A continuación, cada campo se rellena con espacios por lo que la alineación delimitador de campo - y todo lo que recibe y extra-espacio por defecto (a excepción del último campo, creo).

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

El resultado es:

abc , d , e 
a , b , cde 

Mediante la adición de banderas, se puede controlar la alineación y el relleno para cada campo. Si proporciona menos banderas de las necesarias, se reutilizarán. Entonces, para hacer que todo se alinee de la misma manera, diga a la izquierda con el relleno 0 puede usar un solo indicador que se repetirá para cada campo. Por lo tanto:

abc,d,e 
a,b,cde 

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

abc,d,e 
a ,b,cde 

La conclusión que tengo a mi cuenta es que no hay mucho sentido tener un campo de anchura cero (como :Tab /,\zs), probablemente haciendo que se consigue el primer carácter después de que el patrón y echar a perder, cortándolo

Ahora, para mí :Tab /[^,]\+, no funcionaba correctamente, generando espacios duplicado:

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

Creo que es porque no hay un campo intermedio. Este patrón, hace un delimitador de campo residen al lado de otra, de esta manera:

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

Entonces el cero con el campo generado (entre delimitadores) también se rellena con el espacio adicional 1 por defecto.

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

john, betty, wally, beth 

¿Cómo se puede solucionar?

Abriría el espacio para un delimitador, que no hace que un delimitador esté cerca de otros. ¿Cómo? Simplemente agregando un espacio después de la coma.

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` 

Ahora puede alinear todo en espacios y relleno de ceros:

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` 

espero que ayuda a la comprensión en forma de tabla!

+0

gran explicación! Muchas gracias. – Reman

+0

encontró un problema: se alinea en cada espacio y no solo después de cada espacio después de un "," -> john, betty davis, wally, beth se alineará también entre betty y davis. – Reman

+0

Pruebe con ': Tabularize /, \ zs \ + /' – Raimondi

1

Otra opción puede ser la de engañar y utilizar los nombres también como parte del delimitador:

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

Qué busca cualquier nombre en minúsculas con una coma. Todo está alineado a la izquierda y al menos un espacio sigue en la coma delimitada.

1

Tengo algo similar que estoy haciendo. Regularmente necesidad de convertir los valores delimitados por comas en columnas:

 
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 

Usando :s/,\s*/, /g preparaciones de los valores para añadir un espacio después de las comas:

 
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 

Correr :Tab /,\zs \+/10 los convierte en:

 
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 

Ahora solo necesito descubrir cómo convertirlos en un vmap que funciona.

5

Sobre la base de la respuesta de Raimondi,

:Tabularize /,\zs/l0r1 

tiene más sentido para mí y también en un solo comando :-).

l0r1 significa alineación izquierda con 0 espacios en el margen izquierdo y 1 espacio en el margen derecho.

Cuestiones relacionadas