Gibt es in Vim eine Möglichkeit zum Löschen, ohne Text in das Register einzutragen?

StackOverflow https://stackoverflow.com/questions/54255

  •  09-06-2019
  •  | 
  •  

Frage

Mit Vim möchte ich oft einen Codeblock durch einen Block ersetzen, den ich gerade entfernt habe.

Aber wenn ich den Codeblock lösche, der ersetzt werden soll, wird dieser Block selbst in das Register eingetragen, wodurch der Block gelöscht wird, den ich gerade herausgezogen habe.Deshalb habe ich mir angewöhnt, Dinge, die ich nicht wollte, herauszureißen, dann einzufügen und dann zu löschen, aber bei großen Codeblöcken wird es unordentlich, wenn man versucht, den eingefügten Block und den zu löschenden Block getrennt zu halten.

Was ist also der eleganteste und schnellste Weg, Text in Vim zu ersetzen?

  • Gibt es eine Möglichkeit, Text zu löschen, ohne ihn in das Register einzutragen?
  • Gibt es eine Möglichkeit, z. B. zu sagen:„nächstes Wort ersetzen“ oder „bis zum nächsten Absatz ersetzen“
  • Oder ist es der beste Weg, die Multi-Register-Funktion irgendwie zu nutzen?
War es hilfreich?

Lösung

Um etwas zu löschen, ohne dass es in einem Register zu speichern, können Sie die „schwarze Loch Register“ verwenden:

"_d

Natürlich können Sie auch alle anderen Register verwenden könnte, die nicht halten, was Sie interessiert sind.

Andere Tipps

Ja. Es ist etwas verworren als den „alten“ Text zuerst zu löschen, aber:

ich beginne mit ..

line1
line2
line3
line4

old1
old2
old3
old4

I verschieben + v wählen Sie die Zeile 1, Zeile 2, 3 und 4, und löschen Sie sie mit der d Befehl

Dann lösche ich die alten 1-4 Zeilen die gleiche Weise.

Dann tun

"2p

Das wird die vorletzte zerrte Linien (Linie 1-4) einfügen. "3p die dritt von letzten tun, und so weiter ..

Also habe ich am Ende mit

line1
line2
line3
line4

Hinweis: Vim-Dokumentation auf nummerierte registrieren

VIM docs: Nummerierte Register 0 den Text aus dem letzten Ruck-Befehl enthält, es sei denn, der Befehl angegeben ein anderes Register mit [ "x].

z. wir zerren „foo“ und löschen „bar“ - die Registrierung 0 enthält noch „foo“! Daher "foo" eingefügt werden kann "0p mit

Es ist praktisch eine einfache Zuordnung zu haben, mit dem Sie die aktuelle Auswahl mit Puffer können ersetzen.

Zum Beispiel, wenn Sie diese in deinem .vimrc

vmap r "_dP       // it's a capital 'p' on the end

dann, nach etwas in das Register Kopieren (das heißt mit ‚y‘), können Sie nur den Text auswählen, die Sie ersetzt werden soll, und drücken Sie einfach ‚r‘ auf der Tastatur. Die Auswahl wird mit Ihrem aktuellen Register ersetzt werden.

Erklärung:

vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste

Ich habe folgend in meinem vimrc:

noremap  y "*y
noremap  Y "*Y
noremap  p "*p
noremap  P "*P
vnoremap y "*y
vnoremap Y "*Y
vnoremap p "*p
vnoremap P "*P

Jetzt reiße ich und aus dem Zwischenablage Register gesetzt und muß nicht egal, was mit dem Standardregister passiert. Ein weiterer Vorteil ist, dass ich von anderen Anwendungen mit minimalem Aufwand einfügen kann. Ich bin einige Funktionen verlieren, ich weiß, aber ich kann einfach nicht verfolgen, mehr als ein Register / Zwischenablage trotzdem.

Für das spezielle Beispiel, dass Sie gab, wenn ich die Frage verstehen, dann könnte dies funktionieren:

*Highlight what you want to put somewhere else
*delete (d)
*Highlight the code that you want it to replace
*paste (p)

Alle yank und Löschoperationen auf die unbenannte Register standardmäßig schreiben. Doch die jüngste yank und letzten löschen sind immer (separat) in den numerierten Registern gespeichert. Das Register 0 hält den letzten Ruck. Die Register 1-9 die 9 letzten Löschungen halten (mit 1 wobei die jüngsten).

Mit anderen Worten: ein Löschüberschreibt den letzten Ruck im unbenannte Register, aber es ist immer noch da im 0 Register. Der Blackhole-Register Trick ("_dd) in den anderen Antworten erwähnt funktioniert, weil es verhindert, dass die unbenannte Register zu überschreiben, aber es ist nicht notwendig.

Sie verweisen auf ein Register doppelte Anführungszeichen verwenden, so Einfügen der zuletzt zerrte Text kann wie folgt geschehen:

"0p

Dies ist eine hervorragende Referenz:

Um zu betonen, was EBGreen sagte :

Wenn Sie einfügen, während Text auswählen, wird der ausgewählte Text ist ersetzt mit dem eingefügten Text.

Wenn Sie einen Text kopieren möchten, und fügen Sie ihn in mehreren Orten verwenden "0p einzufügen. Nummerierte Register 0 enthält den Text aus dem letzten Ruck-Befehl.


Sie können aber auch den Inhalt aller Ihr Register Liste:

:registers

Dieser Befehl macht es einfacher, um herauszufinden, was registrieren Sie wollen, wenn, wie etwas zu tun, Antwort des dbr. Sie werden auch die /,%, # Register sehen. (Siehe auch :help registers)


Und schließlich Besuche cW und cW ein Wort zu ändern, einschließlich und nicht mit einem hinteren Raum. (Unter Verwendung von Kapital W enthält Interpunktion).

Wenn Sie Vim verwenden, haben Sie den visuellen Modus, der dem Auswählen ähnelt, aber mit den Trennmodi, die die Grundlage von vi/vim bilden.

Was Sie tun möchten, ist, den visuellen Modus zu verwenden, um die Quelle auszuwählen, dann zu ziehen, dann erneut den visuellen Modus zu verwenden, um den Bereich des Ziels auszuwählen, und dann aus dem Standardpuffer in Text einzufügen.

Beispiel:

In einer Textdatei mit:

1| qwer
2| asdf
3| zxcv
4| poiu

mit folgender Reihenfolge: ggVjyGVkp Du wirst enden mit:

1| qwer
2| asdf
3| qewr
4| asdf

Erklärt:

  • gg:gehe zur ersten Zeile
  • V:Starten Sie den visuellen Modus mit ganzen Zeilen
  • j:eine Zeile nach unten gehen (wenn die Auswahl in den vorherigen Zeilen beginnt, vergrößert sich die Auswahl um eine Zeile nach unten)
  • y:Ziehen Sie zum Standardpuffer (die beiden ausgewählten Zeilen, und Sie verlassen automatisch den visuellen Modus).
  • G:gehe zur letzten Zeile
  • V:visuellen Modus starten (wie zuvor)
  • k:eine Zeile nach oben gehen (wie zuvor, wenn der visuelle Modus aktiviert ist, vergrößert sich dadurch die Auswahl um eine Zeile nach oben)
  • p:Einfügen (mit der Auswahl in den beiden letzten Zeilen werden diese Zeilen durch alles ersetzt, was sich im Puffer befindet – in diesem Fall die beiden ersten Zeilen)

Dies hat den kleinen Nachteil, dass der letzte Block in den Puffer gelegt wird, sodass es für wiederholtes Einfügen derselben Sache irgendwie nicht erwünscht ist. Daher sollten Sie die Quelle in einem benannten Puffer mit etwas wie speichern "ay (in einen Puffer namens „a“) ​​und mit etwas wie „einfügen“. "ap (Aber wenn Sie programmieren, möchten Sie wahrscheinlich nicht mehrmals einfügen, sondern eine Funktion erstellen und aufrufen, oder? RECHTS?).

Wenn Sie nur vi verwenden, müssen Sie unsichtbare Markierungen anstelle des visuellen Modus verwenden. :he mark Für mehr dazu tut es mir leid, aber ich bin nicht sehr gut mit dieser Sache mit den unsichtbaren Markierungen, ich bin mit dem visuellen Modus ziemlich vertraut.

Für 'ersetzen Wort', versucht cw im normalen Modus.

'ersetzen Absatz', versucht cap im normalen Modus.

Eine minimal invasive Lösung für die Faulen:

Register 0 enthält immer den letzten Ruck (wie Rafael , alex2k8 und idbrii bereits erwähnt). Leider kann die Auswahl registriert 0 die ganze Zeit ziemlich ärgerlich sein, so wäre es schön, wenn p "0 standardmäßig verwendet. Dies kann, indem Sie die folgenden Zeilen in Ihre .vimrc erreicht werden:

noremap p "0p
noremap P "0P
for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
    execute 'noremap "'.s:i.'p "'.s:i.'p'
    execute 'noremap "'.s:i.'P "'.s:i.'P'
endfor

Die erste Zeile bildet jeden p Schlaganfall "0p. Jedoch verhindert dieses p von jedem anderen Register zugreifen. Deshalb werden alle p Schläge mit einem explizit ausgewählte Register werden dem äquivalenten Command Expression innerhalb der for-Schleife abgebildet. Das gleiche gilt für P getan.

Auf diese Weise das Standardverhalten beibehalten wird, mit Ausnahme der impliziten p und P Striche, die 0 verwenden standardmäßig jetzt registrieren.

Tipp 1: Der Schnitt Befehl wird nun statt nur "0d d. Aber da ich bin faul das für mich viel zu lang ist;) Deshalb verwende ich die folgende Abbildung:

noremap <LEADER>d "0d
noremap <LEADER>D "0D

Der Führer Schlüssel ist standardmäßig \, so dass Sie leicht Text, indem Sie \d oder \D schneiden können.

Tipp 2: Die Standard-Timeout für Multi-Tastenzuordnungen sind ziemlich kurz. Vielleicht möchten Sie es erhöhen, um mehr Zeit zu haben, wenn ein Register auswählen. Siehe :help timeoutlen für Details, ich bin mit:

set timeout timeoutlen=3000 ttimeoutlen=100

Nun, zunächst diesen Befehl tun:

:h d

Dann werden Sie feststellen, dass Sie in ein spezielles Register löschen. So können Sie nicht verändern, was in Ihrem Standard-Register ist.

Text gelöscht, während im Insert-Modus, nicht in Standard-Register geht.

Die beiden Lösungen, die ich in den richtigen Kontext verwenden sind;

  • markieren, was Sie Vims VISUAL Modus fügen Sie anschließend das Register.
  • ersetzen möchten

ich diese verwenden meist aus Gewohnheit, wie ich nur die zweite Lösung viel später gefunden, zB

yiw   " yank the whole word
viwp  " replace any word with the default register
  • YankRing . Mit diesem Plugin können Sie die Tastenkombination <ctrl>+<p> verwenden, um die vorherige nummerierte Register mit dem ersetzen, die Sie gerade eingefügt.

Im Grunde gehen Sie Einfügen als würden Sie, aber wenn Sie feststellen, dass Sie das Standardregister so da überschrieben haben zu verlieren, was Sie tatsächlich einfügen wollten Sie <C-P> aus der YankRing Geschichte zu finden und ersetzen!

Eine davon muss über Plugins ...

fand ich ein sehr nützliches Mapping für Ihren Zweck:

xnoremap p "_dP

Gelöschte Text wird in „schwarzes Loch Register“ gesetzt, und die zerrte Text bleibt.

Quelle: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text

In der Windows-Version (wahrscheinlich in Linux auch), können Sie das System Kopieren / Einfügen Puffer "*y Yank in (das heißt vor Ihrem yank Befehl mit doppelten Anführungszeichen und Sternchen).

Sie können dann löschen Sie die austauschbaren Linien normal und fügen Sie den kopierten Text "*p verwendet wird.

ich oft einen Fehler machen, wenn im Anschluss an die Befehle ‚y'ank dann‘ "_d'elete in ein schwarzes Loch dann‚p'aste. Ich bevorzuge‘y'ank, dann löschen aber wie ich, dann‚“ 0p‘aus dem 0-Register, das ist, wo der letzte kopierte Text gedrückt wird.

Meine Situation: in Normal Modus, wenn ich Zeichen löschen Sie die x keypress verwenden, diese Löschungen überschreiben meine letzte Register - Änderungen komplizieren, wo ich will Zeichen löschen, indem x und Paste etwas, das ich in meinem letzten Register (zB Einfügen der gleiche Text an zwei oder mehr Stellen).

habe ich versucht, den Vorschlag in der akzeptierten Antwort ("_d), aber es hat nicht funktioniert.

Doch von den akzeptierten Antwort / Kommentare unter https: // vi. stackexchange.com/questions/122/performing-certain-operations-without-clearing-register , habe ich diese zu meinen ~/.vimrc, die funktioniert (Sie können Vim neu starten):

nnoremap x "_x

Das heißt, ich kann meinen normalen Ruck (y) jetzt tun, löschen (d) und Paste (p) Befehle -. Und Charaktere, die ich nicht mehr die letzten Register bevölkern mit x lösche

Für Dvorak Benutzer, eine sehr bequeme Methode ist, einfach nicht benötigten Text in die „1-Register anstelle des‚löscht _ schwarze Loch-Registers, wenn auch nur, weil Sie‘+ 1 mit der gleichen Schicht drücken und einer raschen Pinky Bewegung drücken da 1 ist der Schlüssel unmittelbar oberhalb "in Dvorak (PLUS d in der anderen Hand, die den ganzen Befehl schnell wie die Hölle macht).

Dann könnte natürlich das „1-Register für andere Dinge verwendet werden, weil es der Bequemlichkeit, aber wenn Sie einen Zweck häufiger als Text ersetzt haben würde ich sagen, es ist eine ziemlich gute Nutzung des Registers.

Für diejenigen von Ihnen, den primären Interessen von nicht das unbenannte Register zu überschreiben, wenn Sie einen Text über virtuelle Auswahl und Einfügen ersetzen.

Sie können folgende Lösung verwenden, die einfach und funktioniert am besten für mich:

xnoremap <expr> p 'pgv"'.v:register.'y'

Es ist aus den Antworten (und Kommentaren) hier: Wie bekleben ohne Überschreiben registrieren

Es vorbei an der Auswahl zuerst, dann die Auswahl mit dem neuen Text nochmals ausgewählt (gv). Nun ist die Register, das im visuellen Modus zuletzt verwendet wurde (in der Regel des unbenannte Register funktioniert aber auch frei von Nebenwirkungen, wenn Sie ein anderes Register zum Einfügen verwenden). Und dann wieder den neuen Wert in das Register zerrt.

PS: Wenn Sie eine einfachere Variante benötigen, die auch mit intellj Idee Plugin vim-Simulation funktioniert können Sie diesen übernehmen (Nachteil: überschreiben unbenannte Register auch wenn ein anderes Register wurde für das Einfügen angegeben):

vnoremap p pgvy

Für Emacs-evil Benutzer kann die Funktion (evil-paste-pop) nach dem Einfügen ausgelöst werden, und Zyklen durch vorherige Einträge in dem Kill-Ring. Vorausgesetzt, dass Sie es zu <C-p> gebunden (default in Spacemacs), würden Sie p von so vielen <C-p> gefolgt schlagen je nach Bedarf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top