Sangrar el medio de varias líneas

Sangrar el medio de varias líneas

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 vimde 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_outen:

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.vimcon 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.

información relacionada