Muitas vezes me deparo com 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 vim
de formatá-los com cada um dos argumentos correspondentes alinhados ao recuo mais próximo, onde um recuo é definido como 2 espaços sem ter que passar linha por linha até o, como no seguinte:
title : Jekyll Bootstrap
tagline : Site Tagline
author :
name : Name Lastname
email : [email protected]
github : username
twitter : username
feedburner: feedname
ATUALIZAR:
Eu acreditotabular.vimé o plugin que estou procurando, mas estou tendo dificuldade em formar uma expressão regular que leve em consideração o número de espaços no início da linha ao decidir que algo deve fazer parte de um bloco, ou seja, Tabularize/:
produza:
title : Jekyll Bootstrap
tagline : Site Tagline
author :
name : Name Lastname
email : [email protected]
github : username
twitter : username
feedburner: feedname
O é um exemplo ema documentaçãoonde o seguinte é obtido por meio de uma expressão regular:
abc,def,ghi
a,b
a,b,c
:Tabularizar /^[^,]*\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 frente do mesmo bloco enquanto ainda avalio o subbloco, como no exemplo a seguir, mais complexo do 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 tabularize\some_regular_expression_I_cant_figure_out
em:
comments :
provider : disqus
disqus :
short_name : jekyllbootstrap
livefyre :
site_id : 123
intensedebate :
account : 123abc
facebook :
appid : 123
num_posts : 5
width : 580
colorscheme : light
Responder1
OTabularizarplugin para vim pode fazer exatamente o que você deseja. Tudo se resume a digitarTabularize /:
No entanto, isso provavelmente não manterá o recuo à esquerda.
Edite sua pergunta atualizada: não consegui fazer isso diretamente com o Tabular, mas consegui fazer isso com um segundo comando, que é uma pesquisa e substituição em um intervalo:
:%s/\([ ]*\)[[:alpha:][:punct:]]*[ ]*/\0\1/
Isso procura uma certa quantidade de espaços na frente do :
e os cola logo antes desse ponto e vírgula.
Responder2
Então, más notícias e boas notícias. A má notícia é que o Tabular realmente não pode 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 ser usado como uma ferramenta geral de manipulação de texto extremamente flexível e, nesse contexto, não é muito difícil fazer com que o Tabular faça o que você deseja.
Crie um arquivo nomeado ~/.vim/after/plugin/TabularizeRecord.vim
com estes conteúdos (espero que bastante 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
Assim que esse arquivo existir, reinicie o vim e você poderá obter o recuo desejado fazendo:
:Tab record
Pelo que eu sei, o resultado final disso é exatamente o que você está procurando - deixe-me saber se não funcionar por algum motivo ou se eu não entendi os requisitos.