Durchführen bestimmter Vorgänge ohne Löschen des Registers


30

In Konfigurationsdateien kopiere ich häufig einen Zeilenblock und füge ihn ein. Dann möchte ich kleine Änderungen an diesem Block vornehmen. Nach dem Einfügen xlösche ich mit Zeichen, die ich entfernen möchte, und füge dann den nächsten Block ein. Mit Ausnahme xder gelöschten Zeichen in der Zwischenablage, so muss ich den Zeilenblock erneut kopieren.

Gibt es eine Möglichkeit, dies zu tun, ohne in den Einfügemodus zu wechseln?


Jasper hat ähnliche Fragen zu Stack Overflow gefunden : [Irgendeine Möglichkeit, in vim zu löschen, ohne den letzten Ruck zu überschreiben? [duplicate]] ( stackoverflow.com/questions/3638542/… ) und In vim gibt es eine Möglichkeit, zu löschen, ohne Text in das Register
Gilles 'SO- hör auf böse zu sein'

Antworten:


35

Ihre Möglichkeiten sind:

  1. Verwenden Sie das Schwarzlochregister _. Zum Beispiel, um eine Zeile zu löschen, die Sie eingeben würden "_dd. Dies wird ohne Auswirkung auf die Zwischenablage gelöscht.
  2. Nennen Sie explizit ein Register für den ursprünglichen Ruck. Wenn Sie beispielsweise eine Zeile in ein benanntes Register ziehen möchten "ayy, geben Sie Folgendes ein und fügen Sie sie ein"ap
  3. Verwenden Sie stattdessen die Yank-Register, um den ursprünglichen Yank abzurufen. Sie können nach Bedarf ruckeln und dann löschen, wenn Sie zum Einfügen von Typ gehen"0p
  4. Verwenden Sie ein Plugin wie vim-easyclip , um einen vom Löschoperator verschiedenen Schneidoperator bereitzustellen (vollständige Offenlegung: das habe ich geschrieben)

Führen Sie :help registersdie ersten drei Schritte aus, um weitere Informationen zu erhalten


4
Also für xwürde ich "_xdann verwenden?
Durron597

1
Das ist richtig.
Steve Vermeulen

2
@durron597 Wenn Sie jeweils ein Zeichen mit löschen x, sollten Sie wahrscheinlich lernen, wie man durch Bewegung löscht, dt)welche löscht, bis die nächste enge Klammer d2Wdie nächsten zwei durch Leerzeichen getrennten Token löscht. Dann machst du vielleicht etwas "_di{in einer geschweiften Region, was ich die ganze Zeit mache. Im normalen Modus bedeutet dies: " Lösche alles in dieser verstrebten Region in das Schwarze Loch "
OregonTrail

Hinzugefügt nnoremap x "_xmeine ~/.vimrc(Erklärung hier: stackoverflow.com/questions/54255/... ).
Victoria Stuart

11

xlegt Dinge nicht in der Zwischenablage ab, sondern legt sie in einem Register ab . Wenn Sie ihm nicht mitteilen, in welches Register er gestellt werden soll, wird er in das unbenannte Register gestellt, wodurch natürlich der vorherige Inhalt überschrieben wird. Sagen Sie ihm stattdessen, welches Register verwendet werden " REGISTER xsoll:, wobei REGISTER ein einzelner Buchstabe ist. Sie verwenden dann dasselbe Anführungszeichen-Präfix, pum aus diesem Register einzufügen. (Hinweis: Kleinbuchstaben ersetzen den Inhalt; Großbuchstaben werden angehängt).

Es gibt auch zwei Sonderregister "0und "1. "0ist der zuletzt gezerrte ( y) Text, der auch dann erhalten bleibt, wenn Sie Text mit einem anderen Befehl (wie x) löschen . "1ist der zuletzt gelöschte Text, solange dieser Text nicht klein ist (eine Zeile). Kleiner gelöschter Text geht ein "-.

Schließlich können Sie, wie Steve Vermeulen betont, vim anweisen, gelöschten Text nicht zu speichern, indem Sie das Register für Schwarze Löcher angeben "_.

Der entsprechende Hilfebefehl lautet :help registers.


3

Mit dem :letBefehl können Sie ein benanntes Register neu definieren. Drücken Sie in der Befehlszeile von vim zweimalControl + 1 und dann den Registernamen, um den Inhalt des Registers in den Befehl einzufügen. Anschließend können Sie die eingefügten Elemente ändern und das Register mit Ihren Änderungen speichern.R

Beispiel:

  • Im normalen Modus wird bei einer Zeile mit dem Text "Foo Bar" "fyydie gesamte Zeile ( yy) in das fRegister ( "f) eingegeben .
  • Typ :let @f='und Control+ r, Control+ rwieder, dann f, und Sie sollten sehen , daß es in „Foo Bar“ einfügen, so dass Ihre Kommandozeile jetzt liest :let @f='Foo Bar, mit dem Cursor am Ende.
  • Jetzt können Sie mit den Pfeiltasten und den Löschtasten bearbeiten, was Sie gerade eingefügt haben, z :let @f='foo bar baz.
  • Beenden Sie das Zitat: :let @f='foo bar baz'und drücken Sie Enter.

Jetzt haben Sie den Inhalt des fRegisters als "foo bar baz" neu definiert.

(Dies funktioniert auch für Makros! :help letWeitere Informationen.)


Mit 1 Control + rkönnen Sie ein Register einfügen, wenn Sie sich bereits im Einfügemodus befinden, als würden Sie die Zeichen eingeben. Es ist wichtig, diese Sequenz zweimal zu verwenden, da "der Text wörtlich und nicht wie geschrieben eingefügt wird. Dies unterscheidet sich, wenn das Register Zeichen wie <BS>" enthält . - die insert.txt vimdoc,:help i_CTRL-R_CTRL-R


0

Bezogen auf das "_von @derobert erwähnte Blackhole-Register finden Sie einen nützlichen Screencast unter http://vimcasts.org/episodes/meet-the-yank-register/

Vim verwendet die Begriffe "Löschen", "Ziehen" und "Einfügen" anstelle der Standardterminologie "Ausschneiden", "Kopieren" und "Einfügen". Ab dem gleichen Buchstaben sind Put und Paste leicht austauschbar. Sobald Sie sich an das Wort "reißen" gewöhnt haben, wird es zum Synonym für "kopieren". Aber Vims Verwendung des Wortes "Löschen" ist problematisch. In den meisten Kontexten bedeutet das Wort "Löschen" nur "Entfernen". Die Löschoperation von Vim kopiert den Text jedoch in ein Register und entfernt ihn dann aus dem Dokument. Mit anderen Worten verhält sich die Löschoperation von Vim wie ein Schnitt.


2
Dies gibt keine Antwort auf die Frage. Wenn Sie einen Autor kritisieren oder um Klarstellung bitten möchten, hinterlassen Sie einen Kommentar unter seinem Beitrag. Sie können jederzeit Ihre eigenen Beiträge kommentieren. Wenn Sie über eine ausreichende Reputation verfügen, können Sie jeden Beitrag kommentieren .
Jamessan

Ich habe versucht, den ursprünglichen Beitrag zu kommentieren, aber ich konnte nicht. Die einzige Alternative, die ich hatte, war die, die ich
Marlon León gewählt habe

0

Plugin ReplaceWithRegister

http://www.vim.org/scripts/script.php?script_id=2703 (2009-2014)

Es schlägt die Zuordnung vor gr.

  1. Ruck
  2. Wählen Sie den zu ersetzenden Text visuell aus und drücken Sie gr
  3. Gehen Sie zum nächsten Block, den Sie ersetzen möchten

Alternativ können gr<text object>Sie dies auch ohne visuelle Auswahl tun. dot-repeat wird unterstützt, wenn die Plugins repeat.vimvon Tim Pope und visualrepeat.vimIngo Karkat installiert sind.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.