In Vim löschen und dann ohne neue Zeile einfügen

11

Oft möchte ich in vim eine Zeile komplett löschen, also benutze ich dd. Ich muss diese Zeile dann jedoch an einer anderen Position innerhalb einer Zeile einfügen. Dadurch wird jedoch vor dem Einfügen eine neue Zeile eingefügt, was es für mich sehr schwierig macht, das gewünschte Ergebnis zu erzielen. Zum Beispiel,

while( pasteInHere )
{
    cin >> n; // Delete this line completely with dd
}

Wenn ich dies mit dem obigen Code mache, bekomme ich:

while( pasteInHere )
cin >> n; // Delete this line completely with dd
{
}

Was ist sehr weit von dem gewünschten Ergebnis entfernt ... Wie kann ich dieses Newline-Verhalten unterdrücken oder eine andere Methode verwenden, die es sehr effizient macht? Ich denke nicht, dass d $ gut ist, weil ich nicht nur zum Zeilenanfang gehen muss, sondern wenn ich auch die leere Zeile löschen möchte, muss ich sie in einem anderen Register löschen. Ich denke, es sollte einen einfacheren Weg geben! Vielen Dank.

Feuer
quelle
1
Es ist kein Duplikat, wie ich bereits sagte, ich möchte einen effizienteren Weg als zum Zeilenanfang. Außerdem möchte ich die gesamte Zeile mit dem Zeilenumbruchzeichen entfernen ... nicht nur den Inhalt der Zeile
für den
Oh, ich verstehe, was du jetzt meinst. Mir war einfach nicht klar, was Sie erreichen wollten.
EvergreenTree
1
0DZeile außer Zeilenumbruch löschen. Und als gJLinien zu verbinden. Jetzt können Sie den Text ohne Unterbrechungslinie und ohne Leerzeile einfügen.
Alex Kroll

Antworten:

9

Sie können an eine beliebige Stelle in der Zeile über der zu löschenden Zeile gehen JDund diese dann pan der gewünschten Stelle drücken und einfügen .

  • Jverbindet die beiden Zeilen und bewegt Sie am Anfang des Textes, den Sie löschen möchten. Dadurch werden ein neues Zeilenzeichen und der Einzug der Zeile, die Sie verschieben möchten, gelöscht.
  • D Löscht von der aktuellen Cursorposition bis zum Ende der Zeile, behält jedoch das Zeichen für die neue Zeile bei.

Tipp: Sie können verwenden, :puwenn Sie mit gelöscht Doder mit gezogen haben y$und mit einer neuen Zeile einfügen möchten .

Hajo
quelle
3

Nicht wirklich einfacher, aber etwas effizienter, und Sie können auch Karten im Normalmodus für beide Sequenzen erstellen:

  • Ruckeln: Gehen Sie dann zu der Linie, die Sie bewegen möchten ^D"_dd
  • Einfügen: Gehen Sie dann zu dem Wort, das Sie ersetzen möchten viwp
lcd047
quelle
2

Sie können etwas erreichen, das mit einem ganz gut funktioniert imap. Fügen Sie Folgendes hinzu vimrc:

inoremap <c-a> <c-r>1<esc>k$Jxi

Dadurch wird eine Zuordnung erstellt CTRL-a, in die der zuletzt gelöschte Text (mit ddoder ähnlich) eingefügt wird. Wenn Sie möchten, können Sie natürlich einen anderen Schlüssel für das Mapping verwenden.

Verweise:

:h i_CTRL-R
:h quote1
:h J
Karl Yngve Lervåg
quelle
1

Das fällt mir auch ein bisschen ein, ich hätte nie gedacht, es vorher zu optimieren, aber dieses Mapping funktioniert:

nmap dil ^d$

dilist „Löschen in line“, ähnlich wie diw, di"usw.

Flukus
quelle
1

Ohne neue Zeile einfügen

Fügen Sie dies in Ihre .vimrc-Datei ein:

" Paste yanked line without line breaks before/after cursor position
nnoremap gP i<CR><Esc>PkJxJx
nnoremap gp a<CR><Esc>PkJxJx

Beispiel:

<span style="color:">danger</span>

Jetzt können Sie eingeben gp, um #D51B3Fdanach einzufügen, color:während sich mein Cursor :im Normalmodus befindet.

Ruck ohne neue Linie

Verwenden Sie die Antwort von flukus:

" Delete current line without yanking the line breaks
nnoremap dil ^d$

als Akronym für innere Zeile löschen . Dadurch werden auch führende Einrückungen beseitigt.

Trebucherry
quelle
0

Sie können den zu kopierenden Text auswählen, indem Sie auf drücken, vund ihn dann durch Drücken in den Puffer aufnehmen yund an einer beliebigen Stelle einfügen p. Es wird keine neue Zeile eingefügt.

Varun Agarwal
quelle
Stimmt, aber dies lässt immer noch eine leere Zeile.
Muru