Como unir linhas sem produzir um espaço?

73

O Jcomando padrão para unir linhas substitui os caracteres da nova linha por um espaço. É útil ao editar 'literatura', mas pode ser problemático se, digamos, editar manualmente um despejo hexadecimal, se esquecer de remover o espaço supérfluo.

Existe um método rápido e fácil para unir duas linhas sem produzir um espaço entre elas?

SF.
fonte

Respostas:

87

A gJcombinação faz isso; de :help gJ:

Una [contagem] de linhas, com no mínimo duas linhas. Não insira ou remova espaços.

Você pode reconectá-lo J, se quiser salvar um pressionamento de tecla:

:nnoremap J gJ

Observe que isso não remove nenhum espaço; portanto, se a linha atual terminar com um espaço ou a próxima linha começar com um ou mais espaços, eles serão deixados como estão .

Assim:

Hello
    world

Torna-se:

Hello    world

Nós poderíamos usar Jxneste caso, então será Helloworld, mas isso não funcionará em todos os casos; da ajuda:

Junte as linhas destacadas, com no mínimo duas linhas. Remova o recuo e insira até dois espaços

[...]

Esses comandos, exceto "gJ", inserem um espaço no lugar de, a menos que exista espaço em branco à direita ou a próxima linha comece com ')'.

Portanto, em alguns casos, mais de um espaço ou nenhum espaço é inserido. Tanto quanto posso ver, não há maneira fácil de mudar esse comportamento; Eu criei uma função para modificar gJpara sempre ingressar sem espaços:

" Like gJ, but always remove spaces
fun! JoinSpaceless()
    execute 'normal gJ'

    " Character under cursor is whitespace?
    if matchstr(getline('.'), '\%' . col('.') . 'c.') =~ '\s'
        " When remove it!
        execute 'normal dw'
    endif
endfun

" Map it to a key
nnoremap <Leader>J :call JoinSpaceless()<CR>

Veja também: :help J,:help 'joinspaces'

Martin Tournoij
fonte
É possível usar alguma função "Preservar" para manter a posição do cursor ao usar esta função ou como obtenho esse resultado?
SergioAraujo
8

Outro truque que você pode tentar é usar o substituir. Às vezes isso pode ser útil.

%s/$\n//g

Cenário: exclua o último caractere e junte-se à próxima linha:

%s/=$\n\(.\)/\1/g

Por exemplo,

xxxx=
123

torna-se:

xxxx123
força interior
fonte
3

Crie uma macro e reutilize-a:

qaJxq

Agora, repita a macro, ausando @aonde quiser unir duas linhas sem espaço.

@@repetirá a macro anterior. Então você pode apenas segurar @para juntar várias linhas.

pelucida
fonte
11
Por que digitar @aquando você pode digitar Jx? Mesmo número de pressionamentos de tecla e SHIFT!
Shahbaz
2
@Shahbaz Talvez porque da última linha: "você pode apenas segurar @"
Muru
11
@ muru, isso é verdade!
precisa saber é o seguinte
4
Também o torna um comando repetível, para que você possa 3@aunir 3 linhas, enquanto 3Jxque o processo uniria 3 linhas com espaços e excluiria o espaço entre a segunda e a terceira linhas, deixando espaços entre as outras linhas.
Haegin 27/02
1

Para sempre se unir a um único espaço:

nmap J gJi <ESC>ciW <ESC>

Para ingressar sem espaço (remove o espaço à direita + à esquerda):

nmap <C-J> gJi <ESC>diW
phil
fonte
11
Bem-vindo a este site! Seus mapeamentos parecem um pouco projetados demais para mim, seria útil se você pudesse adicionar um pouco mais de explicações sobre como eles funcionam.
statox
1

Selecione as linhas que deseja mesclar, insira um comando Ex digitando dois pontos :no modo normal. Em seguida, digite este comando:

s/$\n\s*//gc

O comando inteiro deve ter a mesma aparência:

:'<,'>s/$\n\s*//gc

Esta é, na verdade, uma versão aprimorada do comando @ insidepower que substitui recuos de espaço e caracteres de nova linha.

Explicação:

  • '<,'> significa que modificamos apenas as linhas selecionadas no modo visual.

  • /$\n\s*é um padrão regex . Estamos procurando uma correspondência que termine $com um novo caractere de linha \ne que tenha um número não determinado de espaços em branco a *partir de então.

  • s/pattern//gcé um comando substituto para localizar cada padrão e substituí-lo por um caractere vazio na confirmação.

Para descobrir mais sobre sinalizadores e metacaracteres para expressões regulares no Vim, dê uma olhada neste capítulo da Referência do Vim.

ubique
fonte
2
Olá ubique, bem-vindo ao Vi e Vim ! Você tem uma resposta bem escrita lá; parabéns por isso. Meu único argumento é que expressões regulares do vim = / = expressões regulares do python, e às vezes isso é confuso para os usuários. Talvez um link para o documento de ajuda para o Vim regex?
D. Ben Knoble
2
Segundo ponto: a resposta que você mencionou foi escrita por @ insidepower e editada por Peter.
D. Ben Knoble