2010-10-21 8 views
200

Esiste 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?Elimina newline in Vim

Ad esempio:

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

mi piacerebbe mettere questo tutto su una riga senza linee di copiatura e incollandoli in quello 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 cursore su cui si trova il cursore.

Risultato finale:

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

Questo è possibile in Vim?

+0

Del alla fine della riga nella modalità di inserimento di vim utilizzata lavorare per me. Non in ogni terminale, però. –

risposta

445

Se si è sulla prima riga, premendo (maiuscolo) J si uniranno a quella linea e alla riga successiva insieme, rimuovendo la nuova riga. Puoi anche combinare questo con un conteggio, quindi premendo 3J unirai tutte e 3 le linee insieme.

+47

Questo è dannatamente bello. Ogni giorno amo un po 'di più. –

+19

Come indicato in un'altra risposta, 'gJ' eviterà di aggiungere spazi che Vim può scegliere di aggiungere quando si usa' J'. –

+4

Puoi anche selezionare tutte le linee che vuoi unire usando 'V' (Visual Line Mode) quindi premi' J' o 'gJ' –

64

Certamente. Vim riconosce il carattere \ n come una nuova riga, quindi puoi solo cercare e sostituire. Al comando tipo di modalità:

:%s/\n/ 
+1

Grazie, ma non voglio una ricerca globale e sostituirla. – derekerdmann

+14

rimuovere la% si prende cura di quello.Quindi avverrà solo sulla linea in 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 successive sette) o: -3, s/\ n/(le tre linee precedenti e questa) ... hai avuto l'idea – Tristan

+2

Ma l'ho fatto, ed ecco la risposta. Grazie! – pdwalker

2

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

Dove A si accoda alla fine della linea. Probabilmente richiede la modalità nocompatible :)

+3

* "Di solito lo faccio con A " * Sì è per questo che sono venuto qui; per trovare un modo migliore;). L'intero punto di vista non muove le tue mani dalla fila di casa. – Luc

1

Vorrei semplicemente premere A (aggiungere alla fine della riga, ti mette in modalità di inserimento) sulla riga in cui si desidera rimuovere la nuova linea e quindi premere Elimina.

+0

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

+2

probabilmente l'opzione di backspace vi: ': help 'backspace'' –

45

Mentre sulla linea superiore in modalità normale, ha colpito Maiusc +j.

È anche possibile aggiungere un conteggio, quindi 3J nella riga superiore unirebbe tutte quelle linee insieme.

1

se non ti dispiace utilizzando altri strumenti di 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

È una specie di eccessivo, non credi? – derekerdmann

+0

no, non è così. perché pensi che sia eccessivo? Farlo all'interno di Vim è manuale. Dipende se vuoi farlo manualmente a mano ogni volta, o semplicemente esegui questi liners 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 usare 'ggVGJ'. –

29

J elimina la spaziatura leader extra (se presente), che unisce le linee con un singolo spazio. (Con alcune eccezioni: dopo /[.!?]$/, possono essere inseriti due spazi, prima /^\s*)/, senza spazi vengono inseriti.)

Se non si desidera che il comportamento, gJ rimuove semplicemente il ritorno a capo e non fa nulla intelligente con spazi affatto.

+1

+1 per gJ, esattamente quello che stavo cercando –

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

cursore nella prima riga

NOW, in modalità normale fare

shift+v 
2j 
shift+j 

o

V2jJ 

: normale V2jJ

8

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

Utilizzo di mapping normale:

Maiusc +J

Utilizzando i comandi Es:

:,+2j 

che è l'abbreviazione di

:.,.+2 join 

che può essere inserito anche dalla seguente collegamento:

:j

Una ancora più breve comando Ex:

:j3 
+1

Senza spazi tra loro ': j! 3' – SergioAraujo

8

In vim:

:set noendofline binary 
:w 
+0

La domanda riguarda la concatenazione 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

+0

Questo ha funzionato per me. Stavo cercando di sbarazzarmi di una nuova riga alla fine di un file di una riga con vim. – Locane

4
set backspace=indent,eol,start 

nel tuo .vimrc ti consentirà di utilizzare backspace e su \n (newline) in modalità di inserimento.

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

vi permetterà di eliminare la LF precedente in modalità normale con X (quando in colonna 1).

+0

@QiLuo vedi risposta aggiornata – laktak

1

Il problema è che i caratteri multipli 0A (\ n) che sono invisibili possono accumularsi. supose si vuole ripulire dalla linea 100 fino alla fine:

Digitando ESC e: (comandante terminale)

:110,$s/^\n// 

In uno script Vim:

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

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