Como formatar um substituto de string, ou uma linha de texto, no Vim?

3

É possível formatar a sequência de substituição ao substituir uma correspondência por Vim ?

Digamos que eu tenha um arquivo com uma tabela de duas colunas, em que as entradas de cada linha são separadas por um espaço. As entradas (e as linhas) não são de largura fixa. Quero formatar a tabela de forma que os itens da segunda coluna sejam todos justificados, adicionando a quantidade apropriada de espaços.

Por exemplo, a tabela fornecida:

A aa
BBBB bbb
CC c

O que eu quero:

A      aa
BBBB   bbb
CC     c

(Por favor, note que as guias não são uma solução aqui.)

O comando Vim pode ser parecido com:

:0,$ s/\(.*\) \(.*\)/(******N)/

e o (******N) deve ser substituído pelo código de formatação para colocar o 2º elemento na enésima posição do caractere.

UPDATE 1 : Então, o Vim tem a função printf() . Pode ser usado diretamente no prompt de comando para esse propósito, ou deve ser incluído em um script Vim, com um loop explícito sendo executado em todas as linhas?

    
por ysap 31.03.2014 / 00:03

2 respostas

5

Você pode experimentar um dos plugins de alinhamento no vim.org. Eu uso o mais popular do Dr. Campbell: link

Apesar disso, sim, você pode chamar funções Vim de um comando substituto, mas a desvantagem é que o padrão de substituição inteiro tem que ser uma expressão. Veja " :help sub-replace-expression " e " :help submatch() ". Por exemplo, se quiséssemos substituir um padrão correspondente por uma contagem de letras:

:%s/pattern/\=len(submatch(0))/g

Assim, sua ideia de usar o printf () funcionaria:

:%s/\(.*\) \(.*\)/\=printf('%-7s %-7s',submatch(1),submatch(2))/
    
por 31.03.2014 / 01:28
2

Você não especificou seu sistema, mas, em sistemas semelhantes ao UNIX, você pode usar o comando column como um filtro:

:%!column -t

Referência:

:help filter
$ man column
    
por 31.03.2014 / 09:38