Excluir nova linha no Vim

271

Existe uma maneira de excluir a nova linha no final de uma linha no Vim, para que a próxima linha seja anexada à linha atual?

Por exemplo:

Evaluator<T>():
    _bestPos(){
}

Eu gostaria de colocar tudo isso em uma linha sem copiar e colar na linha anterior. Parece que eu devo colocar o cursor no final de cada linha, pressionar uma tecla e fazer com que a próxima linha pule na mesma linha em que o cursor está.

Resultado final:

Evaluator<T>(): _bestPos(){ }

Isso é possível no Vim?

derekerdmann
fonte
Del no final da linha no modo de inserção do vim costumava trabalhar para mim. Não em todos os terminais, no entanto.
Victor Sergienko

Respostas:

584

Se você estiver na primeira linha, pressionar (maiúsculas) Junirá essa linha e a próxima linha, removendo a nova linha. Você também pode combinar isso com uma contagem, pressionando 3J, as três linhas serão combinadas.

Xhantar
fonte
29
Conforme observado em outra resposta, gJevitará adicionar espaços que o Vim pode optar por adicionar ao usar J.
Michael Mior
5
Você também pode selecionar todas as linhas que deseja ingressar usando V(Modo de linha visual) e pressionar JougJ
Sbu
Se você deseja manter a posição do cursor, use :joine :join!isso unirá as linhas mantendo a posição do cursor e não mantenha nenhum espaço no ponto de união. você também pode mapeá-lo como: nnoremap <Leader>j :joing<cr>e nnoremap <Leader>gj :join!<cr>.
SergioAraujo
83

Certamente. O Vim reconhece o caractere \ n como uma nova linha, para que você possa pesquisar e substituir. No modo de comando, digite:

:%s/\n/
TinkerTank
fonte
1
Obrigado, mas não quero uma pesquisa global e substituí-lo.
derekerdmann
16
remover o% cuida disso. Então isso só acontecerá na linha em que o cursor estiver. Como alternativa, você pode especificar um intervalo como: 11,15s / \ n / (linhas 11-15) ou:, + 7s / \ n / (esta linha e os próximos sete) ou: -3, s / \ n / (três linhas anteriores e esta) ... você entendeu a idéia #
Tristan
1
Ou você pode selecionar um Vbloco -ual e substituí-lo.
21414 Victor Sergienko
51

Enquanto estiver na linha superior no modo normal, pressione Shift+ j.

Você também pode adicionar uma contagem antecipada, para que 3Ja linha superior junte todas essas linhas.

Jacaré
fonte
34

Como outras respostas mencionadas, (maiúsculas) Je search + replace \npodem ser usadas geralmente para remover caracteres de nova linha e concatenar linhas.

Mas, para se livrar do caractere de nova linha à direita na última linha , você precisa fazer isso no Vim:

:set noendofline binary
:w
Néstor Waldyd
fonte
1
A questão é concatenar duas linhas no meio de um arquivo - essa resposta remove a nova linha no final do arquivo, que não é o que eu perguntei.
Derekerdmann 27/16
3
Isso funcionou para mim. Eu estava tentando me livrar de uma nova linha no final de um arquivo de linha única com o vim.
Locane
Por :set noendoflineque não funciona sem binary?
darw
32

Jexclui o espaçamento inicial extra (se houver), unindo linhas com um único espaço. (Com algumas exceções: depois /[.!?]$/, dois espaços podem ser inseridos; antes /^\s*)/, nenhum espaço é inserido.)

Se você não quer esse comportamento, gJbasta remover a nova linha e não faz nada de inteligente com espaços.

efémero
fonte
10

Todos os seguintes pressupõem que o cursor está na primeira linha:

Usando mapeamentos normais:

3Shift+J

Usando comandos Ex:

:,+2j

Qual é uma abreviação de

:.,.+2 join

Que também pode ser inserido pelo seguinte atalho:

3:j

Um comando Ex ainda mais curto:

:j3
kzh
fonte
2
Sem espaços entre eles:j!3
SergioAraujo 17/17/17
10
set backspace=indent,eol,start

em seu .vimrc permitirá que você use backspacee deletena \n(nova linha) no modo de inserção.

set whichwrap+=<,>,h,l,[,]

permitirá excluir o LF anterior no modo normal com X(quando na coluna 1).

Laktak
fonte
2

Provavelmente depende das suas configurações, mas geralmente faço isso com A<delete>

Onde Aé anexado no final da linha. Provavelmente requer nocompatiblemodo :)

Wolph
fonte
3
"Eu costumo fazer isso com A <delete>" É por isso que eu vim aqui; para encontrar uma maneira melhor;). O objetivo principal do vim não é mover suas mãos da linha de casa.
Luc
2
<CURSOR>Evaluator<T>():
    _bestPos(){
}

cursor na primeira linha

AGORA, no MODO NORMAL,

shift+v
2j
shift+j

ou

V2jJ

: V2jJ normal

Ivan Lopes
fonte
1

Eu apenas pressionava A (anexar ao final da linha, coloca você no modo de inserção) na linha em que você deseja remover a nova linha e, em seguida, pressione excluir.

David Watson
fonte
Infelizmente, isso não parece funcionar para mim; pode ser uma configuração PuTTY que eu perdi.
precisa saber é o seguinte
2
provavelmente a opção vi backspace::help 'backspace'
glenn jackman
1

se você não se importa em usar outras ferramentas de shell,

tr -d "\n" < file >t && mv -f t file

sed -i.bak -e :a -e 'N;s/\n//;ba' file

awk '{printf "%s",$0 }' file >t && mv -f t file
ghostdog74
fonte
7
Isso é um exagero, você não acha?
Drekerdmann 21/10/10
não, não é. por que você acha que é um exagero? Fazê-lo dentro do Vim é manual. Depende se você deseja fazer manualmente manualmente todas as vezes, ou apenas executar esses liners para fazê-lo rapidamente. Vim é um editor. E todas as ferramentas que podem processar arquivos são basicamente "editores" disfarçados.
ghostdog74
5
Ainda mais fácil, basta abrir o arquivo no vim e usá-lo ggVGJ.
php demais
claro, se você achar mais fácil fazê-lo manualmente toda vez que precisar de dados alterados dessa maneira. Continue. Além disso, tente fazer isso em um arquivo grande.
ghostdog74
Não estou processando um monte de arquivos; Estou apenas trabalhando com a condensação de algumas linhas de código.
Drekerdmann 21/10
1

O problema é que múltiplos caracteres 0A (\ n) invisíveis podem se acumular. Suponha que você queira limpar da linha 100 até o fim:

Digitando ESC e: (comandante do terminal)

:110,$s/^\n//

Em um script vim:

execute '110,$s/^\n//'

Explicação: de 110 até o final, procure as linhas que começam com a nova linha (estão em branco) e remova-as

Sergio Abreu
fonte