Recuar o meio de várias linhas

6

Costumo encontrar situações como esta:

title : Jekyll Bootstrap
tagline: Site Tagline
author :
  name : Name Lastname
  email : [email protected]
  github : username
  twitter : username
  feedburner : feedname

Onde os argumentos não estão bem alinhados, existe uma maneira padrão em vim de tê-lo formatado com cada um dos argumentos correspondentes alinhados ao recuo mais próximo, onde um recuo é definido como 2 espaços sem ter que passar por linha por linha para o, como no seguinte:

title   : Jekyll Bootstrap
tagline : Site Tagline
author  :
  name      : Name Lastname
  email     : [email protected]
  github    : username
  twitter   : username
  feedburner: feedname

ATUALIZAÇÃO:

Acredito que o tabular.vim é o plugin que estou procurando, mas estou com dificuldades para formar uma expressão regular leve em conta o número de espaços no início da linha ao decidir que algo deve fazer parte de um bloco, ou seja, Tabularize/: produz:

title       : Jekyll Bootstrap
tagline     : Site Tagline
author      :
  name      : Name Lastname
  email     : [email protected]
  github    : username
  twitter   : username
  feedburner: feedname

Este é um exemplo em a documentação , na qual o seguinte é obtido por meio de uma expressão:

abc,def,ghi
a,b
a,b,c

: Tabularize / ^ [^,] * \ zs, / r0c0l0

abc,def,ghi
  a,b
  a,b,c

Mas não tenho certeza de como formular isso quando considero cada linha com o mesmo número de espaços na parte frontal do mesmo bloco, enquanto ainda avaliamos um bloco subbloco como o seguinte, mais complexo que meu exemplo 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

seria transformado em tabularize\some_regular_expression_I_cant_figure_out para:

comments :
  provider      : disqus
  disqus        :
    short_name    : jekyllbootstrap
  livefyre      :
    site_id       : 123
  intensedebate :
    account       : 123abc
  facebook      :
    appid         : 123
    num_posts     : 5
    width         : 580
    colorscheme   : light
    
por rudolph9 05.04.2012 / 11:26

2 respostas

4

O plugin Tabularize para o vim pode fazer exatamente o que você deseja. Tudo se resume a digitar Tabularize /:

Isso provavelmente não manterá o recuo à esquerda, no entanto.

Edite na sua pergunta atualizada : Não consegui fazer isso com o Tabular diretamente, mas consegui fazer isso com um segundo comando, que é uma pesquisa e substituição em um intervalo:

 :%s/\([ ]*\)[[:alpha:][:punct:]]*[ ]*/
 :%s/\([ ]*\)[[:alpha:][:punct:]]*[ ]*/%pre%/
/

Isso procura uma certa quantidade de espaços na frente do : e os cola antes desse ponto-e-vírgula.

    
por 05.04.2012 / 14:43
2

Então, más notícias e boas notícias. A má notícia é que Tabular não pode realmente fazer o que você está pedindo sem um pouco de trabalho - o problema em questão requer mais contexto do que o Tabular normalmente tem acesso. A boa notícia é que o Tabular foi projetado para permitir o uso como uma ferramenta geral de manipulação de texto extremamente flexível e, nesse contexto, não é muito difícil fazer com que a Tabular faça o que você deseja.

Crie um arquivo chamado ~/.vim/after/plugin/TabularizeRecord.vim com estes (espero que comente bastante) conteúdo:

" 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

Quando esse arquivo existir, reinicie o vim e você poderá obter o recuo desejado:

:Tab record

Tanto quanto eu posso dizer, o resultado final disso é exatamente o que você está procurando - deixe-me saber se não funciona por algum motivo, ou se eu entendi mal os requisitos.

    
por 08.04.2012 / 04:33