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?


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.


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/

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.


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

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.


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

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).


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 :)


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


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.


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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.