Como dividir uma linha em várias linhas com eficiência?

11

Eu recebi dados registrados em um arquivo de texto que é apenas uma linha longa com cada valor separado por um espaço. Existe um comando ou conjunto de comandos que dividirá uma linha em várias linhas?

Dom
fonte

Respostas:

21

Você poderia simplesmente substituir qualquer espaço consecutivo na linha com uma nova linha usando o comando :s/\s\+/\r/g. \s\+significa um ou mais caracteres de espaço em branco e \ré uma nova linha, consulte :help :substitutee :help regexppara obter detalhes. Se você executar o comando em uma linha como:

foo bar baz

Você obtém:

foo
bar
baz

Se você hlsearchativou e não deseja encher a tela com espaços destacados em todos os lugares, você pode escrever uma pequena função como a seguinte para evitá-la:

function! SplitLineNicely()
    " Save previous value of last search register
    let saved_last_search_pattern = @/

    " :substitute replaces the content of the search register with the `\s\+` 
    " pattern highlighting all whitespaces in the file
    substitute /\s\+/\r/g

    " Restore previous search register
    let @/ = saved_last_search_pattern
endfunction
toro2k
fonte
"Se você não deseja confundir sua tela com espaços destacados em todos os lugares", isso pressupõe muito sobre a configuração do OP.
precisa saber é o seguinte
@romainl Melhor?
T2r2k
11
Sim, é melhor IMO.
romainl
2
É \r, veja :help s/\r. Pode ser substituído por uma digitação literal de nova linha <c-v><cr>. Nesse contexto, \né um caractere nulo, veja :help s/\n.
T2r2k
11
replaces the content of the register- qual registro?
Stillanob #
5

Usar vima substituição é provavelmente uma das melhores maneiras de realizar sua tarefa, mas você também pode usar uma macro. Suponha que tenhamos os seguintes dados, com o cursor em algum lugar na linha 1:

1 a b c d e f
~

Iniciando no modo normal, pressionar qqcomeçará a gravar uma macro que pode ser chamada via @q. Qualquer coisa digitada depois qqpode ser repetida através da chamada mencionada acima. Nosso objetivo é gravar comandos normais que serão gerais o suficiente para permitir repetições contínuas.

Assim, podemos digitar 0para trazer o cursor para o início da linha e depois fspacemovê-lo para o primeiro espaço. Isso nos permite digitar renter, resultando em:

1 a
2 b c d e f
~

Atingir qagora é uma boa ideia, pois nossa macro reutilizável está pronta para repetição. Um tanto arbitrariamente, notamos que existem 4 espaços restantes para substituir por novas linhas. Assim, pressionando, 4@qrepetimos a qmacro 4 vezes, resultando em:

1 a
2 b
3 c
4 d
5 e
6 f
~

Note-se que por causa da maneira como configurar o macro, teria sido seguro para repetir o comando mais de 9000 vezes, uma vez que só afetaria a linha atual, e uma vez que não havia espaços para a direita da última entrada de dados, fspaceserá 'bem' falham, impedindo que os dados sejam substituídos por novas linhas.

Então, para repetir desde o início:

qq0fspacerenterq9001@q

fornece o nosso resultado.

HAL 9001
fonte
11
Eu amo que você tenha uma 9001tecla no teclado para digitar seu nome de usuário rapidamente.
Rich
4

A maneira mais fácil de dividir linhas no Vim é o comando do modo normal gq(digite as duas letras em rápida sucessão no modo normal ou visual).

No modo visual, ele dividirá o que for selecionado; no modo normal, você seguirá gqum movimento.

Por exemplo, gqldividirá uma linha na largura definida no momento. Para definir a largura das linhas de divisão diferentes da sua configuração atual, você pode usar :set textwidth=n, onde nestá o número de caracteres que deseja em uma linha, por exemplo, 10e retornar à sua largura normal quando terminar.

Obtive essas informações de um vídeo do Youtube de Kholidfu que mostra como unir e dividir linhas no modo normal usando um movimento.

vdicarlo
fonte