Wie verwende ich VIM-Register?


925

Ich weiß nur von einer Instanz, die Register verwendet, über die CtrlR*ich Text aus einer Zwischenablage einfüge.

Was sind andere Verwendungszwecke von Registern? Wie benutzt man sie?

Alles, was Sie über VI-Register wissen (konzentrieren wir uns auf vi 7.2) - teilen Sie es uns mit.


22
Ich habe eine lange Antwort gibt auf die Verwendung von Registern
Benoit

Antworten:


1185

Mit den Registern in Vim können Sie Aktionen oder Befehle für den darin gespeicherten Text ausführen. Um auf ein Register zuzugreifen, geben Sie "avor einem Befehl aden Namen eines Registers ein. Wenn Sie die aktuelle Zeile in das Register kopieren möchten k, können Sie eingeben

"kyy

Oder Sie können ein Register mit einem Großbuchstaben anhängen

"Kyy

Sie können dann durch das Dokument navigieren und es an anderer Stelle mit einfügen

"kp

Einfügen aus der System-Zwischenablage unter Linux

"+p

Einfügen aus der System-Zwischenablage unter Windows (oder aus der Zwischenablage "Maus markieren" unter Linux)

"*p

Um auf alle aktuell definierten Register zuzugreifen, geben Sie ein

:reg

165
Und "+ist ein spezielles Register, das sich auf die Systemzwischenablage bezieht.
Aaron McDaid

17
In Windows kann mit auf die Zwischenablage zugegriffen werden "*. so wird der Befehl zum Kopieren bis zum Ende der Datei "*yG.
Aditya MP

44
In X (Linux, möglicherweise auch OS-X) *befindet sich die Zwischenablage "Maus-Hervorhebung" und +die Zwischenablage Strg-XCV.
Dotancohen

20
Gibt es eine Möglichkeit, an das Register der Zwischenablage anzuhängen (da kein Kapital vorhanden ist +)?
Naitsirhc

8
@dotancohen Technisch heißt es PRIMARY Auswahl, aber ich denke, "Maus Higlight" ist einfacher für die Leute zu bekommen :)
Cyrias

783

Ich war erfreut, als ich das 0Register entdeckte. Wenn Sie Text ziehen, ohne ihn einem bestimmten Register zuzuweisen, wird er dem 0Register zugewiesen und im Standardregister "gespeichert. Der Unterschied zwischen den Registern 0und "besteht darin, dass 0nur mit zerrissenem Text gefüllt wird, während das Standardregister auch mit Text gefüllt wird, der mit den Befehlen d/ D/ x/ X/ c/ C/ s/ gelöscht wurde S.

Ich finde das nützlich, wenn ich Text kopieren, löschen und durch den kopierten Text ersetzen möchte. Die folgenden Schritte veranschaulichen ein Beispiel:

  • Ziehen Sie an dem Text, mit dem Sie kopieren möchten y[motion]- dieser Text wird gespeichert "und 0registriert
  • Löschen Sie den Text, durch den Sie ersetzen möchten d[motion]- dieser Text wird im "Register gespeichert
  • Fügen Sie den gezogenen Text mit ein "0p

Wo "ist der Befehl, ein Register für den nächsten Befehl zu verwenden.

Wenn Sie im letzten Schritt aus dem Standardregister (mit p) einfügen, wird der gerade gelöschte Text verwendet (wahrscheinlich nicht das, was Sie beabsichtigt haben).

Beachten Sie, dass poder Paus dem Standardregister eingefügt wird. Das Langhandäquivalent wäre ""p(oder ""P) und "0hält den letzten Ruck, "1hält das letzte Löschen oder Ändern.

Weitere Informationen finden Sie unter :help registers.


17
poder PPasten aus dem Standardregister. Das Langhandäquivalent wäre ""p(oder ""P).
Nelstrom

186
Übrigens, genauso wie "0 hält den letzten Ruck", 1 hält das letzte Löschen oder Ändern.
FireAphis

6
"ist der Befehl, ein Register für den nächsten Befehl zu verwenden. So ""pwürde die Verwendung "Register für den Befehl zum Einfügen und "0pdas verwenden würden 0Register.
Ramon Marco L. Navarro

5
0pwürde bedeuten, zum ersten Zeichen der aktuellen Zeile zu gehen und aus dem Inhalt des Standardregisters ( ") einzufügen . "pDies wäre ein unvollständiger Befehl, da Sie angeben müssen, für welchen Befehl das Register verwendet werden soll p.
Ramon Marco L. Navarro

15
Auf die gleiche Weise "1 hält den letzten Löschvorgang", 2 hält den vorletzten Löschvorgang ", 3 hält den vorletzten Löschvorgang usw. bis" 9
James

330

Einer meiner Lieblingsteile über Register ist die Verwendung als Makros!

Angenommen, Sie haben es mit einer durch Tabulatoren getrennten Wertedatei als solcher zu tun:

ID  Df  %Dev    Lambda
1   0   0.000000    0.313682
2   1   0.023113    0.304332
3   1   0.044869    0.295261
4   1   0.065347    0.286460
5   1   0.084623    0.277922
6   1   0.102767    0.269638
7   1   0.119845    0.261601

Jetzt entscheiden Sie, dass Sie am Ende des Felds% Dev (beginnend mit der 2. Zeile) ein Prozentzeichen hinzufügen müssen. Wir werden ein einfaches Makro im (willkürlich ausgewählten) mRegister wie folgt erstellen:

  1. Drücken Sie :: qmUm die Aufnahme des Makros unter mRegister zu starten .

  2. EE: Gehen Sie zum Ende der 3. Spalte.

  3. a: Einfügemodus zum Anhängen an das Ende dieser Spalte.

  4. %: Geben Sie das Prozentzeichen ein, das wir hinzufügen möchten.

  5. <ESC>: Kehren Sie in den Befehlsmodus zurück.

  6. j0: Zum Anfang der nächsten Zeile gehen.

  7. q: Stoppen Sie die Aufnahme des Makros

Wir können jetzt einfach eingeben @m, um dieses Makro in der aktuellen Zeile auszuführen. Außerdem können wir tippen @@, 100@mum dies zu wiederholen oder dies 100 Mal zu tun! Das Leben sieht ziemlich gut aus.

An dieser Stelle sollten Sie sagen: " ABER WARTEN, WAS HAT DAS MIT REGISTERN ZU TUN ?"

Hervorragender Punkt. Lassen Sie uns untersuchen, was im Inhalt des mRegisters enthalten ist, indem Sie tippen "mp. Wir bekommen dann folgendes:

EEa%<ESC>j0

Auf den ersten Blick sieht es so aus, als hätten Sie versehentlich eine Binärdatei im Editor geöffnet, aber auf den zweiten Blick ist es die genaue Zeichenfolge in unserem Makro!

Sie sind eine neugierige Person, also lassen Sie uns etwas Interessantes tun und diese Textzeile bearbeiten, um eine !statt langweilige alte einzufügen %.

EEa!<ESC>j0

Dann ziehen wir dies ndurch Tippen in das Register B"nyE. Lassen Sie uns dann, nur zum Spaß, das nMakro in einer Zeile unserer Daten ausführen, indem Sie @n....

OMG, ES HINZUGEFÜGT A. !

Das Ausführen eines Makros entspricht im Wesentlichen dem Drücken der genauen Tastenfolge im Register dieses Makros. Wenn das kein cooler Registertrick ist, esse ich meinen Hut.


65
Das ist absolut wichtig. Ich habe bis jetzt nicht bemerkt, dass Register mit Makropuffern identisch sind. Dies bedeutet, dass Sie einfach alle Ihre Makros im Text speichern, sie ziehen und ausführen können. Ziemlich cool und ein bisschen komisch. Sehr Vim.
naught101

1
Es ist eine kleine redaktionelle Anmerkung, aber diese Kappe mit Fettdruck ... Es hätte behoben werden können. Es ist im Moment ziemlich widerlich.
Ashrasmun

1
Sie können +anstelle von verwenden j0, um zum ersten nicht leeren Zeichen in der nächsten Zeile zu wechseln.
Gokul

100

Andere nützliche Register:

"*oder "+- den Inhalt der Systemzwischenablage

"/ - letzter Suchbefehl

": - letzter Befehl.

Beachten Sie, dass Sie mit VIM-Makros diese bearbeiten können, da sie nur eine Liste der Tastenanschläge sind, die beim Aufzeichnen des Makros verwendet werden. Sie können also das Makro in eine Textdatei schreiben (mit "apMakro a schreiben ), bearbeiten und in ein Register mit laden "ay$. Gute Möglichkeit, nützliche Makros zu speichern.


6
Standard vim unter OSX enthält keine "* -Integration. Sie können eine Version von homebrew-alt installieren, die dies tut. Überprüfen Sie mit vim --version- -clipboardbedeutet, dass Sie es nicht haben, +clipboardbedeutet , dass Sie es tun.
Xavier Shay

15
In X11 "*und "+noch cooler: "+Fügt den zuletzt kopierten Text ctrl+c(Kopierpuffer) oder die von Ihnen verwendete Verknüpfung (oder right-click>copy) ein. "*Fügt den zuletzt mit der Maus hervorgehobenen Text ein (Auswahlpuffer). Wenn Sie also etwas kopieren ctrl+cund dann mit der Maus etwas anderes markieren, können Sie auswählen, welches eingefügt werden soll. Dies funktioniert nicht in Windows, wo diese beiden Register synonym sind.
naught101

1
Segne dich, ich habe gesucht "*und "+seit Jahren! Ich dachte, nur gvim hätte Zugriff auf die System-Zwischenablagen, aber anscheinend auch reguläres vim!
Tarrasch

@Tarrasch Wenn Sie die Konsole vim anstelle von gvim verwenden, werden Sie viel mehr Dinge entdecken. Ich glaube. besuche auch #vim auf freenode!
Trusktr

1
Wie aktivieren , wenn man muss -xterm_clipboardauf vim --version. Irgendein einfaches Paket zu installieren? (debian / apt-get). Vielen Dank.
Dr. Beco

77

Das Schwarzlochregister _ ist das /dev/nullder Register.

Ich verwende es in meinem vimrc, um das Löschen einzelner Zeichen zu ermöglichen, ohne das Standardregister zu aktualisieren:

noremap x "_x

und im visuellen Modus einzufügen, ohne das Standardregister zu aktualisieren:

vnoremap p "_dP

Das zweite Mapping ist ebenfalls sehr nützlich. Eine Erklärung finden Sie hier: marcorucci.com/blog/#visualModePaste
mrucci

21
Das Mapping für xwird weniger bequem, um Zeichen zu transponieren.
Skeept

Durch Drücken von x wird das letzte, was Sie gezogen haben, nicht gelöscht. Sie finden es in Register 0. Drücken Sie xa einige Male und dann "0p", um das Material einzufügen, das Sie gezogen haben.
trusktr

2
Um die obige Bemerkung von skeept zu erweitern: Mit dieser xZuordnung können Sie den xp"Befehl" nicht mehr ausführen , um den Strom mit dem nächsten Zeichen umzuschalten. Sehr nützlich für Tippfehlerbehebungen. Wir müssen auch Xpden Strom mit dem vorherigen Zeichen umschalten.
Daniel Andersson

56

Wenn Sie jemals den Inhalt des Registers in einen Ex-Modus-Befehl einfügen möchten, drücken Sie <C-r><registerletter>.

Warum würdest du das benutzen? Ich wollte eine längere Zeichenfolge suchen und ersetzen, also wählte ich sie im visuellen Modus aus, tippte den Such- / Ersetzungsausdruck ein :%s/[PASTE YANKED PHRASE]//gund fuhr an meinem Tag fort.

Wenn Sie nur ein einzelnes Wort im Ex-Modus einfügen möchten, können Sie sicherstellen, dass sich der Cursor darauf befindet, bevor Sie in den Ex-Modus wechseln, und dann <C-r><C-w>im Ex-Modus drücken, um das Wort einzufügen.


6
Das Einfügen von Text in die :Befehlszeile ist das Beste, was ich heute gelernt habe
Shahbaz

1
Sie können auch <CR> <registerletter> im Einfügemodus verwenden
Floegipoky

1
Ich schreibe gerne Find / Replace-Regexes zuerst durch Just /[write out your regex]<cr>und dann, um Just zu ersetzen s/<C-R>//replacement/. Auf diese Weise erhalten Sie Live-Feedback zu Ihrer Regex, bevor Sie den Ersatz ausführen.
GabeIsman

44

Ich denke, das geheime Guru-Register ist der Ausdruck = Register. Es kann für kreative Zuordnungen verwendet werden.

:inoremap  \d The current date <c-r>=system("date")<cr>

Sie können es wie oben in Verbindung mit Ihrem System verwenden oder Antworten von benutzerdefinierten VimL-Funktionen usw. erhalten.

oder einfach nur Ad-hoc-Sachen wie

<c-r>=35+7<cr>

3
Schauen Sie sich Derek Wyatts [Video zur Verwendung des Ausdrucksregisters] an ( derekwyatt.org/vim/vim-tutorial-videos/… )
Jeromy Anglim

1
Der Link von @JeromyAnglim ist jetzt hier: derekwyatt.org/vim/tutorials/advanced/#expression-register
Djizeus

39

Ein cooler Trick besteht darin "1p, das letzte Löschen / Ändern einzufügen (und dann .wiederholt die nachfolgenden Löschungen einzufügen. Mit anderen Worten, "1p...ist im Grunde gleichbedeutend mit "1p"2p"3p"4p.

Sie können dies verwenden, um eine Handvoll Zeilen in umgekehrter Reihenfolge anzuordnen: dddddddddd"1p....


Aha das ist fantastisch. Was ich aber wirklich will, ist das gleiche Verhalten für Amis
RyanM

18

Von der Hilfeseite von vim:

CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*
        Insert the contents of a numbered or named register.  Between
        typing CTRL-R and the second character '"' will be displayed
        <...snip...>
        Special registers:
            '"' the unnamed register, containing the text of
                the last delete or yank
            '%' the current file name
            '#' the alternate file name
            '*' the clipboard contents (X11: primary selection)
            '+' the clipboard contents
            '/' the last search pattern
            ':' the last command-line
            '-' the last small (less than a line) delete
            '.' the last inserted text
                            *c_CTRL-R_=*
            '=' the expression register: you are prompted to
                enter an expression (see |expression|)
                (doesn't work at the expression prompt; some
                things such as changing the buffer or current
                window are not allowed to avoid side effects)
                When the result is a |List| the items are used
                as lines.  They can have line breaks inside
                too.
                When the result is a Float it's automatically
                converted to a String.
        See |registers| about registers.  {not in Vi}
        <...snip...>

17
  • q5 zeichnet Änderungen in Register 5 auf (nächstes q stoppt die Aufzeichnung)
  • : reg zeigt alle Register und deren Inhalte an
  • @ 5 Register 5 Makro ausführen (aufgezeichnete Änderungen)

15
Ich mag es nicht, wenn die @ -Taste Makros startet (drei Tastenanschläge). Also habe ich F2 zugeordnet, um das in Register q gespeicherte Makro zu starten: nmap <F2> @q Ich verwende Register q, denn um dann ein Makro für die Wiedergabe von F2 zu speichern, drücke ich einfach qq. Schnelles Speichern und Wiedergeben von Makros.
Andrej Panjkov

16

Ich verwende das Standardregister, um in meinem VIM-Fenster nach Text zu suchen, ohne nach der Maus greifen zu müssen.

  1. Text ziehen
  2. :!grep "<CTRL-R>0"<CR>

12

Verwenden Sie Register in Befehlen mit @. Z.B:

echo @a
echo @0
echo @+

Setzen Sie sie in Befehl:

let @a = 'abc'

Jetzt "apwird einfügen abc.


8

Eine große Quelle der Verwirrung ist das Standardregister ". Es ist wichtig zu wissen, wie es funktioniert. Es ist viel besser, wenn das Standardregister meistens vermieden wird. Die Erklärung aus der Vim-Dokumentation:

Vim fills this register with text deleted with the "d", "c", "s", "x" commands
or copied with the yank "y" command, regardless of whether or not a specific
register was used (e.g.  "xdd).  This is like the unnamed register is pointing
to the last used register.

Das Standardregister ist also tatsächlich ein Zeiger auf das zuletzt verwendete Register. Wenn Sie etwas löschen oder ziehen, zeigt dieses Register auf andere Register. Sie können dies testen, indem Sie die Register überprüfen. Es gibt immer ein anderes Register, das genau dem Standardregister entspricht: das Yank-Register ( "0), das erste Löschregister ( ), das "1kleine Löschregister ( "-) oder ein anderes Register, das zum Löschen oder Ziehen verwendet wurde.

Die einzige Ausnahme ist das Schwarzlochregister. Vim Doc sagt:

An exception is the '_' register: "_dd does not store the deleted text in any
register.

Normalerweise sind Sie viel besser dran , indem Sie direkt: "0, "-und "1-"9Standard - Register oder den Namen Register.


8

Ein übersehenes Register ist das '.' Punktregister, das den zuletzt eingefügten Text enthält, unabhängig davon, wie er eingefügt wurde, z. B. ct] (change till]). Dann stellen Sie fest, dass Sie es an einer anderen Stelle einfügen müssen, aber die Punktwiederholungsmethode nicht verwenden können.

 :reg .
 :%s/fred/<C-R>./

7

Mein Lieblingsregister ist das ':'Register. Wenn @:ich im normalen Modus laufe, kann ich den zuvor ausgeführten ex-Befehl wiederholen.


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.