Wie lösche (nicht schneide) ich in Vim?

142

Wie kann ich eine Zeile löschen, ohne sie in meinen Standardpuffer zu legen?

Beispiel:

line that will be copied.

line that I want to be substitued with the previous one.

Was ich versuche zu tun:

yy
dd
p

Vim ersetzt jedoch die zuletzt kopierte Zeichenfolge durch die gelöschte (ausgeschnittene). Ich weiß , dass ich Puffer verwenden können , wie, "1yy, dddann "1p, aber ich habe immer vergessen , die kopierte Zeichenfolge in einem Puffer zu setzen , dann muss ich zuerst meine Inhalte einfügen (Zeile , die kopiert werden) und dann löschen , was ich (Linie wollen , dass ich will durch die vorherige ersetzt werden.)

Wie kann ich einen Text in Vi (m) wirklich löschen, ohne ihn zu kopieren?

Eine andere verwandte Frage ist, wie ich ein Wort im Einfügemodus weiterleiten kann. Ich möchte etwas ähnliches wie Ctrl+ w.

MaikoID
quelle

Antworten:

128

Verwenden Sie das "Schwarzlochregister", "_um wirklich etwas zu löschen : "_d.
Verwenden Sie "_dPdiese Option, um etwas einzufügen und für das weitere Einfügen verfügbar zu halten.

Für die zweite Frage könnten Sie verwenden <C-o>dw. <C-o>wird verwendet, um einen normalen Befehl auszuführen, ohne den Einfügemodus zu verlassen .

Sie können natürlich Ihre eigenen Zuordnungen einrichten, um die Eingabe zu speichern. Ich habe diese:

nnoremap <leader>d "_d
xnoremap <leader>d "_d
xnoremap <leader>p "_dP
romainl
quelle
Danke, du beantwortest meine beiden Fragen. Aber ich habe nicht verstanden, wie mir diese Noremap-Befehle helfen werden. Verliere ich die Schnittfunktion, richtig?
MaikoID
3
Nein, dimmer noch "schneidet" und pimmer noch "einfügt", während es <leader>dfür real löscht und <leader>pden ausgewählten Text wegwirft und den Inhalt des Standardregisters einfügt. <leader>pErmöglicht es mir, denselben Text mehrmals einzufügen, ohne benannte Register verwenden zu müssen.
Romainl
117

Das Schwarze Loch Register "_ , aber es gibt eine bessere Lösung:

Wenn Sie die Zeile mit dem pBefehl zurück eingeben, fügen Sie den Inhalt des (flüchtigen) Standardregisters ein "" , das von überschrieben wurde dd. Sie können jedoch weiterhin aus dem (nichtflüchtigen) Ruckregister einfügen "0 , das vom Löschbefehl nicht überschrieben wird dd.

Dies sind also die Befehle, die Sie gemäß Ihrem Beispiel verwenden möchten:

yy
dd
"0p
Cutemachine
quelle
1
Großartig, dies sollte die akzeptierte Antwort sein. Es ist viel einfacher, ein Register manuell anzugeben, wenn ich es einfügen möchte, als jedes Mal, wenn ich etwas lösche, ein Register anzugeben.
JShorthouse
43

Das ist eines der Dinge, die ich an vim nicht mochte ... Am Ende habe ich mich dddem Black Hole Register in meiner .vimrc zugeordnet und das Leben war seitdem gut:

nnoremap d "_d
vnoremap d "_d
kprobst
quelle
6
Wie schneidest du dann?
VitalyB
11
v/Vmit xwird auch geschnitten. Und das Schneiden mit xist auch Ctrl + xin jedem Betriebssystem kohärent .
WesternGun
22

Die folgenden Zuordnungen werden erstellt:

  • d => "löschen"
  • Führer d => "schneiden"
nnoremap x "_x
nnoremap d "_d
nnoremap D "_D
vnoremap d "_d

nnoremap <leader>d ""d
nnoremap <leader>D ""D
vnoremap <leader>d ""d

Es ist auch eine gute Übung, die "Leader" -Taste auf Komma zu setzen, z. B.:

let mapleader = ","
let g:mapleader = ","

Diese 2 Schnipsel machen ", d" zu Ihrem neuen Schnittbefehl.

Wenn Sie diese Zuordnungen zusammen mit einer Konfiguration der freigegebenen System-Zwischenablage verwenden möchten, finden Sie weitere Informationen unter https://github.com/pazams/d-is-for-delete

pazams
quelle
Ich wünschte, ich könnte diese Antwort mehr als einmal positiv bewerten - ich habe die Antwort von kprobst verwendet, aber um dann eine Linie zu schneiden, musste ich eine verwenden, yydddie für meine Finger etwas unhaltbar war ;-).
Tahir Hassan
1
Intellij Idee, die danach so seltsam handelt. dd macht nichts. , d tut nichts
s1n7ax
Ich mag die Lösung sehr. Eine Sache, die bei mir nicht funktioniert hat - ist das Schneiden von Linien mit ,dd. Nach dem Hinzufügen nnoremap <leader>dd ""ddbegann es zu funktionieren
Alexey
8

Sie können verwenden "_d, um zu verhindern, dass Dinge Ihren gerissenen Text überschreiben. Sie können gezerrten oder gelöschten Text in einem beliebigen Register speichern, mit "und_ ist das ‚schwarze Loch‘ registrieren, wo Sie Material senden , dass Sie sich nicht um kümmern.

Für weitere Informationen können Sie :help "_oder eingeben:help deleting

Alex
quelle
-1
yy
Vx
p

Wenn Sie sich im visuellen Modus befinden, xwird die Auswahl gelöscht. Wenn Sie also eine ganze Zeile löschen möchten, drücken Sie zuerst V, um die Zeile im visuellen Modus auszuwählen, und drücken Sie dann x, um die Auswahl zu löschen.

Atemu
quelle
2
Dadurch wird die gelöschte Zeile in die Zwischenablage kopiert. Genau das möchte OP vermeiden.
aVeryStableGenius
Vielen Dank! Irgendwie funktioniert das perfekt mit Emacs 'Evil Plugin
Pedro Penna