Elimina newline in Vim


271

C'è un modo per eliminare la nuova riga alla fine di una riga in Vim, in modo che la riga successiva venga aggiunta alla riga corrente?

Per esempio:

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

Vorrei mettere tutto su una riga senza copiare le linee e incollarle nella precedente. Sembra che dovrei essere in grado di posizionare il cursore alla fine di ogni riga, premere un tasto e far saltare la riga successiva sullo stesso su cui si trova il cursore.

Risultato finale:

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

Questo è possibile in Vim?


Del alla fine della riga nella modalità di inserimento di vim funzionava per me. Tuttavia, non in tutti i terminal.
Victor Sergienko,

Risposte:


584

Se ci si trova sulla prima riga, premendo (lettere maiuscole) Jsi uniranno quella riga e la riga successiva, rimuovendo la nuova riga. Puoi anche combinare questo con un conteggio, quindi premendo 3Jcombinerai tutte e 3 le linee insieme.


29
Come notato in un'altra risposta, gJeviterà di aggiungere spazi che Vim potrebbe scegliere di aggiungere durante l'utilizzo J.
Michael Mior,

5
Puoi anche selezionare tutte le linee che vuoi unire usando V(Visual Line Mode) quindi premi JogJ
Sbu

Se si desidera mantenere la posizione del cursore utilizzare :joine :join!che unirà le linee mantenendo la posizione del cursore e non lasciare spazio nel punto di unione. puoi anche mapparlo come: nnoremap <Leader>j :joing<cr>e nnoremap <Leader>gj :join!<cr>.
SergioAraujo,

83

Certamente. Vim riconosce il carattere \ n come una nuova riga, quindi puoi semplicemente cercare e sostituire. In modalità comando digitare:

:%s/\n/

1
Grazie, ma non voglio una ricerca globale e sostituirla.
Derekerdmann,

16
la rimozione di% se ne occupa. Quindi accadrà solo sulla linea su cui si trova il cursore. In alternativa, puoi specificare un intervallo come: 11,15s / \ n / (righe 11-15) o:, + 7s / \ n / (questa riga e le sette successive) o: -3, s / \ n / (tre righe precedenti e questa) ... hai avuto l'idea
Tristan,

1
Oppure puoi selezionare un Vblocco -isual e sostituirlo su di esso.
Victor Sergienko,

51

Mentre sei sulla riga superiore in modalità normale, premi Shift+ j.

Puoi anche anteporre un conteggio, quindi 3Jsulla riga superiore si unirebbero tutte quelle righe insieme.


34

Come altre risposte menzionate, (maiuscolo) Je cerca + sostituisci \npossono essere generalmente utilizzati per rimuovere i caratteri di nuova riga e concatenare le righe.

Ma per sbarazzarti del carattere di nuova riga finale nell'ultima riga , devi farlo in Vim:

:set noendofline binary
:w

1
La domanda riguarda il concatenamento di due righe nel mezzo di un file: questa risposta rimuove la nuova riga alla fine del file, che non è quello che ho chiesto.
Derekerdmann,

3
Questo ha funzionato per me. Stavo cercando di sbarazzarmi di una nuova riga alla fine di un file a riga singola con VIM.
Locane,

Perché :set noendoflinenon funziona senza binary?
darw

32

Jelimina la spaziatura iniziale aggiuntiva (se presente), unendo le linee con un singolo spazio. (Con alcune eccezioni: dopo /[.!?]$/, possono essere inseriti due spazi; prima /^\s*)/, non vengono inseriti spazi.)

Se non vuoi quel comportamento, gJrimuovi semplicemente la nuova riga e non fai nulla di intelligente con gli spazi.


10

Tutti i seguenti presuppongono che il cursore si trova sulla prima riga:

Usando mappature normali:

3Shift+J

Usando i comandi Ex:

:,+2j

Quale è l'abbreviazione di

:.,.+2 join

Che può anche essere inserito dal seguente collegamento:

3:j

Un comando Ex ancora più breve:

:j3

2
Senza spazi tra loro:j!3
SergioAraujo,

10
set backspace=indent,eol,start

nel tuo .vimrc ti permetterà di usare backspacee deleteon \n(newline) in modalità insert.

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

ti permetterà di cancellare la LF precedente in modalità normale con X(quando nel col 1).


2

Probabilmente dipende dalle tue impostazioni, ma di solito lo faccio con A<delete>

Dove si Atrova alla fine della riga. Probabilmente richiede la nocompatiblemodalità :)


3
"Di solito lo faccio con A <delete>" Sì, è per questo che sono venuto qui; per trovare un modo migliore;). L'intero punto di Vim non sta spostando le mani dalla fila di casa.
Luc,

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

cursore nella prima riga

ORA, in MODALITÀ NORMALE

shift+v
2j
shift+j

o

V2jJ

: V2jJ normale


1

Vorrei solo premere A (aggiungi alla fine della riga, ti mette in modalità di inserimento) sulla riga in cui desideri rimuovere la nuova riga e quindi premere Elimina.


Purtroppo, questo non sembra funzionare per me; potrebbe essere un'impostazione PuTTY che mi è sfuggita.
Derekerdmann,

2
probabilmente l'opzione vi backspace::help 'backspace'
glenn jackman,

1

se non ti dispiace usare altri strumenti 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
È un po 'eccessivo, non credi?
Derekerdmann,

no non lo è. perché pensi che sia eccessivo? Farlo all'interno di Vim è manuale. Dipende dal fatto che tu voglia farlo manualmente ogni volta, o semplicemente eseguire questi liner per farlo in un batter d'occhio. Vim è un editore. E tutti gli strumenti che possono elaborare i file, sono fondamentalmente "editor" sotto mentite spoglie.
ghostdog74,

5
Ancora più semplice aprire il file in vim e usarlo ggVGJ.
troppo php,

certo, se trovi più facile farlo a mano ogni volta che hai bisogno di dati modificati in quel modo. Vai avanti. Inoltre, prova a farlo su un file di grandi dimensioni.
ghostdog74,

Non sto elaborando un mucchio di file; Sto solo lavorando a condensare alcune righe di codice.
derekerdmann,

1

Il problema è che possono accumularsi caratteri multipli 0A (\ n) invisibili. Supponi di voler pulire dalla riga 100 fino alla fine:

Digitando ESC e: (terminal commander)

:110,$s/^\n//

In uno script vim:

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

Spiegazione: da 110 fino alla fine cercare le righe che iniziano con una nuova riga (sono vuote) e rimuoverle

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.