Löschen Sie die neue Zeile in Vim

271

Gibt es eine Möglichkeit, die neue Zeile am Ende einer Zeile in Vim zu löschen, sodass die nächste Zeile an die aktuelle Zeile angehängt wird?

Beispielsweise:

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

Ich möchte dies alles in eine Zeile setzen, ohne Zeilen zu kopieren und in die vorherige einzufügen. Es scheint, als ob ich in der Lage sein sollte, meinen Cursor an das Ende jeder Zeile zu setzen, eine Taste zu drücken und die nächste Zeile auf dieselbe Zeile springen zu lassen, auf der sich der Cursor befindet.

Endresultat:

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

Ist das in Vim möglich?

derekerdmann
quelle
Del am Zeilenende im Einfügemodus von vim, der für mich verwendet wurde. Allerdings nicht in jedem Terminal.
Victor Sergienko

Antworten:

584

Wenn Sie sich in der ersten Zeile befinden, wird durch Drücken von (Großbuchstaben) Jdiese Zeile und die nächste Zeile miteinander verbunden, wodurch die neue Zeile entfernt wird. Sie können dies auch mit einer Zählung kombinieren. Wenn Sie also drücken, 3Jwerden alle drei Zeilen miteinander kombiniert.

Xhantar
quelle
29
Wie in einer anderen Antwort erwähnt, gJwird das Hinzufügen von Leerzeichen vermieden, die Vim bei der Verwendung möglicherweise hinzufügt J.
Michael Mior
5
Sie können auch alle Linien auswählen, die Sie verbinden möchten V(Visual Line Mode), und dann JodergJ
Sbu
Wenn Sie die Cursorposition beibehalten möchten, verwenden Sie :joinund dies :join!verbindet Linien, wobei die Cursorposition beibehalten wird und kein Leerzeichen am Verbindungspunkt verbleibt. Sie können es auch wie folgt zuordnen: nnoremap <Leader>j :joing<cr>und nnoremap <Leader>gj :join!<cr>.
SergioAraujo
82

Bestimmt. Vim erkennt das Zeichen \ n als Zeilenumbruch, sodass Sie es einfach suchen und ersetzen können. Geben Sie im Befehlsmodus Folgendes ein:

:%s/\n/
TinkerTank
quelle
1
Danke, aber ich möchte nicht global suchen und ersetzen.
Derekkmann
16
Das Entfernen des% sorgt dafür. Dann passiert es nur in der Zeile, in der sich der Cursor befindet. Alternativ können Sie einen Bereich angeben, z. B.: 11,15s / \ n / (Zeilen 11-15) oder :, + 7s / \ n / (diese Zeile und die nächsten sieben) oder: -3, s / \ n / (vorherige drei Zeilen und diese) ... Sie bekommen die Idee
Tristan
1
Oder Sie können einen Vvisuellen Block auswählen und darüber ersetzen.
Victor Sergienko
51

Drücken Sie im normalen Modus in der oberen Zeile Shift+ j.

Sie können auch eine Zählung voranstellen, sodass 3Jin der obersten Zeile alle diese Zeilen zusammengefügt werden.

Alligator
quelle
34

Wie in anderen Antworten erwähnt, können (Großbuchstaben) Jund Suchen + Ersetzen nach \nallgemein verwendet werden, um Zeilenumbrüche zu entfernen und Zeilen zu verketten.

Um das nachgestellte Zeilenumbruchzeichen in der letzten Zeile zu entfernen , müssen Sie dies in Vim tun:

:set noendofline binary
:w
Néstor Waldyd
quelle
1
Bei der Frage geht es darum, zwei Zeilen in der Mitte einer Datei zu verketten. Bei dieser Antwort wird die neue Zeile am Ende der Datei entfernt, worüber ich nicht gefragt habe.
Derekerdmann
3
Das hat bei mir funktioniert. Ich habe versucht, eine neue Zeile am Ende einer einzeiligen Datei mit vim zu entfernen.
Locane
Warum :set noendoflinefunktioniert das nicht ohne binary?
Darw
32

Jlöscht zusätzlichen führenden Abstand (falls vorhanden) und verbindet Linien mit einem einzelnen Leerzeichen. (Mit einigen Ausnahmen: /[.!?]$/Nachher können zwei Leerzeichen eingefügt werden; Vorher /^\s*)/werden keine Leerzeichen eingefügt.)

Wenn Sie dieses Verhalten nicht möchten, gJentfernen Sie einfach den Zeilenumbruch und machen mit Leerzeichen überhaupt nichts Kluges.

kurzlebig
quelle
10

Alle folgenden setzen voraus, dass sich Ihr Cursor in der ersten Zeile befindet:

Verwenden normaler Zuordnungen:

3Shift+J

Verwenden von Ex-Befehlen:

:,+2j

Welches ist eine Abkürzung von

:.,.+2 join

Was auch über die folgende Verknüpfung eingegeben werden kann:

3:j

Ein noch kürzerer Ex-Befehl:

:j3
kzh
quelle
2
Ohne Leerzeichen zwischen ihnen:j!3
SergioAraujo
10
set backspace=indent,eol,start

In Ihrer .vimrc-Datei können Sie backspaceund deleteon \n(newline) im Einfügemodus verwenden.

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

Mit dieser Option können Sie den vorherigen LF im normalen Modus mit löschen X(in Spalte 1).

Laktak
quelle
2

Es hängt wahrscheinlich von Ihren Einstellungen ab, aber ich mache das normalerweise mit A<delete>

Wo Awird am Ende der Zeile angehängt. Es erfordert wahrscheinlich nocompatibleModus :)

Wolph
quelle
3
"Ich mache das normalerweise mit A <delete>" Ja, deshalb bin ich hierher gekommen; einen besseren Weg finden;). Der springende Punkt bei vim ist, dass Sie Ihre Hände nicht aus der Startreihe bewegen.
Luc
2
<CURSOR>Evaluator<T>():
    _bestPos(){
}

Cursor in der ersten Zeile

JETZT im NORMALEN MODUS

shift+v
2j
shift+j

oder

V2jJ

: normales V2jJ

Ivan Lopes
quelle
1

Ich würde einfach A (an Zeilenende anhängen, versetzt Sie in den Einfügemodus) in der Zeile drücken, in der Sie die neue Zeile entfernen möchten, und dann Löschen drücken.

David Watson
quelle
Leider scheint das bei mir nicht zu funktionieren; Es könnte eine PuTTY-Einstellung sein, die ich verpasst habe.
Derekkmann
2
wahrscheinlich die vi :help 'backspace'
Rücktaste
1

Wenn es Ihnen nichts ausmacht, andere Shell-Tools zu verwenden,

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
quelle
7
Das ist eine Art Overkill, findest du nicht?
Derekkmann
Nein, ist es nicht. Warum denkst du, ist es übertrieben? Die Ausführung in Vim erfolgt manuell. Es hängt davon ab, ob Sie es jedes Mal manuell von Hand machen oder einfach diese einen Liner ausführen möchten, um es im Handumdrehen zu erledigen. Vim ist Redakteur. Und alle Tools, die Dateien verarbeiten können, sind im Grunde getarnte "Editoren".
Ghostdog74
5
Noch einfacher, die Datei einfach in vim zu öffnen und zu verwenden ggVGJ.
zu viel PHP
Sicher, wenn Sie es einfacher finden, dies jedes Mal von Hand zu tun, wenn Daten auf diese Weise geändert werden müssen. Gehen Sie geradeaus. Versuchen Sie dies auch für eine große Datei.
Ghostdog74
Ich verarbeite nicht viele Dateien. Ich arbeite nur daran, ein paar Codezeilen zu komprimieren.
Derekkmann
1

Das Problem ist, dass sich unsichtbare Vielfache char 0A (\ n) ansammeln können. Angenommen, Sie möchten von Zeile 100 bis zum Ende aufräumen:

Eingabe von ESC und: (Terminal Commander)

:110,$s/^\n//

In einem Vim-Skript:

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

Erläuterung: Suchen Sie von 110 bis zum Ende nach Zeilen, die mit einer neuen Zeile beginnen (leer sind), und entfernen Sie sie

Sergio Abreu
quelle