Normalerweise kopiere ich Text von einem Punkt zum anderen, während ich alten Text überschreibe, in den der neue eingefügt wird:
blah1
newtext
blah2
wrong1
blah3
wrong2
blah4
Angenommen, ich markiere es visuell newtext
und y
knicke es an. Jetzt wähle ich wrong1
(das könnte alles sein, nicht unbedingt nur ein Wort) und p
aste die newtext
. Allerdings, wenn ich jetzt das gleiche mit tue wrong2
es mit Fassung wrong1
statt newtext
.
Wie verhindere ich, dass der Text im Puffer mit dem Text ausgetauscht wird, den ich gerade überschreibe?
Bearbeiten 1
Obwohl mir die Vorschläge für den Austausch von Registern sehr gefallen (ich glaube, ich werde mit der Verwendung von Registern anfangen, nachdem ich den :dis
Befehl entdeckt habe), werde ich eine Modifikation der Antwort von jinfield vornehmen , da ich den Austauschmodus nicht verwende.
vnoremap p "0p
vnoremap P "0P
vnoremap y "0y
vnoremap d "0d
macht den Trick perfekt.
Bearbeiten 2
Ich war zu schnell; romainls lösung ist genau das, wonach ich gesucht habe, ohne den hack in edit 1 .
Eigentlich vnoremap p "_dP
reicht das!
Also, akzeptierte Antwort ändern.
quelle
vnoremap p "_dP map
und festgestellt, dass es für das letzte Wort / Zeichen in einer Zeile nicht gut funktioniert. Ich bin gegangen , zurück in dasvnoremap p "0p
,vnoremap P "0P
undset clipboard=unnamed
(für OSX)vnoremap p "_dP
Entfernt Leerstellen auf der Paste. Edit 1 funktioniert einwandfrei.Antworten:
Ich habe diese Zuordnungen in meinem .vimrc:
"_
ist das "Blackhole Register" nach:help "_
:"Beim Schreiben in dieses Register passiert nichts. Dies kann verwendet werden, um Text zu löschen, ohne die normalen Register zu beeinflussen. Beim Lesen aus diesem Register wird nichts zurückgegeben. {Not in Vi}"
quelle
vnoremap p "_dP map
und festgestellt, dass es für das letzte Wort / Zeichen in einer Zeile nicht gut funktioniert. Ich bin gegangen , zurück in dasvnoremap p "0p
,vnoremap P "0P
undset clipboard=unnamed
(für OSX)vnoremap p "_dP
vnoremap <leader>p "_dP
<leader>
ist es ein Platzhalter, den ich durch etwas ersetzen soll, aber das hat nur bei mir funktioniert, wenn ich es entfernt habe. Was heißt das hier?:help mapleader
.vnoremap <leader>p
Zuordnung nicht korrekt , weil so schnell in der letzten Zeile des Puffers funktioniert , wie Sie die letzte Zeile des Puffers löschen, Sie sind jetzt auf der einst zweitletzte Zeile, und dasP
oberhalb dieser Linie einfügen, statt unten.Zusätzlich zum Standardpuffer können Sie Text in benannte Puffer ziehen und dann aus diesen benannten Puffern einfügen. Sie können bis zu 26 benannte Puffer verwenden (einen für jeden Buchstaben). Verwenden Sie doppelte Anführungszeichen und einen Buchstaben, um auf einen benannten Puffer zuzugreifen. Beispiele:
"dyy
- Aktuelle Zeile in Puffer d ziehen."a7yy
- Ziehen Sie die nächsten sieben Zeilen in den Puffer a."dP
- Setzen Sie den Inhalt des Puffers d vor den Cursor."ap
- Setzen Sie den Inhalt des Puffers a hinter den CursorEine andere coole Sache, wenn Sie einen Großbuchstaben anstelle von Kleinbuchstaben verwenden, dh
"Dyy
die aktuelle Zeile wird an den Puffer d angehängt, anstatt ihn zu ersetzen. Weitere Details im O`Reilly-Buch: http://docstore.mik.ua/orelly/unix/vi/ch04_03.htmquelle
"a
alles, aber okay.Bei Verwendung
put
im visuellen Modus wird der zu ersetzende Textwrong1
durch den Inhalt des Registers "unamed" überschrieben.Dies funktioniert tatsächlich, indem das Register nach der Auswahl 'abgelegt' und dann die Auswahl gelöscht wird. Das Problem ist, dass diese Löschung jetzt im
unnamed
Register gespeichert wird und für die nächsteput
Aktion verwendet wird.Die Lösung besteht laut darin
:h v_p
, in ein benanntes Register zu ziehen, z. B."0y
und dann"0p
so viel Zeit wie nötig einzufügen . Es kann hilfreich sein, ein benanntes Register zuzuordnen<leader>y
und<leader>p
zu verwenden, wenn Sie dies häufig tun.Weitere Hilfe finden Sie unter:
quelle
Das Einfügen aus dem
"0
Register ist wichtig zu wissen, aber Sie möchten oft viele Male ersetzen. Wenn Sie es zu einer wiederholbaren Aktion machen, können Sie den.
Operator verwenden, auf den garyjohn anspielt. Es wird im Vim-Wiki erklärt :quelle
Wenn Sie den Text in das unbenannte Register * ziehen, wird auch eine Kopie in Register 0 abgelegt. Jedes Mal, wenn Sie den ausgewählten Text ersetzen, können Sie ihn einfach aus dem Register 0 einfügen. Sehen
Wenn Sie eine Reihe von Wörtern durch dasselbe Wort ersetzen, können Sie einfach zum Anfang des zu ersetzenden Wortes gehen und es eingeben
.
. Dadurch wird der letzte Bearbeitungsvorgang wiederholt. Sehen* Die Speicherorte, an die Sie ziehen und aus denen Sie ziehen, werden als Register bezeichnet. Ein Puffer ist das, was Sie bearbeiten, normalerweise eine Kopie einer Datei von der Festplatte.
quelle
Ich brauche das so oft, ich habe ein Plugin dafür geschrieben: ReplaceWithRegister .
Dieses Plugin bietet einen Zwei-in-Eins-
gr
Befehl, der Text, der durch eine {Bewegung}, eine ganze Zeile oder die aktuelle Auswahl abgedeckt ist, durch den Inhalt eines Registers ersetzt. Der alte Text wird im Black-Hole-Register gelöscht, dh er ist weg.quelle
Da etwas wie
vnoremap p "_dP
(ich habe es auch versuchtx
oder versuchtc
) Probleme mit dem Zeilenanfang und -ende hat, habe ich dies getan:vnoremap p :<C-U>let @p = @+<CR>gvp:let @+ = @p<CR>
was ich einfacher fand als die vorhandenen Plugins (die auch nicht ohne weiteres funktioniertenset clipboard=unnamedplus
). Also, was es tut, ist:C-U
)+
(aufgrund von unnamedplus, Alternativen sind"
und*
je nach Konfiguration) zup
quelle
Dies ist, was ich benutze (wörtlich aus meiner .vimrc kopiert) für Windows-Stil Control + X Ausschneiden / Control + C Kopieren / Control + V Einfügen / Control + S Speichern / Control + F Suchen / Control + H Ersetzen Verhalten.
Die Funktion smartpaste () sollte das enthalten, wonach Sie suchen, dh eine Möglichkeit, markierten Text einzufügen, ohne gleichzeitig an der ausgewählten Stelle zu ziehen.
quelle
tl; dr - vnoremap p "_c *
Hier ist eine Liste meiner vollständigen Zuordnungen:
"Register kopieren /
einfügen nnoremap DD" * dd
nnoremap D "* d
vnoremap D" d
nnoremap d "
_d nnoremap dd" _dd
vnoremap d "
_d nnoremap s" _s
vnoremap s "_s
nnoremap c "
_c vnoremap c"
_c nnoremap x "_x
vnoremap x" _x
vnoremap p "_c
Msgstr "Einfügen in neue Zeile" nnoremap "," p op
nnoremap "," P op "
quelle