A menudo me encuentro con situaciones como esta:
title : Jekyll Bootstrap
tagline: Site Tagline
author :
name : Name Lastname
email : [email protected]
github : username
twitter : username
feedburner : feedname
Cuando los argumentos no están bien alineados, ¿existe una forma estándar vim
de formatearlo con cada uno de los argumentos correspondientes alineados con la sangría más cercana donde una sangría se define como 2 espacios sin tener que pasar línea por línea hasta el final? como en el siguiente:
title : Jekyll Bootstrap
tagline : Site Tagline
author :
name : Name Lastname
email : [email protected]
github : username
twitter : username
feedburner: feedname
ACTUALIZAR:
Yo creotabular.vimes el complemento que estoy buscando, pero me resulta difícil formar una expresión regular que tenga en cuenta la cantidad de espacios al principio de la línea al decidir que algo debe ser parte de un bloque, es decir, Tabularize/:
produce:
title : Jekyll Bootstrap
tagline : Site Tagline
author :
name : Name Lastname
email : [email protected]
github : username
twitter : username
feedburner: feedname
El es un ejemplo enla documentacióndonde lo siguiente se logra mediante una expresión regular:
abc,def,ghi
a,b
a,b,c
:Tabularizar /^[^,]*\zs,/r0c0l0
abc,def,ghi
a,b
a,b,c
Pero no estoy seguro de cómo formular esto cuando considero cada línea con el mismo número de espacios delante de la parte del mismo bloque mientras sigo evaluando subbloques como el siguiente, más complejo que mi ejemplo original:
comments :
provider : disqus
disqus :
short_name : jekyllbootstrap
livefyre :
site_id : 123
intensedebate :
account : 123abc
facebook :
appid : 123
num_posts : 5
width : 580
colorscheme : light
se transformaría tabularize\some_regular_expression_I_cant_figure_out
en:
comments :
provider : disqus
disqus :
short_name : jekyllbootstrap
livefyre :
site_id : 123
intensedebate :
account : 123abc
facebook :
appid : 123
num_posts : 5
width : 580
colorscheme : light
Respuesta1
EltabularizarEl complemento para vim puede hacer exactamente lo que quieras. Todo se reduce a escribirTabularize /:
Sin embargo, esto probablemente no mantendrá la sangría a la izquierda.
Edite su pregunta actualizada: No pude hacer eso con Tabular directamente, pero pude hacerlo con un segundo comando, que es una búsqueda y reemplazo en un rango:
:%s/\([ ]*\)[[:alpha:][:punct:]]*[ ]*/\0\1/
Esto busca una cierta cantidad de espacios delante de :
y los pega justo antes de este punto y coma.
Respuesta2
Entonces, malas noticias y buenas noticias. La mala noticia es que Tabular realmente no puede hacer lo que usted pide sin un poco de trabajo: el problema en cuestión requiere más contexto del que Tabular normalmente tiene acceso. La buena noticia es que Tabular está diseñado para permitir su uso como una herramienta de manipulación de texto general extremadamente flexible y, en ese contexto, no es demasiado difícil lograr que Tabular haga lo que usted desea.
Cree un archivo ~/.vim/after/plugin/TabularizeRecord.vim
con el nombre de estos contenidos (con suerte, lo suficientemente comentados):
" Create a new tabular pipeline named 'record' that includes all adjacent
" lines containing a : in its default range, and manipulates those lines by
" passing them through the TabularizeIndentedRecord function
AddTabularPipeline! record /:/ TabularizeIndentedRecord(a:lines)
function! TabularizeIndentedRecord(lines)
" A list containing each of the lines with leading spaces removed
let text = map(copy(a:lines), 'substitute(v:val, "^ *", "", "")')
" A list containing just the leading spaces for each line
let spaces = map(copy(a:lines), 'substitute(v:val, "^ *\\zs.*", "", "")')
" Tabularize only the text, not the leading spaces. This pattern is more
" complicated than just /:/ to handle lines with multiple colons.
call tabular#TabularizeStrings(text, '[^:]*\zs:', 'l1')
" Tack the spaces back on to the beginning of each line, and store the
" resulting lines back in the a:lines list
call map(a:lines, 'remove(spaces, 0) . remove(text, 0)')
endfunction
Una vez que ese archivo exista, reinicie vim y luego podrá obtener la sangría que desea haciendo:
:Tab record
Por lo que puedo decir, el resultado final es exactamente lo que estás buscando. Avísame si por alguna razón no funciona o si no entendí bien los requisitos.