2010-01-25 12 views
12

Supongamos que tengo este código:Alinear texto sólo en primer separador en VIM

width: 215px; 
height: 22px; 
margin-top: 3px; 
background-color: white; 
border: 1px solid #999999; 

quiero alinear de esta manera:

width:   215px; 
height:   22px; 
margin-top:  3px; 
background-color: white; 
border:   1px solid #999999; 

usando Align.vim que puedo hacer :Align \s utilizar espacios en blanco como separador, pero que tiene 2 problemas

  1. se duplica el guión inicial
  2. todos los espacios en blanco se consideran separadores, por lo que la última línea está en mal estado

He leído a través de las muchas opciones que ofrece Align.vim, pero no han encontrado una manera de hacer esto.

+1

Para trucos de alineación pequeños pero relativamente universales que funcionan sin complementos, consulte [la respuesta] (http://stackoverflow.com/a/7538363/254635) a la pregunta "[Insertar sangría para columnas en Vim] (http: //stackoverflow.com/q/7529029/254635) ". –

Respuesta

10

Si usa Tabular, puede hacer :Tabularize /:\zs/.

Al mirar la descripción de Align en vim.org, una invocación similar debería funcionar. Puede intentar :Align :\zs. No uso Alinear, así que no soy positivo.

+0

Sí, eso funciona con Align. Es posible que desee usar ': AlignCtrl l:' (o similar) para descartar cualquier otro punto. –

+0

Wow, gracias, no sabía sobre el patrón '\ zs' –

+1

¿Podría alguien explicar qué significa' \ zs'? – kizzx2

24

Puede hacer esto con una macro de Vim, no necesita complementos. Coloque el cursor en cualquier lugar de la primera línea, y el tipo en el modo normal, no el modo de insertar:

qa0f:w100i <Esc>19|[email protected] 

Observa el espacio solo después de que el 100i y el <Esc> medios de prensa "escape" - no escriba "<Esc>" literalmente.

Traducción:

qa   -- record macro in hotkey a 
0   -- go to beginning of line 
f:   -- go to first : symbol 
w   -- go to next non-space character after the symbol 
100i <Esc> -- insert 100 spaces 
19|  -- go to 19th column (value 19 figured out manually) 
dw   -- delete spaces until : symbol 
j   -- go to next line 
q   -- stop recording macro 
[email protected]  -- run the macro 4 times (for the remaining 4 lines) 

Y sí, he usado una macro similar al formato del bloque de código anterior :)

Cf. my answer to a similar Vim alignment question.

Para aplicar esto a un número de líneas en modo visual, hacer, seleccione y escriba:

:[email protected] 
+4

Es genial que sigas con la explicación, sin ella no me atrevería a escribir este encantamiento mágico, por temor a mi alma y el contenido del disco, pero con él incluso aprenderé algunos nuevos interesantes (aunque perversamente) vim comandos! – akavel

+1

@akavel I lol'd. – AlexMA

+2

@TalkLittle excelente uso de una solución sin complementos que no requiere ningún complemento adicional Excelente uso de un comando vim comentado para ayudar a los nuevos usuarios. Todas las buenas prácticas para apoyar y explicar el poder de vim nativo – dreftymac

2

Utilizar, algoritmo @TalkLittle 's, esto se puede hacer con este código, que es un poco más fácil para los ojos a mí :)

  • añaden suficientes spcaes después de los primeros dos puntos

    :%s/^[^:]:\zs/un montón de espacios/

  • pero si presionar espacios todo el tiempo duele el dedo pulgar, utilizaron en lugar

    :%s/^[^:]:\zs/\=repeat(' ',100)/

  • continuación, elimine todos los espacios después de la columna 19

    :%s/\%19v\s*//

    NOTA:% hará esto en todas las líneas, especifique un rango si no quiere esto.

  • si no tiene ganas de contar hasta 19, utilice la siguiente:

    %s/:\zs.*// | %s/.*/\=len(submatch(0))/ | sort! n | let n=getline(1) | undo | echo 'the column nmuber of the right most ":" is' n

+1

puntos extra para una solución que no requiere ningún complemento – dreftymac

0

Todavía puede hacerlo con su plugin preferido Align.vim con el comando:

Align! lp0P0: \s 

Align! significa que el primer argumento es el formato AlignCtrl donde ordena th La primera coincidencia que queda (l) se alinea sin espaciado de espacios (p0P0) y también desea omitir (:) todas las coincidencias posteriores. Este ejemplo podría ampliarse para alineamientos más sofisticados.

Cuestiones relacionadas